一、Fagment入门
// 1.得到碎片管理者
FragmentManager manager = getFragmentManager();
// 2.打开数据库事务
FragmentTransaction tr = manager.beginTransaction();
// 构建碎片的对象
SaveFragment fragment = new SaveFragment();
// 替换公共的空间,显示对应的碎片
tr.replace(R.id.container, fragment);
// 提交事务
tr.commit();
注:打开事物和提交事务必须是打开一次提交一次,来满足事物的特性。
二、Fragment与Activity之间的通讯
怎样拿到Activity中EditView输入框中的数据,并在Fragment中显示,代码如下:
public class SoundFragment extends Fragment {
//使用这个方法来显示该碎片到底展示什么UI布局,有一点类似activity里面的onCreate方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//让当前碎片显示sound界面
View view = inflater.inflate(R.layout.sound, null);
view.findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText et = (EditText) getActivity().findViewById(R.id.et);
//getActivity() 这个方法就是获取到了fragment寄存在哪一个activity上面的对象。
Toast.makeText(getActivity(), "按钮被点击了。。"+et.getText().toString(), 0).show();
}
});
return view ;
}
三、fragment的生命周期
与activity基本类似
onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy().
一旦这个碎片被其他碎片替换显示了,那么原来的碎片将要被销毁。
四、fragment向下兼容
修改导包问题,android.app.x ----> android.support.v4.x
activity要修改继承关系, activity-----fragmentActivity
修改方法 FragmentManager manager = getSupportFragmentManager();
五、View动画
public class MainActivity extends Activity {
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
}
public void translate(View v) {
// 定义平移动画
/*
* TranslateAnimation anim = new TranslateAnimation( 0, 100, 0, 100);
*/
// Animation.ABSOLUTE 指的就是后面的x或者y的数值是什么类型----绝对值像素点
// Animation.RELATIVE_TO_SELF 相对于自己的宽高多少倍,后面的数值指的是倍数
// Animation.RELATIVE_TO_PARENT 屏幕的宽高倍数
TranslateAnimation anim = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT,
0.5f, Animation.RELATIVE_TO_PARENT, 0,
Animation.RELATIVE_TO_PARENT, 0.5f);
// 播放的次数
anim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
anim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
anim.setDuration(2000);
// 让这个控件播放指定的动画
iv.startAnimation(anim);
}
//旋转动画
public void rotate(View v) {
RotateAnimation anim = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
// 播放的次数
anim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
anim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
anim.setDuration(2000);
// 让这个控件播放指定的动画
iv.startAnimation(anim);
}
public void scale(View v) {
// 如果后面的数字比前面大,那么代表的是放大,否则是缩小
ScaleAnimation anim = new ScaleAnimation(3, 1, 3, 1,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
// 播放的次数
anim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
anim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
anim.setDuration(2000);
// 让这个控件播放指定的动画
iv.startAnimation(anim);
}
public void alpha(View v) {
// 从半透明状态到不透明状态,注意: 0.0 - 1.0 区间
AlphaAnimation anim = new AlphaAnimation(0.2f, 1.0f);
// 播放的次数
anim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
anim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
anim.setDuration(4000);
// 让这个控件播放指定的动画
iv.startAnimation(anim);
}
public void set(View v) {
// 这是动画的集合 true -- 集合中的子动画使用的将是集合的插入器Interpolator,
//false -- 子动画自己使用 自己的插入器Interpolator
AnimationSet set = new AnimationSet(false);
TranslateAnimation anim = new TranslateAnimation(
Animation.RELATIVE_TO_PARENT, 0,
Animation.RELATIVE_TO_PARENT,
0.5f,
Animation.RELATIVE_TO_PARENT, 0,
Animation.RELATIVE_TO_PARENT, 0.5f);
// 播放的次数
anim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
anim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
anim.setDuration(2000);
/*RotateAnimation ranim = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
// 播放的次数
ranim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
ranim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
ranim.setDuration(2000);*/
AlphaAnimation aanim = new AlphaAnimation(0.2f, 1.0f);
// 播放的次数
aanim.setRepeatCount(Animation.INFINITE);
// 播放完毕之后,倒着播放
aanim.setRepeatMode(Animation.REVERSE);
// 设置播放时间
aanim.setDuration(2000);
//把动画加入到集合中。
set.addAnimation(anim);
set.addAnimation(aanim);
//让控件播放集合中的动画
iv.startAnimation(set);
}
六、View动画在Xml中
首先要在res下面创建anim文件夹,将创建的xml文件放在其中
在xml文件中的代码:
<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="50%p"
android:fromYDelta="0"
android:toYDelta="50%p"
android:duration="2000"
android:repeatCount="infinite"
android:repeatMode="reverse">
<!--
如果写的是数字代表的是绝对值的移动
百分比代表的是自己的倍数。
百分比后面跟上p,代表的是移动父元素的倍数
-->
</translate>
在类中方的代码:
public void translate(View v) {
Animation anim= AnimationUtils.loadAnimation(this, R.anim.translate_demo);
iv.startAnimation(anim);
}
注:view动画中的空间的位置并没有改变,只是图片在变化,他摆放在那里,就还在那个位置。
七、属性动画
public class MainActivity extends Activity {
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "红心被点击了。", 0).show();
}
});
}
public void translate(View v) {
// 使用ObejctAnimator去创建属性动画
// 参数一:让谁播放这个动画 - 让iv播放这个动画
// 参数二:当前动画是什么类型,写上属性的名字即可。
//参数三:移动的数值。可以是float数组或者直接是数字10,20,30...
ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "translationX", 10,20, 100);
anim.setDuration(2000);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.setRepeatMode(ObjectAnimator.REVERSE);
// 让属性动画播放起来
anim.start();
}
public void rotate(View v) {
// 使用ObejctAnimator去创建属性动画
// 参数一:让谁播放这个动画 - 让iv播放这个动画
// 参数二:当前动画是什么类型,写上属性的名字即可。
ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "rotationY", 0, 360);
anim.setDuration(2000);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.setRepeatMode(ObjectAnimator.REVERSE);
// 让属性动画播放起来
anim.start();
}
public void scale(View v) {
// 使用ObejctAnimator去创建属性动画
// 参数一:让谁播放这个动画 - 让iv播放这个动画
// 参数二:当前动画是什么类型,写上属性的名字即可。
ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "scaleY", 1, 3);
anim.setDuration(2000);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.setRepeatMode(ObjectAnimator.REVERSE);
// 让属性动画播放起来
anim.start();
}
public void alpha(View v) {
// 使用ObejctAnimator去创建属性动画
// 参数一:让谁播放这个动画 - 让iv播放这个动画
// 参数二:当前动画是什么类型,写上属性的名字即可。
ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "alpha", 0.2f, 1);
anim.setDuration(2000);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.setRepeatMode(ObjectAnimator.REVERSE);
// 让属性动画播放起来
anim.start();
}
public void set(View v) {
AnimatorSet set = new AnimatorSet();
ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "translationX", 10, 100);
anim.setDuration(2000);
/*anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.setRepeatMode(ObjectAnimator.REVERSE);*/
ObjectAnimator anim2 = ObjectAnimator.ofFloat(iv, "translationY",10, 100);
anim2.setDuration(2000);
/*anim2.setRepeatCount(ObjectAnimator.INFINITE);
anim2.setRepeatMode(ObjectAnimator.REVERSE);*/
//指定这个集合里面有几个动画 ,使用的是一起播放的设置
//set.playTogether(anim , anim2);
//按照顺序播放 ,先播放第一个动画,然后播放第二个动画
set.playSequentially(anim,anim2);
//让集合动画播放起来
set.start();
}
}
注:属性动画中的条目的位置也发生了变化。
八、属性动画在xml中
在条目中的代码
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="100"
android:propertyName="translationX"
android:duration="2000"
android:repeatCount="infinite"
android:repeatMode="reverse">
</objectAnimator>
在mainactivity中的代码
public void translate(View v) {
Animator animation = AnimatorInflater.loadAnimator(this, R.animator.translatex_demo);
//让控件去播放这个动画
animation.setTarget(iv);
animation.start();
}
网友评论