2010-07-26 68 views
32
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

回答

66

帆布。 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

3

要裁剪的左上部分,這樣做:

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

ICS及以上...

異,差異與ReverseDifference夾模式 由ICS如果啓用硬件加速忽略。

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

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,NULL);

參考Android: Howto use clipRect in API15