2015年11月29日 星期日

Matrix, Rect

-----------------------------------
1. Matrix 使用方法:
-----------------------------------

* 重點注意事項:
1. Matrix中带有pre, post的函数需要考虑先后顺序不然的话你会发现可能坐标位置不是你想要的。
Matrix的基本操作包括:+、*。Matrix的乘法不滿足交換律,也就是說A*B ≠B*A。
Preconcats matrix相當於右乘矩陣,Postconcats matrix相當於左乘矩陣


參考資料:


2. 有一种更简便的方法,叫系统帮我们计算:
setConcat(Matrix a, Matrix b)
ex:
Matrix mRotateMatrix = new Matrix();    //控制旋转  
Matrix mScaleMatrix = new Matrix(); //控制缩放  
Matrix mSkewMatrix = new Matrix();  //控制倾斜  
Matrix mPosMatrix = new Matrix();       //控制坐标  
Matrix mMatrix = new Matrix();      //合并  
      
mMatrix.setConcat(mRotateMatrix, mScaleMatrix);  
mMatrix.setConcat(mMatrix, mSkewMatrix);  
mMatrix.setConcat(mMatrix, mPosMatrix);  
      
canvas.drawBitmap(mBitmap, mMatrix, mPaint);  

3. Public Constructors:
Matrix()、Matrix(Matrix src)

4. 將 Matrix 結果放置 Rect 矩形中:

首先得到图片的宽为width,高为height,你使用的matrix为m:
RectF rect = new RectF(0, 0, width, height);
m.mapRect(rect);
这样rect.left,rect.right,rect.top,rect.bottom分别就就是当前屏幕离你的图片的边界的距离。
而这样你要的点(0,0)其实就是界面的左上角(rect.left,rect.top)

 [Android界面] 请教高手Matrix中的mapRect方法如何使用:http://www.eoeandroid.com/thread-113930-1-1.html

5. 顏色矩陣 ColorMatrix - 用於調整圖片色調、慮色等顏色風格調整:

顏色矩陣M是一個5*4的矩陣,其一維數組m:

 
 
透過矩陣調整顏色的色偏:



EX:將變化量 array 設定至 ColorMatrix中,並用 canvas 配合 Paint 來完成 ColorFilter 效果。  
 Paint mPaint = new Paint();                                                                    //新建畫筆對象
 canvas.drawBitmap(mBitmap, 0, 0, mPaint);                                         //描畫(原始圖片)    
        
 ColorMatrix mColorMatrix = new ColorMatrix();                                     //新建顏色矩陣對象    
 mColorMatrix.set(array);                                                                         //設置顏色矩陣的值
 mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));        //設置畫筆顏色過滤器    
 canvas.drawBitmap(mBitmap, 0, 0, mPaint);                                         //描畫(處理後的圖片)


參考資料:

6. 旋转:
 - 围绕点px, py 旋转 degrees度, 
 - 如果没设置坐标,默认以0,0点旋转.
setRotate(float degrees)、setRotate(float degrees, float px, float py)

7. 缩放,翻转:

 - 以点px,py为原点缩放 >=0   1为正常大小  
 - 如果是负数,图形就会翻转
 - 如果没设置原点坐标,默认以0,0点缩放(如果发现图片不见了,检查一下是不是翻转出了屏幕)
setScale(float sx, float sy)、setScale(float sx, float sy, float px, float py)

8. 倾斜:
 - 以点px,py为原点倾斜
 - 如果没有设置原点,则以0,0点为原点.
setSkew(float kx, float ky, float px, float py)、setSkew(float kx, float ky)

9. 坐标:
 - 图片移动到某一个位置
setTranslate(float dx, float dy)

10. 重製:
 - Matrix 會壘加,需要reset來算新的座標
matrix.reset();  

EX:
 - 想要旋转45度,然后平移到100,100的位置需要
Method 1) 
Matrix matrix = new Matrix();  
matrix.postRotate(45);  
matrix.postTranslate(100, 100);  
Method 2)
Matrix matrix = new Matrix();  
matrix.setTranslate(100, 100);  
matrix.preRotate(45);  


參考資料:

EX: 
 - 旋轉、縮放和傾斜都可以圍繞一個中心點進行




參考資料:







-----------------------------------
2. Rect 使用方法:
-----------------------------------

* 重點注意事項:
Rect类与RectF类(android.graphics.RectF)的区别在於,兩者分别是:int、float类型的精準度

Public Constructors:
Rect(int left, int top, int right, int bottom)、Rect(Rect r)

常用參數:
(int) centerX()、centerY()
(float) exactCenterX()、exactCenterY()
(int) height()、width()

常用方法:
 - 移動
offset(int dx, int dy):该矩阵在x轴和y轴分别发生的偏移量(很有用,可以上下移动矩阵)
 - 檢查是否在範圍內(可用於點擊事件)
(boolean) contains(int x, int y):是否包含(x,y)点
(boolean) contains(int left, int top, int right, int bottom):是否包含(int left, int top, int right, int bottom)矩阵
(boolean) contains(Rect r)
 - 加入/插入一個或多個矩型
inset(int dx, int dy):Inset the rectangle by (dx,dy).
intersect(Rect r)
intersect(int left, int top, int right, int bottom)
intersects(int left, int top, int right, int bottom)
intersects(Rect a, Rect b)

EX:
new Rect(150, 75, 260, 120)  左上角的坐标是(150,75),右下角的坐标是(260,120)



參考資料:

沒有留言:

張貼留言