Android畫圖之Matrix

Android畫圖之Matrix(一)

Matrix ,中文裏叫矩陣,高等數學裏有介紹,在圖像處理方面,主要是用於平面的縮放、平移、旋轉等操做。 java

首先介紹一下矩陣運算。加法和減法就不用說了,太簡單了,對應位相加就好。圖像處理,主要用到的是乘法 。下面是一個乘法的公式: android

Android 裏面, Matrix 9 float 值構成,是一個 3*3 的矩陣。以下圖。 canvas

       

沒專業工具,畫的挺難看。解釋一下,上面的 sinX cosX ,表示旋轉角度的 cos 值和 sin 值,注意,旋轉角度是按順時針方向計算的。 translateX translateY 表示 x y 的平移量。 scale 是縮放的比例, 1 是不變, 2 是表示縮放 1/2 ,這樣子。 數組

下面在 Android 上試試 Matrix 的效果。 ide

public class MyView extends View {
	private Bitmap mBitmap;
	private Matrix mMatrix = new Matrix();
	public MyView(Context context) {
		super(context);
		initialize();
	}

	private void initialize() {		
		mBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();		
		float cosValue = (float) Math.cos(-Math.PI/6);
		float sinValue = (float) Math.sin(-Math.PI/6);
		mMatrix.setValues(
				new float[]{
	  				       cosValue, -sinValue, 100,
						sinValue, cosValue, 100,
						0, 0, 2});

	}

	@Override protected void onDraw(Canvas canvas) {
//		super.onDraw(canvas);  //固然,若是界面上還有其餘元素須要繪製,只須要將這句話寫上就好了。
		canvas.drawBitmap(mBitmap, mMatrix, null);
	}

}

運行結果以下: 工具

以左上角爲頂點,縮放一半,逆時針旋轉30度,而後沿x軸和y軸分別平移50個像素,代碼 裏面寫的是100,爲何是平移50呢,由於縮放了一半。 post

你們可以本身設置一下Matrix的值,或者嘗試一下兩個Matrix相乘,獲得的值設置進去,這樣才能對Matrix更加熟練。
spa

這裏講的直接賦值的方式也許有點很差理解,不過還好, andrid 提供了對矩陣的更方便的方法,下一篇介紹 code

 Android畫圖之Matrix(二)   

Android畫圖之Matrix(一) 講了一下Matrix的原理和運算方法,涉及到高等數學,有點難以理解。還好Android裏面提供了對Matrix操做的一系列方便的接口。 blog

Matrix的操做,總共分爲translate(平移),rotate(旋轉),scale(縮放)和skew(傾斜)四種,每一種變換在Android的API裏都提供了set, post和pre三種操做方式,除了translate,其餘三種操做均可以指定中心點。

set是直接設置Matrix的值,每次set一次,整個Matrix的數組都會變掉。

post是後乘,當前的矩陣乘以參數給出的矩陣。能夠連續屢次使用post,來完成所需的整個變換。例如,要將一個圖片旋轉30度,而後平移到(100,100)的地方,那麼能夠這樣作:

Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);

這樣就達到了想要的效果。pre是前乘,參數給出的矩陣乘以當前的矩陣。因此操做是在當前矩陣的最前面發生的。例如上面的例子,若是用pre的話,就要這樣:

Matrix m = new Matrix();
m.setTranslate(100, 100);
m.preRotate(30);
旋轉、縮放和傾斜均可以圍繞一箇中心點來進行,若是不指定,默認狀況下,是圍繞(0,0)點來進行。

下面給出一個例子。

package chroya.demo.graphics;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {
	
	private Bitmap mBitmap;
	private Matrix mMatrix = new Matrix();
	
	public MyView(Context context) {
		super(context);
		initialize();
	}

	private void initialize() {
		
		Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
		mBitmap = bmp;
		/*首先,將縮放爲100*100。這裏scale的參數是比例。有一點要注意,若是直接用100/
bmp.getWidth()的話,會獲得0,由於是整型相除,因此必須其中有一個是float型的,直接用100f就好。*/
		mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
                //平移到(100,100)處
		mMatrix.postTranslate(100, 100);
                //傾斜x和y軸,以(100,100)爲中心。
		mMatrix.postSkew(0.2f, 0.2f, 100, 100);
	}
	
	@Override protected void onDraw(Canvas canvas) {
//		super.onDraw(canvas);  //若是界面上還有其餘元素須要繪製,只須要將這句話寫上就好了。
		
		canvas.drawBitmap(mBitmap, mMatrix, null);
	}
}
運行效果以下:

紅色的x和y表示傾斜的角度,下面是x,上面是y。看到了沒,Matrix就這麼簡單

實現鏡像

matrix.setScale(1, -1)



效果以下:

相關文章
相關標籤/搜索