这是一个奇怪的行为,我不了解自定义视图。我在框架布局中有两个视图,一个在另一个上面。观点很简单,我只是做了一个简短的测试
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()执行?
答案 0 :(得分:1)
我认为这应该回答你的问题:
http://developer.android.com/reference/android/view/ViewParent.html#requestLayout()
“当某些内容发生变化时调用,这会使该视图父项的子项布局失效。这将安排视图树的布局过程。”