三. 总结

自定义视图实现动画的两种思路

方式一. 不使用属性动画。

  1. 如果自定视图中有动画效果,一般涉及到两个变量一个渐变量(如BeatNumber中的textYOffset,ThunView中的mNowSweepAngle),和一个动画完成程度变量。通过改变渐变量的值和对渐变量临界值的判断来驱动动画和停止动画。
  2. 动画的实现思路一般是

先给出“绘制内容代码”,然后再根据如下的模板代码实现

//根据参数绘制
绘制内容代码

//判断
if(参数满足条件){
    invalidate();//重绘
}else{
    根据需要重置参数
}

方式二.使用属性动画

1.onDraw中根据一个“渐变量/完成度变量”来绘制内容,属性动画驱动这个变量的改变来实现动画
如下,实现了一个简单的半径不断改变的圆的动画效果。

public class MyCircleView  extends View{

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int cx = getMeasuredWidth() / 2;
        int cy = getMeasuredHeight() / 2;
        canvas.drawCircle(cx, cy,getMeasuredWidth()/2*mPercent,mPaint);

    }



    public float getPercent() {
        return mPercent;
    }

    public void setPercent(float percent) {
        this.mPercent = percent;
        postInvalidate();
    }
    
     private void useObjectAnimatorCircle(MyCircleView myCircleView) {
        ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(myCircleView,"percent",0.0f,1f);
        objectAnimator.setDuration(2000);
        objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
        objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
        objectAnimator.start();
    }
}

总结

方式1 是通过在onDraw中改变“渐变量/完成度变量” 来驱动动画
方式2 是通过属性动画来改变“渐变量/完成度变量”
个人认为
方式1适合较为复杂的动画,
方式2适合较为简单的动画(而且属性动画通过插值器可以产生一些很有规律的数值)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,020评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,198评论 4 61
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 3,918评论 1 22
  • 孤独的人往往不会再透露自己的不堪,伤心人往往会用微笑来掩盖自己的悲痛,因为他们不愿意再经受一样的苦,也不愿意让别人...
    上邪_阅读 428评论 1 0
  • 有些照片和故事又旧又老。但爱,永不老。 最近读了《社会动物》这本书。有这样一句话,觉得很有触动。 诗人...
    慧甜阅读 329评论 0 1