一、使用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); } }