多次调用以使用不同的Rects无效

时间:2014-03-29 01:25:45

标签: android performance android-layout canvas invalidation

我正在扩展 root布局,因此我可以在其上drawBitmap个4个箭头,屏幕的每个角落都有一个箭头。这些箭头会偶尔同时闪烁。 enter image description here

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

我试图在每个rect的同一个函数中调用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优化管道?

问候!

1 个答案:

答案 0 :(得分:0)

在下一个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⇒blashc.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>