2014-04-13 40 views
1

在这个例子中,我尝试使我的自定义视图只有一个矩形失效,但传递给onDraw的画布不被剪裁。输出始终显示剪辑边界包含整个画布。这是什么原因?为什么画布不在onDraw中?

public class ClippingActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new ClippingView(this)); 
    } 
} 

class ClippingView extends View { 

    Rect r = new Rect(); 

    public ClippingView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.getClipBounds(r); 
     Log.d("ClippingView","onDraw: " + r); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     invalidate(0,0,400,400); 
     return true; 
    } 
} 
+0

检查,如果画布硬件加速,如果是这样了解何时HWD ACC – pskink

+0

@psking剪辑:但我可以重现我的Nexus 5,其中canvas.isHardwareAccelerated()返回true,并且在我的模拟器(API V19此行为)canvas.isHardwareAccelerated()返回false。 – moonring

+0

尝试触摸视图并移动几次,您将看到正确的剪辑边界400x400 – pskink

回答

1

我刚刚发现了一个密切相关的问题:Partial invalidation in custom Android view with hardware acceleration

罗曼盖伊的答案是:

部分重绘工作得很好,只有屏幕的指定区域将得到重​​新绘制。但它不会做的是更改画布上的剪辑边界。所有的绘图操作都将被记录下来,但只有与脏区域相交的绘图操作才会被执行。