使用clipRect – 解释

public class POCII extends Activity { myView mv = new myView(this); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(mv); } } class myView extends View { public myView(Context context) { super(context); } @Override public void onDraw(Canvas canvas) { Paint paint = new Paint(); canvas.drawRect(0,0,100,100, paint); canvas.clipRect(0,0,50,50); } } 

我的问题是,不应该上面的代码绘制一个矩形,然后裁剪左上部分? 矩形不会被裁剪。

请解释一下clipRect的作用。 它究竟是什么裁剪? 考虑到坐标,它是否以矩形的forms剪切? 如果是这样,为什么上面的代码不工作?

Solutions Collecting From Web of "使用clipRect – 解释"

帆布。 clipRect(左,上,右,下)减less了将来绘制操作可以写入的屏幕区域。 它将clipBounds设置为当前剪裁矩形和指定的矩形的空间相交。 有很多clipRect方法的变体,它们接受区域的不同forms,并在剪切矩形上允许不同的操作。 如果要显式设置剪辑区域,请尝试:

 canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

第五个参数意味着replace剪裁矩形,而不是创build与以前版本的交集。

尝试在drawRect语句之前移动clipRect语句。 或者,尝试添加:

 paint.setColor(Color.YELLOW); drawRect(0,0,75,75); 

在你现有的clipRect语句之后。 它应该画出一个50×50的黄色正方形。

另一个注意:(显然,很大程度上没有logging的View / ViewGroup /绘图代码长时间的挫败之后),我发现canvas.translate(x,y)也调整了clipRect。 clipRect和绘图matrix的交互非常混乱。 打印出来是有帮助的:

 canvas.getMatrix() 

 canvas.getClipBounds() 

之前和之后,修改canvas和之前绘制的东西。

ICS及以上…

如果启用了硬件加速,ICS将忽略XOR,Difference和ReverseDifference剪辑模式。

只需在您的视图中禁用2D硬件加速即可:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

参考Android:Howto在API15中使用clipRect

要裁剪左上部分,请执行:

 canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); // secondly... canvas.drawRect(0,0,100,100, paint);