/**********************************************
* Matrix是Android提供的一個工具類,可以與其他API結合實作圖形元件的變化。
*
* 可以實作元件的平移,傾斜,旋轉,縮放等。 步驟:
*
* 1.擷取Matrix對象。Matrix ma trix = new Matrix();
*
* 2.調用Matrix方法進行平移,旋轉,縮放,傾斜 如旋轉Matrix: matrix.setSkew(sx, 0);
* 縮放:matrix.setScale(scale, scale);
*
* 3.應用到元件Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width,
* height, matrix, true);
*
*
**********************************************/
API
public void setTranslate(float dx, float dy) // 控制Matir進行平移
public void setSkew(float kx, float ky, float px, float py) // 控制Matirx以px,py進行傾斜,kx,ky為X、Y方向上的距離
public void setSkew(float kx, float ky) // 控制Matirx進行傾斜,kx,ky為X,Y方向上的距離
public void setRotate(float degrees, float px, float py) //以px,py為軸心進行旋轉 degrees為旋轉角度
public void setRotate(float degrees) // 控制Matrix進行旋轉,degrees為旋轉角度
public void setScale(float sx, float sy, float px, float py) // 控制Maritx以px,py為軸心進行縮放,sx,sy控制X,Y方向上的縮放比例
public void setScale(float sx, float sy) // 控制Maritx以px,py為軸心進行縮放,sx,sy控制X,Y方向上的縮放比例
public class MyView extends View {
// 初始化圖檔資源
private Bitmap bitmap;
// Matrix執行個體
private Matrix matrix = new Matrix();
// 設定傾斜度
private float sx = 0.0f;
// 位圖寬和高
private int width, height;
// 縮放比例
private float scale = 1.0f;
// 判斷是縮放還是旋轉
private boolean isScale = false;
public MyView(Context context, AttributeSet set) {
super(context, set);
// TODO Auto-generated constructor stub
// 獲得位圖
bitmap = ((BitmapDrawable) context.getResources().getDrawable(
R.drawable.icon1)).getBitmap();
// 獲得位圖寬高
width = bitmap.getWidth();
height = bitmap.getHeight();
// 是目前視圖獲得焦點
this.setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 重置Matirx
matrix.reset();
if (!isScale) {
// 旋轉Matrix
matrix.setSkew(sx, 0);
} else {
// 縮放Matrix
matrix.setScale(scale, scale);
}
// 根據原始位圖和Matrix建立新圖檔
Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, true);
// 繪制新位圖
canvas.drawBitmap(newBitmap, matrix, null);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
// 向左傾斜
case KeyEvent.KEYCODE_A:
isScale = false;
sx += 0.1;
postInvalidate(); // 在非UI程序中使用 應該就是onDraw中
break;
case KeyEvent.KEYCODE_D:
isScale = false;
sx -= 0.1;
postInvalidate(); // 在非UI程序中使用
break;
// 放大
case KeyEvent.KEYCODE_W:
isScale = true;
if (scale < 2.0)
scale += 0.1;
postInvalidate(); // 在非UI程序中使用
break;
// 縮小
case KeyEvent.KEYCODE_S:
isScale = true;
if (scale > 0.5)
scale -= 0.1;
postInvalidate(); // 在非UI程序中使用
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
}