为什么我的动画会留下痕迹?

时间:2009-06-18 20:42:15

标签: android user-interface animation

我正在使用翻译动画从屏幕的左侧到右侧动画一个ImageView。 ImageView使用FrameLayout放置在我的主布局顶部的RelativeLayout内。

当我在模拟器上运行动画时,一切都运行良好,但是当我使用它在我的G1上运行时,它会留下视觉瑕疵,并影响其背后的文本组件的渲染。

这是一个性能问题吗?我太野心勃勃了,还是我能克服的错误?

如果是性能问题,我可以做些什么来改善事情?

8 个答案:

答案 0 :(得分:10)

我在2.3上也遇到了同样的问题。

使Animation.applyTransformation中的移动视图的容器(移动视图所在的布局)无效,为我修复了它。

请参阅:

Android - Artifacts using Animation

答案 1 :(得分:3)

我现在可能有点老了,但我刚发现了这个:

http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation+leaves+trails#e750730b9953d9a8

不确定你使用的是什么android版本,但它可能是android库中的一个bug!

看起来这就是问题所在! :)

... Dontcha只是喜欢它,而不是你的错! :d

答案 2 :(得分:2)

这是一个解决方法,我发现为我解决了这个问题:“一个简单的解决方法是在右侧/底部用一个小的(1个像素应该这样做)透明区域填充图像 - 这对它如何影响会看起来,但它会迫使一个区域的失效略大于实际图像,从而弥补了这个错误。“

http://code.google.com/p/android/issues/detail?id=22151

答案 3 :(得分:0)

在没有实际看到问题的情况下听起来好像你在写下一帧之前没有清除显示缓冲区。这对我来说听起来不像是性能问题。

您是否可以控制设备是否进行双重缓冲?

鉴于它可以在模拟器上运行,这可能会指向模拟器的问题或代码中没有出现在模拟器上的错误(我认为这在技术上是模拟器的问题!)而不是性能问题。

答案 4 :(得分:0)

我建议使用SurfaceView来制作动画。它是双缓冲的,所以如果你正确使用它应该消除闪烁。如果你想要一个例子,sdk中包含的LunarLander演示非常好。此外,如果您对代码有更具体的问题,请随便提出。

至于Android的一般性能,很有可能拥有相当高的帧速率,所以你不会期望太多。

答案 5 :(得分:0)

这也发生在我身上。我正在使用1.6使用Google API的模拟器,我刚刚确认它发生在运行FRF83的Nexus One上。这是相关的代码:

Animation a = new TranslateAnimation(0.0f, 0.0f, 100.0f, 0.0f);
a.setDuration(2000);
this.myView.startAnimation(a);

以下是实例化视图的相关代码:

View v = new View(this.getApplication());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 80);
v.setLayoutParams(params);
v.setBackgroundColor(0xFFFF0000);
//
LinearLayout layout = (LinearLayout)this.findViewById(R.id.theLayout);
layout.addView(v);
//
v.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
        // TODO Auto-generated method stub
        doAnimation();
    }
});
//
myView = v;

基本上,双缓冲等正在由操作系统处理,我根本无法控制它。

答案 6 :(得分:0)

我在Android 2.3上遇到了类似的问题,因此bug可能仍然存在。 我正在使用带有PNG的ImageView,它有一些透明的部分。使用TranslateAnimation进行动画处理时,此imageview正在离开路径。使用假的背景drawable图像视图elimanated轨迹(我使用drawable作为背景)。

答案 7 :(得分:0)

我在Jelly bean上想到了这一点,我在画廊视图中体验了这一点,同时执行了一些动画。它看起来更像是一个绘图问题而不是cpu ....

让你的活动实现AnimatorListener接口.....覆盖下面的方法并选择你想要重绘你的视图

 @Override
public void onAnimationEnd(Animator animation) {
    // TODO Auto-generated method stub

    mView.requestLayout();
    Toast.makeText(this, "animation ended", 0).show();
}

@Override
public void onAnimationRepeat(Animator animation) {
    // TODO Auto-generated method stub
    mView.requestLayout();
}

@Override
public void onAnimationStart(Animator animation) {
    // TODO Auto-generated method stub
    mView.requestLayout();
}