【问题标题】:Why is my animation leaving a trail?为什么我的动画会留下痕迹?
【发布时间】:2010-11-04 03:28:46
【问题描述】:

我正在使用平移动画从屏幕的左到右为 ImageView 设置动画。 ImageView 使用 FrameLayout 放置在我的主布局顶部的 RelativeLayout 内。

当我在模拟器上运行动画时,一切正常,但是当我在 G1 上运行它时,它会留下视觉伪影并影响其背后的文本组件的渲染。

这是一个性能问题,我过于雄心勃勃,还是我可以克服的错误?

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

【问题讨论】:

  • 您能提供任何代码供我们查看吗?你还在用框架布局做其他事情吗?您使用的是什么版本的 SDK(例如纸杯蛋糕?)
  • 好问题,我也遇到过这个问题,但它也显示在模拟器中!它发生在我在 FrameLayout 中为视图的 3D 旋转设置动画时,可能是 FrameLayout 的功能/错误?我去看看能不能用表面视图……

标签: android user-interface animation


【解决方案1】:

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

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

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

【讨论】:

  • 我使用的是 Android 框架提供的动画框架,所以我无法控制双缓冲或显示缓冲区。对我来说,它看起来像一个错误。如果这是一个性能问题,因为我的要求过于雄心勃勃,那么动画应该只是生涩/低帧率。它的表现相当不错,只是留下了看起来像图像的碎片。它们很快就被清理干净了,但看起来不太好。
  • @Tom - 我想我已经达到了我可以建议的极限。我真的不知道您正在开发的环境 - 但我知道动画已经使用实时 3D 图形多年,我也遇到过类似的声音问题。但正如我所说,如果没有真正看到发生了什么,就很难诊断出问题。
【解决方案2】:

我建议使用SurfaceView 制作动画。它是双缓冲的,因此如果使用得当,它应该可以消除闪烁。如果您想要一个示例,SDK 中包含的 LunarLander 演示很好地展示了这一点。此外,如果您对代码有更具体的问题,请提出来。

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

【讨论】:

    【解决方案3】:

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

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

    不确定您使用的是哪个安卓版本,但可能是安卓库中的错误!

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

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

    【讨论】:

    • 几乎可以肯定。不过,不再需要重新测试的代码 :( 我放弃了那个动画,选择了一个不会留下痕迹的动画。
    【解决方案4】:

    这也发生在我身上。我正在使用 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;
    

    所以基本上,双缓冲等是由操作系统处理的,我根本无法控制它。

    【讨论】:

      【解决方案5】:

      我在 Android 2.3 上遇到过类似的问题,因此该错误可能仍然存在。 我正在使用带有一些透明部分的 PNG 的 ImageView。当使用 TranslateAnimation 进行动画处理时,此图像视图会留下痕迹。为 imageview 使用一个可绘制的假背景消除了踪迹(我使用了可绘制作为背景)。

      【讨论】:

        【解决方案6】:

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

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

        见:

        Android - Artifacts using Animation

        【讨论】:

        • 感谢您报告这个老问题的替代解决方案 Matthijs...
        • 你刚刚拯救了我的一天。谢谢你:)
        【解决方案7】:

        这是我发现的一种解决方法,它为我解决了这个问题:“一个简单的解决方法是在您的图像右侧/底部填充一个小的(1 像素应该可以做到)透明区域 - 这不会影响它的方式看起来,但它会强制使比实际图像稍大的区域失效,从而补偿错误。”

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

        【讨论】:

        • 迄今为止最简单的解决方案。谢谢!
        • 这个有效。不知道为什么会发生,因为主要的 android 开发人员之一写道它是很久以前修复的:groups.google.com/group/android-developers/browse_thread/thread/…
        • 非常有趣!我猜这是因为从实际像素到密度独立像素的转换。无形之环造成了一些马虎。
        【解决方案8】:

        我在 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();
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 1970-01-01
          • 2019-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-14
          • 2019-04-16
          • 2020-03-04
          相关资源
          最近更新 更多