android动画基础

本文全面解析了Android中的四种动画类型:TweenAnimation(变换动画)、FrameAnimation(逐帧动画)、LayoutAnimation(布局动画)和PropertyAnimation(属性动画)。深入探讨了各种动画的属性、用法及示例,帮助开发者掌握Android动画的运用。
摘要由CSDN通过智能技术生成

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值