/**********************************************
* 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方向上的缩放比例

示例:实现按ADWS分别实现 向左倾斜,向右倾斜,放大缩小

 

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);
}

}