我有两个RelativeLayout视图。第一个有大约三个孩子。第二个视图只有第一个视图作为其子视图。我有两个动画, fadeIn 和 translateIn ,它们必须分别应用于视图 firstView 和 secondView 。以下代码正在运行。它们同时开始和结束,但它是滞后的。它不是那么顺利。有什么办法可以让他们同时顺利地运行它们吗?
以下是代码:
private static final int duration = 500;
protected static boolean ANIMATION_FINISHED;
protected static void onShowAnimation() {
int width;
ANIMATION_FINISHED = false;
width = getScreenWidth();
final AlphaAnimation fadeIn = new AlphaAnimation(0, 1);
final TranslateAnimation translateIn = new TranslateAnimation(-width, 0, 1, 1);
fadeIn.setDuration(duration);
translateIn.setDuration(duration);
firstView.startAnimation(translateIn);
secondView.startAnimation(fadeIn);
secondView.postDelayed(new Runnable() {
@Override
public void run() {
ANIMATION_FINISHED = true;
}
}, duration);
}
答案 0 :(得分:4)
要获得平滑的硬件加速动画,您应该使用android.animation
而不是android.view.animation
这里有完整的属性动画框架指南:https://developer.android.com/guide/topics/graphics/prop-animation.html
这里是它的基类: https://developer.android.com/reference/android/animation/package-summary.html
如果您需要在姜饼或更低的姜饼上定位设备,我建议您使用NineOldAndroid library自动处理设备的最佳框架。 (记住它在2.3上仍然是滞后的,但至少3.0+会很顺利)。
ps:您不应该使用postDelayed
来了解动画何时结束,而是使用Animation Listener
答案 1 :(得分:2)
经过大量搜索,我终于成功消除了动画过程中的滞后现象。
您需要设置
const
在开始动画之前和完成动画之后,您需要进行设置,
yourAnimatedView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
在动画过程中,您的视图可能会在每帧中重绘。如果使用视图图层,则不必重新绘制每一帧,而是将视图渲染到屏幕外缓冲区中一次,即可重复使用。
此外,硬件层缓存在GPU上,这使得动画过程中的某些操作快得多。简单的转换(平移,旋转,缩放和alpha)可以通过图层快速呈现。由于许多动画只是这些转换的组合,因此图层可以增强动画性能