一、使用Matrix控制变换
Matrix是Android提供的一个矩阵工具类,本身不能对图像或组件进行变换,但它可以和其它API结合起来控制图形、组件的变换;
Matrix提供了如下方法来控制平移、旋转和缩放:
setTranslate(float dx,float dy):控制Matrix进行平移;
setSkew(float kx,float ky,float px,float py):控制Matrix以px,py为轴心进行倾斜,kx,ky为X,Y方向上的倾斜距离;
setRotate(float degress):控制Matrix进行旋转,degress控制旋转的角度;
setRorate(float degress,float px,float py):设置以px,py为轴心进行旋转,degress控制旋转角度;
setScale(float sx,float sy):设置Matrix进行缩放,sx,sy控制X,Y方向上的缩放比例;
setScale(float sx,float sy,float px,float py):设置Matrix以px,py为轴心进行缩放,sx,sy控制X,Y方向上的缩放比例;
Andorid的API提供了set、post和pre三种操作:
set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉;
post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。
pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。
二、变换步骤
获取Matrix对象,该Matrix对象即可新创建,也可直接获取其他对象封装的Matrix(例如Transformation对象内部就封装了Matrix);
调用Matrix的方法进行平移、旋转、缩放、倾斜等;
将程序对Matrix所做的变换应用到指定图像或组件;
使用实例(chapter08/MatrixTest)
main_activity.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.example.matrixtest.MyView
android:id="@+id/myView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MyView.java文件
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 attrs) {
super(context, attrs);
// 获得位图
bitmap = ((BitmapDrawable) context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap();
// 获得宽度
width = bitmap.getWidth();
// 获得高度
height = bitmap.getHeight();
// 是当前视图获得焦点
this.setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 重置Matrix
matrix.reset();
if (!isScale) {
// 旋转matrix
matrix.setSkew(sx, 0);
} else {
// 缩放matrix
matrix.setScale(scale, scale);
}
// 根据原始位图和Matrix创建新图片
Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height,matrix, true);
// 绘制新位图
canvas.drawBitmap(bitmap2, matrix, null);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_A:
isScale = false;
sx += 0.1;
postInvalidate();
break;
case KeyEvent.KEYCODE_D:
isScale = false;
sx -= 0.1;
postInvalidate();
break;
case KeyEvent.KEYCODE_W:
isScale = true;
if (scale < 2.0) {
scale += 0.1;
}
postInvalidate();
case KeyEvent.KEYCODE_S:
isScale = true;
if (scale > 0.5) {
scale -= 0.1;
}
postInvalidate();
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
}
MainActivity.java文件
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
}
}