美文网首页
Android 动画

Android 动画

作者: 孤独的根号十二 | 来源:发表于2019-01-16 12:38 被阅读82次

    补间动画(Tween Animation)

    a. 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)。
    b. 只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应。
    c. 组合使用步骤较复杂。
    d. View Animation 也是指此动画

    例如:

    Animation  scaleAnimation = new ScaleAnimation(1.0f, 0.97f, 1.0f, 0.97f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
              scaleAnimation.setDuration(80);
              scaleAnimation.setRepeatMode(Animation.REVERSE);
              scaleAnimation.setRepeatCount(1);
             view.startAnimation(scaleAnimation);
    

    帧动画(Frame Animation)

    a. 用于生成连续的Gif效果图。
    b. DrawableAnimation也是指此动画。

    AnimationDrawable animation = (AnimationDrawable) progressImg.getDrawable();
    animation.start();
    
        <ImageView
            android:id="@+id/imgLoading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:scaleType="fitCenter"
            android:src="@drawable/loading_bg"/>
    
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:drawable="@mipmap/loading_000" android:duration="50"/>
        <item android:drawable="@mipmap/loading_001" android:duration="50"/>
        <item android:drawable="@mipmap/loading_002" android:duration="50"/>
        <item android:drawable="@mipmap/loading_003" android:duration="50"/>
        <item android:drawable="@mipmap/loading_004" android:duration="50"/>
        <item android:drawable="@mipmap/loading_005" android:duration="50"/>
        <item android:drawable="@mipmap/loading_006" android:duration="50"/>
        <item android:drawable="@mipmap/loading_007" android:duration="50"/>
        <item android:drawable="@mipmap/loading_008" android:duration="50"/>
        <item android:drawable="@mipmap/loading_009" android:duration="50"/>
        <item android:drawable="@mipmap/loading_010" android:duration="50"/>
        <item android:drawable="@mipmap/loading_011" android:duration="50"/>
        <item android:drawable="@mipmap/loading_012" android:duration="50"/>
        <item android:drawable="@mipmap/loading_013" android:duration="50"/>
        <item android:drawable="@mipmap/loading_014" android:duration="50"/>
        <item android:drawable="@mipmap/loading_015" android:duration="50"/>
        <item android:drawable="@mipmap/loading_016" android:duration="50"/>
        <item android:drawable="@mipmap/loading_017" android:duration="50"/>
        <item android:drawable="@mipmap/loading_018" android:duration="50"/>
        <item android:drawable="@mipmap/loading_019" android:duration="50"/>
        <item android:drawable="@mipmap/loading_020" android:duration="50"/>
        <item android:drawable="@mipmap/loading_021" android:duration="50"/>
        <item android:drawable="@mipmap/loading_022" android:duration="50"/>
        <item android:drawable="@mipmap/loading_023" android:duration="50"/>
        <item android:drawable="@mipmap/loading_024" android:duration="50"/>
        <item android:drawable="@mipmap/loading_025" android:duration="50"/>
    </animation-list>
    

    属性动画(Property Animation)

    a. 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())。
    b. 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。
    c. Android3.0 (API11)及以后出现的功能

    常用API
    ObjectAnimator :对象动画执行类。
    PropertyValuesHolder : 属性存储器,为两个执行类提供更新多个属性的功能。
    AnimatorListener :动画执行监听,在动画开始、重复、结束、取消时进行回调。
    Keyframe :为 PropertyValuesHolder提供多个关键帧的操作值。
    AnimatorSet :一组动画的执行集合类:设置执行的先后顺序,时间等。
    TimeInterpolator :时间插值,用于控制动画执行过程。
    ValueAnimator :值动画执行类,常配合AnimatorUpdateListener使用。
    AnimatorUpdateListener :动画更新监听。
    TypeEvaluator :类型估值,用于设置复杂的动画操作属性的值。

    加速器.png

    1)translationX 和 translationY:这两个属性控制了View所处的位置,它们的值是由layout容器设置的,是相对于坐标原点(0,0左上角)的一个偏移量。
    2)rotation, rotationX 和 rotationY:控制View绕着轴点(pivotX和pivotY)旋转。
    3)scaleX 和 scaleY:控制View基于pivotX和pivotY的缩放。
    4)pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点。
    5)x 和 y:描述了view在其父容器中的最终位置,是左上角左标和偏移量(translationX,translationY)的和。
    6)aplha:透明度,1是完全不透明,0是完全透明。

        public void startAnimation(View v){
    //      Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
    ////        animation.start();
    //      bt.startAnimation(animation);
            
            //属性动画
    //      position += 100;
    //      v.setTranslationX(position);
    //      v.setAlpha((float)Math.random());
            
            //1.---------------------------------------
            /**
             * float... values: A set of values that the animation will animate between over time.
    
             */
    //      ObjectAnimator oa = ObjectAnimator.ofFloat(v, "translationX", 0f,300f);
    //      oa.setDuration(500);
    //      oa.start();
    //      ObjectAnimator oa = ObjectAnimator.ofFloat(v, "translationY", 0f,300f);
    //      oa.setDuration(500);
    //      oa.start();
    //      ObjectAnimator oa = ObjectAnimator.ofFloat(v, "rotationX", 0f,360f);
    //      oa.setDuration(500);
    //      oa.start();
            
            //2.----------------多个动画同时执行---办法1:设置动画监听,开始第一个动画同时开启其他动画-----------------
            //方法1:
    //      ObjectAnimator animator = ObjectAnimator.ofFloat(v, "haha", 0f, 100f);//没有这个属性的时候,就是valueanimator
    //      animator.setDuration(300);
    //      //设置动画监听
    //      animator.addUpdateListener(new AnimatorUpdateListener() {
    //          
    //          @Override
    //          public void onAnimationUpdate(ValueAnimator animation) {
    //              //动画在执行的过程当中,不断地调用此方法
    ////                animation.getAnimatedFraction()//百分比
    //              //得到duration时间内 values当中的某一个中间值。0f~100f
    //              float value = (float) animation.getAnimatedValue();//
    //              iv.setScaleX(0.5f+value/200);//0.5~1
    //              iv.setScaleY(0.5f+value/200);//0.5~1
    //          }
    //      });
    //      animator.start();
            
    //      animator.addListener(new AnimatorListener() {
    //          
    //          @Override
    //          public void onAnimationStart(Animator animation) {
    //              // TODO Auto-generated method stub
    //              
    //          }
    //          
    //          @Override
    //          public void onAnimationRepeat(Animator animation) {
    //              // TODO Auto-generated method stub
    //              
    //          }
    //          
    //          @Override
    //          public void onAnimationEnd(Animator animation) {
    //              // TODO Auto-generated method stub
    //              
    //          }
    //          
    //          @Override
    //          public void onAnimationCancel(Animator animation) {
    //              // TODO Auto-generated method stub
    //              
    //          }
    //      });
            
            //2)方法2:用ValueAnimator
    //      ValueAnimator animator = ValueAnimator.ofFloat(0f,200f);
    //      animator.setDuration(200);
    //      animator.addUpdateListener(new AnimatorUpdateListener() {
    //          
    //          @Override
    //          public void onAnimationUpdate(ValueAnimator animation) {
    ////                //动画在执行的过程当中,不断地调用此方法
    //////          animation.getAnimatedFraction()//百分比
    ////            //得到duration时间内 values当中的某一个中间值。0f~100f
    //              float value = (float) animation.getAnimatedValue();//
    //              iv.setScaleX(0.5f+value/200);//0.5~1
    //              iv.setScaleY(0.5f+value/200);//0.5~1
    //          }
    //      });
    //      animator.start();
            //3)方法3
            //float... values:代表关键帧的值
    //      PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("alpha", 1f,0.7f,1f);
    //      PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 1f,0.7f,1f);
    //      PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 1f,0.7f,1f);
    ////        PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("translationX", 0f,300f);
    //      
    //      ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv, holder1,holder2,holder3);
    //      animator.setDuration(1000);
    //      animator.addUpdateListener(new AnimatorUpdateListener() {
    //          
    //          @Override
    //          public void onAnimationUpdate(ValueAnimator animation) {
    //              // TODO Auto-generated method stub
    //              float animatedValue = (float) animation.getAnimatedValue();
    //              float animatedFraction = animation.getAnimatedFraction();
    //              long playTime = animation.getCurrentPlayTime();
    //              
    //              System.out.println("animatedValue:"+animatedValue+",  playTime:"+playTime);
    //          }
    //      });
    //      animator.start();
            //4)方法4:-----------------动画集合--------------------
    //      ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv,"alpha", 1f,0.7f,1f);
    //      ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv,"scaleX", 1f,0.7f,1f);
    //      ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv,"scaleY", 1f,0.7f,1f);
    //      
    //      AnimatorSet animatorSet = new AnimatorSet();
    //      animatorSet.setDuration(500);
    ////        animatorSet.play(anim);//执行当个动画
    ////        animatorSet.playTogether(animator1,animator2,animator3);//同时执行
    //      animatorSet.playSequentially(animator1,animator2,animator3);//依次执行动画
    //      animatorSet.start();
            
            //4.-------------------案例:实现抛物线效果--------------------------
    //      /**
    //       * x:匀速
    //       * y:加速度   y=1/2*g*t*t
    //       * 使用估值器最好实现。
    //       */
    //      ValueAnimator valueAnimator = new ValueAnimator();
    //      valueAnimator.setDuration(4000);
    //      valueAnimator.setFloatValues(values)
    //      valueAnimator.setObjectValues(new PointF(0, 0));
    //      //估值器---定义计算规则
    //      valueAnimator.setEvaluator(new TypeEvaluator<PointF>(){
    //          @Override
    //          public PointF evaluate(float fraction, PointF startValue,
    //                  PointF endValue) {
    //              //拿到每一个时间点的坐标
    //              //x=v*t (s秒)
    //              PointF pointF = new PointF();
    //              pointF.x = 100f*(fraction*4);//初始速度*(执行的百分比*4)
    ////                pointF.y = 0.5f*9.8f*(fraction*4)*(fraction*4);
    //              pointF.y = 0.5f*150f*(fraction*4)*(fraction*4);
    //              return pointF;
    //          }
    //      });
    //      
    //      valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
    //          
    //          @Override
    //          public void onAnimationUpdate(ValueAnimator animation) {
    //              //得到此时间点的坐标
    //              PointF pointF = (PointF) animation.getAnimatedValue();
    //              
    //              iv.setX(pointF.x);
    //              iv.setY(pointF.y);
    //          }
    //      });
    //      valueAnimator.start();
            
            
            ObjectAnimator oa = ObjectAnimator.ofFloat(v, "translationY", 0f,1100f);
            oa.setDuration(500);
            //设置加速器---
    //      oa.setInterpolator(new AccelerateInterpolator(5));
    //      oa.setInterpolator(new AccelerateDecelerateInterpolator());
    //      oa.setInterpolator(new AnticipateInterpolator(8));
    //      oa.setInterpolator(new OvershootInterpolator());
    //      oa.setInterpolator(new CycleInterpolator(4));
            oa.setInterpolator(new BounceInterpolator());
            
            oa.start();
    
    AnimatorSet set = new AnimatorSet();
            set.playTogether(firstRotationAnim,firstAlphaAnim,firstScaleXAnim,firstScaleYAnim,firstResumeRotationAnim,firstTranslationAnim,secondeTranslationAnim);
    set.start();
        }
    
    

    其他动画

    1.Touch Feedback(触摸反馈)

    例子:水波纹效果
    水波纹效果是5.0+自带的。
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:text="@string/hello_world" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:background="?attr/selectableItemBackground"
        android:text="@string/hello_world" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:background="?attr/selectableItemBackgroundBorderless"//没有边界,圆形
        android:text="@string/hello_world" />
    
    可以修改背景颜色和水波纹的颜色:
     <item name="colorControlHighlight">@color/colorPrimary_pink</item>
        <item name="colorButtonNormal">@color/material_blue_grey_800</item>
    
    最好使用AppcompatActivity
    

    2.Reveal Effect(揭露效果)

    例子:Activity的揭露出现的效果。
    ViewAnimationUtil工具类
    
    //圆形水波纹揭露效果
    ViewAnimationUtils.createCircularReveal(
            view, //作用在哪个View上面
            centerX, centerY, //扩散的中心点
            startRadius, //开始扩散初始半径
            endRadius)//扩散结束半径
    
                Animator animator = ViewAnimationUtils.createCircularReveal(bt2, 0, 0, 0, 
               (float)Math.hypot(bt2.getWidth(), bt2.getHeight()));
                animator.setDuration(1000);
                animator.setInterpolator(new AccelerateInterpolator());
                animator.start();
    

    3.Activity转场动画效果

    相关文章

      网友评论

          本文标题:Android 动画

          本文链接:https://www.haomeiwen.com/subject/svoydqtx.html