Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android clipRect Op.xxx各個參數理解

android clipRect Op.xxx各個參數理解

編輯:關於Android編程

有點小啰嗦的一篇學習筆記,可以直接看最後得出的結論:前面的各種圖片和說明都是為最後的結論服務的

1)剪切:和平常畫圖工具剪切的作用一樣,在畫布上剪切一個區域,比如剪切一個Rect區域,畫布canvas其余的部分都丟掉,之後所有的畫圖都在這個Rect區域內進行(如果不涉及save和restore方法)。

2)clip進行剪切的時候,不會影響之前已經畫好的圖形。

3)剪切是對canvas的操作,而不是在canvas上的圖進行操作。

為了說明這幾點,下面進行一下說明。


步驟1) 在剪切之前繪制一個全屏的藍色的矩形。

2)定義剪切的矩形Rect區域,並進行剪切

3)設置剪切過後畫布顏色為紅色

運行的效果如下圖所示:此時剪切過後畫布的區域就是剪切的Rect區域,雖然剪切掉了canvas上面和下面的一部分,但是仍然會把途中所示的藍色部分顯示出來而不會剪切掉:也就是如上所說不會影響之前已經畫好的圖形。

\

代碼如下:

protected void onDraw(Canvas canvas) {
		int width = getMeasuredWidth();
		int height = getMeasuredHeight();
		
		
		Paint paint = new Paint();
		paint.setColor(Color.BLUE);		
		//全屏繪制一個藍色的矩形畫面
		canvas.drawRect(0, 0,width,height,paint);
	
		//定義剪切的Rect區域
		Rect rect = new Rect();
		rect.left = 0;
		rect.top = 300;//左上角(0,300) 
		rect.right = width;	
		rect.bottom = height/2; //右下角(width,height)
		//進行剪切	  
        canvas.clipRect(rect)
	    canvas.drawColor(Color.RED);
	 
	}

上面的clipRect是只有一個參數的(默認為INTERSECT,下面看看它的重載方法Cliprect(rect,OP.xx)第二個參數以及各個參數的含義和運行效果:

開始之前做些准備工作:

區域A:剪切之前的畫布區域

區域B:當前要剪切的區域,也就是clipRect的第一個參數所表示的區域


在沒有直接寫代碼測試之前對這些字段的翻譯和查閱寫數學資料並對Op.xxx的各種字段在心裡做了如下假設:

XOR:異或運算,相同為0(false),不用為1(true),也就是兩個區域重疊的地方為0,不同的地方為1,剪切過後的畫布的區域就是兩個區域不重疊的部分。

INTERSECT:交集運算,剪切過後的畫布區域就是兩個區域的交集區域。

REPLACE:這個有待驗證,不明所以,從字面意思來說是代替的意思,應該就是用B的區域代替A的區域,所以剪切過後的畫布區域可能就是只剩下B的區域,當然這個只是假設,有待下面的驗證過。

DIFFERENCE:差集運算,剪切過後的畫布的區域就是A-B

REVERSE_DIFFERENCE:差集運算,REVERSE為反向,逆向的意思,不難猜出剪切過後的畫布區域是B-A的區域

UNION:並集運算,剪切過後的畫布區域就是A和B的區域相加,當然重疊的地方只計算一次

下面就寫程序注意驗證上面的結果和得出相應的結論

先是全集和子集的情況:此時A為全集區域,B為A的子集

\

a) Op.DIFFERENCE:即將剪切的區域(設置B)與當前canvas(設置A)之間的差集,剪切過後還剩下的畫布canvas區域就是A-B的區域,看看運行結果

步驟還是之前的步驟,只是把canvas.clipRect(rect)改成canvas.clipRect(rect,Op.DIFFERENCE);運行結果如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20150212/2015021208423342.png" alt="\">

b) Op.REVERSE_DIFFERENCE:對比DIFFERENCE取A-B,REVERSE是相反的意思,所以為B-A,因為B為A的子集,所以該差集不存在,所以運行結果為下:

\

c) Op.XOR:兩個區域進行異或運算,異或運算的規則是:“相同為0(false),不同為1(true)”,當兩個區域進行異或的時候,很顯然“區域重疊的地方為0,不重疊的地方為1”,剪切過後剩下的畫布canvas的區域就是不重疊的地方所在的區域,看看運行結果

\

d) Op.UNION 取A和B的並集,所以運行結果為下圖:

\

e) Op.INTERSECT 取A和B的交集,因為上面的程序中A是全屏的畫布范圍,而B在A裡面,所以剪切的結果為下圖所示,所以說交集為B的范圍

\

f) Op.REPLACE,運行效果如下

\

通過全集和子集的運行效果來看,REPLACE應該就是跟上面設想的一樣,其余的倒是跟設想的結論一樣。

所以我就測試了非全集和子集的情況

此時A區域和B區域的關系如圖,C為A和B的交集區域:

\

測試畫圖步驟:

1)繪制一個藍色的矩形面

2)定義A的Rect對象(第一次要剪切的區域),並開始剪切

3)定義B的rect對象並開始剪切,並且調用clipRect(rect,Op.xxx)來看不用xxx下剪切的效果

4)把剪切過後的畫布設置為紅色

上面步驟的代碼如下:

                int width = 1000;
                int height =1000;
                Paint paint = new Paint();
		paint.setColor(Color.BLUE);		
		//全屏繪制一個藍色的矩形畫面
		canvas.drawRect(0, 0,width,height,paint);
		
              //定義區域A的rect對象
		Rect rect = new Rect();
		rect.left =100;
		rect.top = 100;//左上角(0,300) 
		rect.right = 300;
		rect.bottom = 300; //右下角(width,hei
		//剪切為A區域
		canvas.clipRect(rect);//同clipRect
		
                //設置b的rect對象
		rect.left =200;
		rect.top = 200;//左上角(0,300) 
		rect.right = 400;
		rect.bottom = 400; //右下角(width,height)	
		canvas.clipRect(rect,Op.xxxx);

                //把剪切過後的畫布設置紅色
                canvas.drawColor(Color.RED);

a) DIFFERENCE的情況下的運行效果(A-B的差集):也就是A區域去掉C區域

\

b) REVERSE_DIFFERENCE的運行效果如下圖(B-A的差集):也就是B區域去掉C區域

\

c) UNION 的運行結果 (A和B的並集)

\

d) INTERSECT (交集運算)此時畫布只剩下C區域可以顯示,所以運行結果如下

\

e)XOR 異或運算,剪切過後的結果為A和B區域不重疊的區域

\

f)REPLACE 這個運算結果是什麼呢?就是B區域,也就是剪切過後的結果只保留B區域,這也就是REPLACE代替或者替換的含義:當前還沒被剪切的區域A被即將要剪切的區域B來代替。


結論:

XOR:異或運算,相同為0(false),不用為1(true),也就是兩個區域重疊的地方為0,不同的地方為1,剪切過後的畫布的區域就是兩個區域不重疊的部分。

INTERSECT:交集運算,剪切過後的畫布區域就是兩個區域的交集區域。

DIFFERENCE:差集運算,剪切過後的畫布的區域就是A-B

REVERSE_DIFFERENCE:差集運算,REVERSE為反向,逆向的意思,不難猜出剪切過後的畫布區域是B-A的區域

UNION:並集運算,剪切過後的畫布的區域為A+B的區域

REPLACE:也就是剪切過後的結果只保留B區域,這也就是REPLACE代替或者替換的含義:當前還沒被剪切的區域A被即將要剪切的區域B來代替。



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved