Android自定义View动画

运行效果:

Android自定义View动画_第1张图片

前言:

Android系统提供了两个动画框架:属性动画框架和View动画框架。 两个动画框架都是可行的选项,但是属性动画框架通常是首选的使用方法,因为它更灵活,并提供更多的功能。 除了这两个框架,还可以使用Drawable动画(即逐帧动画,AnimationDrawable),它允许你加载Drawable资源并逐帧地显示它们。

View动画框架中一共提供了AlphaAnimation(透明度动画)、RotateAnimation(旋转动画)、ScaleAnimation(缩放动画)、TranslateAnimation(平移动画)四种类型的补间动画;并且View动画框架还提供了动画集合类(AnimationSet),通过动画集合类(AnimationSet)可以将多个补间动画以组合的形式显示出来;当然如果对提供的类型动画不满意,可以自定义动画!

View布局:




    

Control层:

 MainActivity.java:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnAlpha,btnRotate,btnTranslate,btnScale,btnBlend,btnListener,btnCustom;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    public void initView(){
        btnAlpha=findViewById(R.id.btnAlpha);
        btnRotate=findViewById(R.id.btnRotate);
        btnTranslate=findViewById(R.id.btnTranslate);
        btnScale=findViewById(R.id.btnScale);
        btnBlend=findViewById(R.id.btnBlend);
        btnListener=findViewById(R.id.btnListener);
        btnCustom=findViewById(R.id.btnCustom);

        btnAlpha.setOnClickListener(this);
        btnRotate.setOnClickListener(this);
        btnTranslate.setOnClickListener(this);
        btnScale.setOnClickListener(this);
        btnBlend.setOnClickListener(this);
        btnListener.setOnClickListener(this);
        btnCustom.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnAlpha:
                 //方法一:Java程序配置动画
//               AlphaAnimation animation=new AlphaAnimation(0,1);//透明度从零到一
//               animation.setDuration(2000);//动画时长
//               v.startAnimation(animation);//按钮开启动画

                 //方法二:使用布局文件来配置动画
                 v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha));
                 break;
            case R.id.btnRotate:
                //方法一:Java程序配置动画
//               RotateAnimation rotateAnimation=new RotateAnimation(0,360,
//                        Animation.RELATIVE_TO_SELF,0.5f,
//                        Animation.RELATIVE_TO_SELF,0.5f);//零到360度,旋转点为控件相对中心
//               rotateAnimation.setDuration(2000);
//               v.startAnimation(rotateAnimation);
                //方法二:使用布局文件来配置动画
                 v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate));
                 break;
            case R.id.btnTranslate:
//                TranslateAnimation translateAnimation=new TranslateAnimation(0,200,
//                        0,200);//从原位置向x、y方向各移动200像素
//                translateAnimation.setDuration(2000);
//                v.startAnimation(translateAnimation);
                v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.translate));
                break;
            case R.id.btnScale:
//                ScaleAnimation scaleAnimation=new ScaleAnimation(0,1,0,1,
//                        Animation.RELATIVE_TO_SELF,0.5f,
//                        Animation.RELATIVE_TO_SELF,0.5f);//缩放从零到一,缩放点相对于自身中心
//                scaleAnimation.setDuration(2000);
//                v.startAnimation(scaleAnimation);
                v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale));
                break;
            case R.id.btnBlend:
                //动画集合类AnimationSet
//                AnimationSet animationSet=new AnimationSet(true);//各动画共用动画补间
//                补间动画是一种设定动画开始状态、结束状态,其中间的变化由系统计算补充。
//                animationSet.setDuration(2000);
//
//                RotateAnimation rotateAnimation=new RotateAnimation(0,360,
//                        Animation.RELATIVE_TO_SELF,0.5f,
//                        Animation.RELATIVE_TO_SELF,0.5f);
//                rotateAnimation.setDuration(1000);
//                animationSet.addAnimation(rotateAnimation);//集合中添加子动画
//                ScaleAnimation scaleAnimation=new ScaleAnimation(0,1,0,1,
//                        Animation.RELATIVE_TO_SELF,0.5f,
//                        Animation.RELATIVE_TO_SELF,0.5f);
//                scaleAnimation.setDuration(1000);
//                animationSet.addAnimation(scaleAnimation);
//                v.startAnimation(animationSet);
                v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.blend));
                break;
            case R.id.btnListener:
                Animation animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.blend);
                animation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        Toast.makeText(MainActivity.this,"动画开始!",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        Toast.makeText(MainActivity.this,"动画结束!",Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                        //动画重复执行
                    }
                });
                v.startAnimation(animation);
                break;
            case R.id.btnCustom:
                CustomAnimation customAnimation=new CustomAnimation();
                v.startAnimation(customAnimation);
        }
    }
}

 CustomAnimation.java:

public class CustomAnimation extends Animation {

    //动画初始化,用来设置动画的基本属性
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(2000);//设置动画时长
    }

    //该方法用来实现动画,
    // interpolatedTime表示插值器的时间因子,补间时间,取值范围0-1
    // t一个矩阵的封装类,实现动画就是利用矩阵来计算的
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        //t.setAlpha(interpolatedTime);//透明效果

        //Matrix可将一个点映射到另一个点,矩阵中包含了处理缩放、透视以及平移的区域,从而可用于控制实现平移、缩放、旋转等动画效果。
        //t.getMatrix().setTranslate(interpolatedTime*200,interpolatedTime*200);//平移效果

        t.getMatrix().setTranslate((float) (Math.sin(interpolatedTime*20)*50),0);//使用周期函数实现摇头效果
    }
}

资源配置文件:

alpha.xml



rotate.xml




scale.xml




translate.xml




blend.xml




    
    
    
    

技术博客:

Android Animation运行原理详解:https://www.jianshu.com/p/fcd9c7e9937e

Android自定义View--Matrix Camera:http://www.gcssloop.com/customview/matrix-3d-camera

Android中的View动画和属性动画:https://www.jianshu.com/p/b117c974deaf

Android 属性动画(Property Animation) 完全解析 (上):https://blog.csdn.net/lmj623565791/article/details/38067475

你可能感兴趣的:(Android,Native,基础)