【问题标题】:Multiple calls to invalidate with different Rects使用不同的 Rect 多次调用无效
【发布时间】:2014-03-29 01:25:45
【问题描述】:

我正在扩展我的根布局,这样我就可以在上面drawBitmap 4 个箭头,一个在屏幕的每个角落。这些箭头偶尔会同时闪烁。

我这样做是为了优化以避免创建 4 个额外的视图,所以我想只有在这些区域独立无效时才有意义,因为如果整个布局无效并重新绘制,性能损失可能会大于节省,因为根布局包含沉重的东西。我想这是个好主意,但如果有人认为不是,请告诉我原因。

我尝试在同一个函数中对每个矩形调用 invalidate(Rect):

 public MyRootViewGroup extends FrameLayout {

     @Override
     public void draw (Canvas c) {
          super.draw(c); // Draw Viewgroup Children
          draw_arrows(); // Paint Arrows over children
          invalidate(rect_arrow_left);
          invalidate(rect_arrow_right);
          invalidate(rect_arrow_bottom);
          invalidate(rect_arrow_top);
     }

...但不幸的是,这种方法似乎只有一个区域无效。我需要使整个布局无效才能使其正常工作。

问题如果此 FrameLayout 包含其他子项(在 super.draw() 中绘制)但它们没有改变,我对 invalidate() 的调用会导致它们全部被重新绘制吗?或者Android在某种程度上很聪明地检测到尽管触发了完整的invalidate,但只有箭头区域发生了变化?我是在优化并保存 4 个视图,还是在破坏 Android 优化管道?

问候!

【问题讨论】:

    标签: android performance android-layout canvas invalidation


    【解决方案1】:

    在您的下一个 Activity onCreate() 方法中使用此代码

    ImageView imageView1 = (ImageView)findViewById(R.id.imageView1);
    ImageView imageView2 = (ImageView)findViewById(R.id.imageView2);
    ImageView imageView3 = (ImageView)findViewById(R.id.imageView3);
    ImageView imageView4 = (ImageView)findViewById(R.id.imageView4);
    
    Animation animBlank = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.blank);
    
    imageView1.startAnimation(animBlank);
    imageView2.startAnimation(animBlank);
    imageView3.startAnimation(animBlank);
    imageView4.startAnimation(animBlank);
    

    创建一个定义要执行的动画类型的 xml 文件。该文件应位于 res 目录下的 anim 文件夹下(res ⇒ anim ⇒ blink.xml)。如果您的 res 目录中没有 anim 文件夹,请创建一个。

    将以下代码放入blink.xml文件中

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha android:fromAlpha="0.0"
            android:toAlpha="1.0"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:duration="600"
            android:repeatMode="reverse"
            android:repeatCount="infinite"/>
    </set>
    

    【讨论】:

    • 感谢@Kush 的回答,但这实际上是我想要避免的。我正在手动绘制箭头以保存 4 个视图以提高性能:)
    猜你喜欢
    • 2019-05-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多