最近想自定义一个ViewGroup来实现一些动画,我目前是这样写的,就是用两个数组,一个数组来保存所有的子View
,还有一个数组来保存子view的一些位置参数,然后当动画开始的时候,就不停的改变参数数组里面的值,然后
再不停的invalidate。我设置的是5ms重绘一次。但是有的时候感觉稍微有点卡。
那些大神写的各种炫酷的动画控件,实际上也是不停的invalidate吗?但是我的为什么感觉很不流畅协调,是不是计算参数的操作,要放到 .so 里面去?
http://blog.csdn.net/yelbosh/article/details/7750500
你5ms明显设置的太频繁了,android屏幕16ms刷新一次,你的想法是对的,动画的原理就是一帧一帧的图像,但是android超过60帧每秒就没意义了,你想做动画,去找找Animation相关的东西, 和View一起会更好。
如果只是想给控件加动画,比如缩放、移动、旋转等用android自带的动画。
如果想通过画布来实现动画,耗时操作比如计算放在子线程里,onDraw方法只执行渲染操作
如果对流畅要求高可用用SurfaceView来画。
楼上说设置16ms应该是没用的。。。怀疑你是在主线程做了耗时操作导致卡的
我是这样的,当开启了动画之后,我会开启一个子线程,我在我自定义的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;
}
}
我不知道是不是插值器的原因,还是什么。