Matrix 是 Android 提供的一个矩阵工具类,它本身并不能对图像或组件进行变换,但它可与其他 API 结合来控制图像、组件的变换。
使用 Matrix 控制图像或组件变换的步骤如下:
- 获取 Matrix 对象,该 Matrix 对象即可新创建,也可以直接获取其他对象内封装的 Matrix(例如 Transformation 对象内部就封装了 Matrix);
- 调用 Matrix 的方法进行平移、旋转、缩放、倾斜等;
- 将程序对 Matrix 所做的变换应用到指定图像或组件。
下面是一个简单的使用示例,首先是一个自定义的 TestMatrixView.java 视图文件
package com.toby.personal.testlistview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by toby on 2017/4/12.
*/
public class TestMatrixView 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 TestMatrixView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
bitmap = ((BitmapDrawable)
context.getResources().getDrawable(R.drawable.girl04, null)).getBitmap();
width = bitmap.getWidth();
height = bitmap.getHeight();
}
@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);
}
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
canvas.drawBitmap(bitmap1, matrix, null);
}
public void skewUp(){
isScale = false;
sx += 0.1;
postInvalidate();
}
public void skewDown(){
isScale = false;
sx -= 0.1;
postInvalidate();
}
public void scaleUp() {
isScale = true;
if (scale < 2.0) {
scale += 0.1;
}
postInvalidate();
}
public void scaleDown() {
isScale = true;
if (scale > 0.5) {
scale -= 0.1;
}
postInvalidate();
}
}
主程序文件的内容如下:
package com.toby.personal.testlistview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
public class MainActivity extends AppCompatActivity {
final private static String TAG = "Toby_Test";
private TestMatrixView matrixView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
matrixView = new TestMatrixView(this, null);
setContentView(matrixView);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_A:
matrixView.skewUp();
break;
case KeyEvent.KEYCODE_D:
matrixView.skewDown();
break;
case KeyEvent.KEYCODE_W:
matrixView.scaleUp();
break;
case KeyEvent.KEYCODE_S:
matrixView.scaleDown();
break;
}
return super.onKeyDown(keyCode, event);
}
}
显示效果如下:
本文参考文献:《疯狂Android讲义 : 第2版 》