qq_35071078
下课睡觉
2017-04-01 03:54
采纳率: 45.7%
浏览 1.8k

android 动画的各种动画的原理就是不停的重绘吗?

最近想自定义一个ViewGroup来实现一些动画,我目前是这样写的,就是用两个数组,一个数组来保存所有的子View
,还有一个数组来保存子view的一些位置参数,然后当动画开始的时候,就不停的改变参数数组里面的值,然后
再不停的invalidate。我设置的是5ms重绘一次。但是有的时候感觉稍微有点卡。

那些大神写的各种炫酷的动画控件,实际上也是不停的invalidate吗?但是我的为什么感觉很不流畅协调,是不是计算参数的操作,要放到 .so 里面去?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • leiyaqiang
    Lyq0120 2017-04-01 11:58
    已采纳
    点赞 评论
  • morgerton
    白萝卜blb 2017-04-01 05:09

    你5ms明显设置的太频繁了,android屏幕16ms刷新一次,你的想法是对的,动画的原理就是一帧一帧的图像,但是android超过60帧每秒就没意义了,你想做动画,去找找Animation相关的东西, 和View一起会更好。

    点赞 评论
  • qq_32182845
    LinWill_ZXH 2017-04-01 07:38

    如果只是想给控件加动画,比如缩放、移动、旋转等用android自带的动画。
    如果想通过画布来实现动画,耗时操作比如计算放在子线程里,onDraw方法只执行渲染操作
    如果对流畅要求高可用用SurfaceView来画。
    楼上说设置16ms应该是没用的。。。怀疑你是在主线程做了耗时操作导致卡的

    点赞 评论
  • qq_35071078
    下课睡觉 2017-04-01 07:59

    我是这样的,当开启了动画之后,我会开启一个子线程,我在我自定义的ViewGroup里面new 了一个Handler,然后在这个子线程里面,每隔16ms通知handler来invalidate,我的计算操作是放在子线程里面的,
    public boolean startAnimator() {
    if (animate)
    return true;
    animate = true;
    new Thread() {
    @Override
    public void run() {
    super.run();
    while (currentTime < animateTime) {
    //数据操作
    if (inteporlate != null)
    carculateAngle(inteporlate.getInterpolation(currentTime / animateTime));
    else
    carculateAngle(getInteporlate(currentTime / animateTime));
    //
    handler.sendEmptyMessage(0);
    try {
    currentTime += 10;
    sleep(5);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    currentTime = 0;
    animate = false;
    }
    }.start();
    return false;
    }

        就这样的。我自己写了一个类似于Intepolater的类,
    
            /**
     * 默认的插值器
     * @param i
     * @return
     */
    private double getInteporlate(float i) {
        if (i < 0.4) {
            return 4;
        } else if (i < 0.5) {
            return 3;
        } else if (i < 0.6) {
            return 2.2;
        } else if (i < 0.7) {
            return 1.9;
        } else if (i < 0.8) {
            return 1.5;
        } else if (i < 0.85) {
            return 1;
        } else {
            return 0.8;
        }
    }
    
        我不知道是不是插值器的原因,还是什么。
    
    点赞 评论

相关推荐