2009-06-18 58 views
9

我使用翻译动画从屏幕的左侧到右侧设置了一个ImageView动画。 ImageView放置在使用FrameLayout的主布局顶部的RelativeLayout中。为什么我的动画会留下痕迹?

当我运行在模拟器上一切的动画效果很好,但是当我用我的G1运行它背后留下的视觉假象,并影响其后面的文本组件的渲染。

这是一个性能问题,我本身过于雄心勃勃或者是我可以克服的错误吗?

如果它是一个性能问题是有什么我可以做些什么来改善的事情?

+4

哪一个你能提供任何代码给我们看吗?你是否在做任何其他的框架布局?您使用的是什么版本的SDK(即蛋糕?) – jamesh 2009-06-22 22:12:09

+0

这是您正在使用的课程吗? http://developer.android.com/reference/android/view/animation/TranslateAnimation.html – 2009-06-29 16:51:04

+0

好问题,我也有这个问题,但它也显示在模拟器!当我在FrameLayout中创建视图的3D旋转动画时,它可能是FrameLayout的函数/错误?我要看看我是否可以使用表面视图... – Andy 2010-06-29 14:35:32

回答

3

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

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

不知道你使用的是什么Android版本,但它可能是在Android库中的一个错误!

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

... Dontcha只是喜欢它,当它不是你的错! :D

+0

几乎可以肯定。不再有代码重新测试,但:(我放弃了那个动画,并与一个不会留下踪迹 – 2010-07-13 00:11:26

0

没有实际看到的问题是,听起来像你不是写下一帧之前清除显示缓冲区。这听起来不像是一个性能问题。

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

鉴于它可以在仿真器上工作,这可能会指向仿真器的问题或者代码中没有出现在仿真器上的错误(我认为这在技术上与仿真器有关),而是而不是性能问题。

+0

我正在使用Android框架提供的动画框架,因此我无法控制双缓冲区或显示缓冲区。 对我来说,它看起来像一个错误。如果这是一个性能问题,因为我的要求太过雄心勃勃,那么动画应该是不稳定/帧率低。它表现得相当好,它只是让它看起来像背后的图像片段。他们清理速度很快,但看起来不太好。 – 2009-06-18 21:11:45

+0

@Tom - 我想我已经达到了我能建议的范围。我并不真正了解您正在开发的环境 - 但我确实知道动画已经与实时3D图形结合使用了很多年,而且我遇到了类似的探测问题。但正如我所说,没有真正看到发生了什么事情,很难诊断问题。 – ChrisF 2009-06-19 08:13:58

0

我会建议使用SurfaceView动画。它是双缓冲的,所以它应该消除闪烁,如果你正确使用它。如果你想要一个例子,SDK中包含的LunarLander演示很好地展示了这一点。另外,如果你对代码有更具体的问题,可以去问问。

至于一般的Android的表现,很可能有相当高的帧速率,这样你就不会期望太多。

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; 

所以基本上,双缓冲等,正在由操作系统来处理,我也没有对其进行控制在所有。

0

我在Android 2.3上有类似的问题,所以这个bug可能还是存在的。 我正在使用带有一些透明部分的PNG的ImageView。这个imageview在使用TranslateAnimation进行动画时留下了痕迹。为imageview使用假背景drawable(我使用drawable作为背景)。

10

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

对Animation.applyTransformation中的移动视图(移动视图所在的布局)的容器进行了无效化。

参见:

Android - Artifacts using Animation

+0

感谢您报告替代解决方案这个老问题Matthijs ... – 2012-03-10 02:01:22

+0

你刚刚救了我的一天。谢谢:) – 2013-12-16 15:19:42

2

这里有一个解决方法,我发现解决了这个对我来说:“一个简单的解决办法是垫一个小图像(1个像素应该这样做)的透明区域上右/底 - 这对它的外观没有任何影响,但是它会迫使一个比实际图像略大的区域失效,从而弥补错误。“

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

+0

迄今为止最简单的解决方案。谢谢! – 2012-04-19 20:26:06

+0

这一个作品。不知道为什么会出现这种情况,因为其中一位主要的Android开发人员写道,这已经是很久以前的事了:http://groups.google.com/group/android-developers/browse_thread/thread/5481450f8b71a26c/e750730b9953d9a8?lnk=gst&q=animation +叶+小径#e750730b9953d9a8 – 2012-05-19 22:31:38

+0

非常有趣!我猜测这是因为从实际到密度独立像素的转换。无形之戒占据了一些不快。 – 2015-12-02 17:44:42

0

我想通了这一点上果冻豆我是在一个画廊视图遇到此同时执行一些动画。它看起来更像是一个绘图问题不是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(); 
}