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

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

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

4个回答

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

qq_35071078
下课睡觉 你的意思就是我把时间间隔设置成16就行了吧。还有就是,我看有的动画用了native的方法,是不是它们把一些计算放到了c++里面去做了?
3 年多之前 回复

我是这样的,当开启了动画之后,我会开启一个子线程,我在我自定义的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;
    }
}

    我不知道是不是插值器的原因,还是什么。

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

qq_32182845
LinWill_ZXH invalidate方法开销很大的。view会把measure,layout这些都跑一遍。你可以看下SurfaceView
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问