使用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 - 说明

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

+2

检查http://youtu.be/vkTn3Ule4Ps?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu – 2015-01-13 01:21:19

帆布。 clipRect(left, top, right, bottom)减少了未来绘制操作可以写入的屏幕区域。它将clipBounds设置为当前剪裁矩形和指定的矩形的空间相交。 clipRect方法有很多变体,它们接受区域的不同形式,并允许剪切矩形上的不同操作。如果你想明确地设置裁剪区域,请尝试:

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

第五届参数是指更换剪切的矩形,而不是创建一个与以前版本的交集。

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

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

您现有的clipRect语句后。它应该绘制一个50x50的黄色正方形,胜过以前的东西。我发现canvas.translate(x,y)也调整了clipRect。我发现canvas.translate(x,y)也调整了clipRect。 clipRect和绘图矩阵的交互非常混乱。这是有帮助的打印输出:

canvas.getMatrix() 

canvas.getClipBounds() 

前和修改后的画布和绘图以前的事情。

+2

上canvas.translate(X,Y)与clipRect搞乱的说明是非常有用的。给了我很多挫折。谢谢! – 2013-08-26 12:02:00

+0

“Region.Op”的方法现在显然已被弃用。 – Suragch 2017-04-01 03:29:20

+0

如何从剪裁的画布中获取原始画布? – 2017-12-24 20:10:20

要裁剪的左上部分,这样做:

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

ICS及以上...

异,差异与ReverseDifference夹模式 由ICS如果启用硬件加速忽略。

在你看来只是禁用2D硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,NULL);

参考Android: Howto use clipRect in API15