Android onDraw()在所有视图上执行?

时间:2011-11-18 11:43:36

标签: android custom-view ondraw

这是一个奇怪的行为,我不了解自定义视图。我在框架布局中有两个视图,一个在另一个上面。观点很简单,我只是做了一个简短的测试

public class View1  extends View  {
....

    @Override
     public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){
            this.updateDrawings();
        }
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvas != null) 
        {
            Log.i("Test", "Draw View1");
        }
    }

    public void updateDrawings() {
        try {
            this.invalidate();
        }
        finally {
        }
    }
}

和View2

public class View2  extends View  {
....

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvas != null) 
        {
            Log.i("Test", "Draw View2");
        }
    }

    public void updateDrawings() {
        try {
            this.invalidate();
        }
        finally {
        }
    }
}

FrameLayout上包装好的东西

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="#ffffff">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1">

            <com.View2
                android:layout_centerInParent="true"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginBottom="5dip" />
        </LinearLayout>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1">

            <com.View1
                android:layout_centerInParent="true"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginBottom="5dip" />
        </LinearLayout>
</FrameLayout>

我的问题是:为什么当onTouch从View1执行时,两个视图的onDraw()方法都会执行?为什么不只是View1的?

稍后编辑 View2有一个要绘制的大图像,图像会根据一些保存的首选项进行旋转和缩放。通常,当我启动Activity时,View2.onDraw()负责旋转,转换和缩放Bitmap并在画布上绘制它。当用户触摸View1时,我只想执行View1.onDraw(),因为没有必要为每个用户交互反复重绘相同的背景图像。如何停止View2.onDraw()执行?

1 个答案:

答案 0 :(得分:1)

我认为这应该回答你的问题:

http://developer.android.com/reference/android/view/ViewParent.html#requestLayout()

“当某些内容发生变化时调用,这会使该视图父项的子项布局失效。这将安排视图树的布局过程。”