1. Tween Animation 变换动画
-
Alpha:渐变透明动画(0.0表示完全透明,1.0表示完全不透明)
(1)fromAlpha:动画起始时透明度
(2)toAlpha:动画终止时的透明度 -
Scale:渐变尺寸动画
(1)fromX,toX分别是起始和结束时x左边的伸缩尺寸
(2)pivotX.pivotY分别为伸缩动画相对于x,y坐标开始的位置
-
Translate:位置移动动画
(1)fromXDelta,toXDelta:分别是起始时x的坐标,结束时x的坐标
- Rotate:旋转动画
(1)fromDegress起始的角度,toDegress终止的角度
(2)pivotX.pivotY分别为伸缩动画相对于x,y坐标开始的位置
共同属性:
- Duration:持续时间
- fillAfter:设置为true,动画转化在动画结束后被应用
- fillBefore:设置为true,动画转化在动画开始前被应用
- interpolator:动画插入器(加速、减速插入器)
- repeatCount:重复次数
- repeatMode:顺序重复/倒序重复
- startOffset:动画之间的时间间隔
- AnimationUtils.load用于加载动画
(1)配置文件:res/anim——alpha、scale、translate、rotate
例子:
<set xmlns:android=" ">
<alpha
android:duration="1000"
android:fromAlpha="0.1"
android:toAlpha="1.0">
</alpha>
</set>
//加载配置文件
Animation scale=AnimationUtils.loadAnimation(TweenActivity.this,R.anim.scale_anim);
img.startAnimation(scale);
(2)java代码实现:AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation
//java动画创建
Animation alpha=new AlphaAnimation(0.1f,1.0f);//透明度10%-100%
alpha.setDuration(5000);
//开始播放
img.startAnimation(alpha);
.setAnimationListener(new AnimationListener(){…});//设置动画监听
2. Frame Animation 逐帧动画(一帧一帧连贯起来的动画)
drawable目录下xml文件:
使用animation-list标签来分组一个item标签集合
定义要显示的图片
指定显示它的时间
3. Layout Animation 布局动画
为ViewGroups添加动画,使用LayoutAnimationController(布局动画控制器)
LayoutAnimationController lac=new LayoutAnimationController (R.anim.zoom_in);
容器.setLayoutAnimation(lac)
容器.startLayoutAnimation();
4. Property Animation 属性动画
属性动画Animator与传统动画Animation
ObjectAnimator(作用某个控件的某个属性(有get,set的属性,比如translationX)):
imageView=(ImageView)findViewById(R.id.imageView);
ObjectAnimator.OfFloat(imagView,"translationX",0F,200F).setDuration(1000).start();
//PropertyValuesHolder p=PropertyVlauesHolder.OfFloat("translationX",0F,200F);
//ObjectAnimation.OfPropertyValuesHolder (imageView,p);
//也可以设置多个p,使得同时起作用
(1)传统Animation的位置移动仅仅是图像的移动,但是监听事件还是在图像原来地方监听
(2)属性动画Animation是图像和监听事件一起移动
属性动画集合:
ObjectAnimator animator1=ObjectAnimator.OfFloat(imagView,"rotation",0F,360F).setDuration(1000);
ObjectAnimator animator2=ObjectAnimator.OfFloat(imagView,"translationX",0F,200F).setDuration(1000);
ObjectAnimator animator3=ObjectAnimator.OfFloat(imagView,"translationY",0F,200F).setDuration(1000);
AnimatorSet set=new AnimationSet();
set.playTogether(animator1,animator2,animator3);
set.setDuration(1000);
set.start();
属性动画设置监听事件:
//需要重写所有方法
animator.addListener(new Animator.AnimatorListener(){...................});
//只需要重写你想要的方法
animator.addListener(new AnimatorListenerAdapter(){...................});
ValueAnimator(数值发生器,并不能作用于任何一个属性):
ValueAnimator animator=ValueAnimator.ofInt(0,100);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
@Override
public void onAnimatonUpdate(ValueAnimator animation){
Integer value=(Integer)animation.getAnimatedValue();
}
});
案例:
实现点击绿色按钮弹出和回收。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<ImageView
android:id="@+id/iv_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/camera"/>
<ImageView
android:id="@+id/iv_music"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/music"/>
<ImageView
android:id="@+id/iv_place"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/place"/>
<ImageView
android:id="@+id/iv_sleep"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/sleep"/>
<ImageView
android:id="@+id/iv_thought"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/thought"/>
<ImageView
android:id="@+id/iv_with"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/with"/>
<ImageView
android:id="@+id/iv_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingTop="5dp"
android:src="@drawable/open"/>
</FrameLayout>
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private int[] res=new int[]{R.id.iv_open,R.id.iv_camera,R.id.iv_music,R.id.iv_place,R.id.iv_sleep,R.id.iv_thought,
R.id.iv_with};
private List<ImageView> imageViewList=new ArrayList<ImageView>();
private boolean flag=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
for(int i=0;i<res.length;i++){
ImageView imageView= (ImageView) findViewById(res[i]);
imageViewList.add(imageView);
imageView.setOnClickListener(this);
}
}
@Override
public void onClick(View v){
switch(v.getId()){
case R.id.iv_open:
if(flag){
startAnim();
}else{
closeAnim();
}
break;
default:
Toast.makeText(this,"click"+v.getId(),Toast.LENGTH_SHORT).show();
break;
}
}
private void closeAnim() {
for (int i = 1; i < res.length; i++) {
ObjectAnimator animator=ObjectAnimator.ofFloat(imageViewList.get(i),"translationY",i*150F,0F);
animator.setDuration(250);
animator.setInterpolator(new BounceInterpolator());
animator.setStartDelay(i*300);
animator.start();
}
flag=true;
}
private void startAnim() {
for (int i = 1; i <res.length ; i++) {
ObjectAnimator animator=ObjectAnimator.ofFloat(imageViewList.get(i),"translationY",0F,i*150F);
animator.setInterpolator(new BounceInterpolator());
animator.setDuration(250);
animator.setStartDelay(300*i);
animator.start();
}
flag=false;
}
}