第二部分 代码验证
在第一部分中讲到的各种图像变换的验证代码如下,一共列出了10种情况。如果要验证其中的某一种情况,只需将相应的代码反注释即可。试验中用到的图片:
其尺寸为162 x 251。
每种变换的结果,请见代码之后的说明。
package com.pat.testtransformmatrix; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnTouchListener; import android.widget.ImageView; public class TestTransformMatrixActivity extends Activity implements OnTouchListener { private TransformMatrixView view; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); view = new TransformMatrixView(this); view.setScaleType(ImageView.ScaleType.MATRIX); view.setOnTouchListener(this); setContentView(view); } class TransformMatrixView extends ImageView { private Bitmap bitmap; private Matrix matrix; public TransformMatrixView(Context context) { super(context); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sophie); matrix = new Matrix(); } @Override protected void onDraw(Canvas canvas) { // 画出原图像 canvas.drawBitmap(bitmap, 0, 0, null); // 画出变换后的图像 canvas.drawBitmap(bitmap, matrix, null); super.onDraw(canvas); } @Override public void setImageMatrix(Matrix matrix) { this.matrix.set(matrix); super.setImageMatrix(matrix); } public Bitmap getImageBitmap() { return bitmap; } } public boolean onTouch(View v, MotionEvent e) { if(e.getAction() == MotionEvent.ACTION_UP) { Matrix matrix = new Matrix(); // 输出图像的宽度和高度(162 x 251) Log.e("TestTransformMatrixActivity", "image size: width x height = " + view.getImageBitmap().getWidth() + " x " + view.getImageBitmap().getHeight()); // 1. 平移 matrix.postTranslate(view.getImageBitmap().getWidth(), view.getImageBitmap().getHeight()); // 在x方向平移view.getImageBitmap().getWidth(),在y轴方向view.getImageBitmap().getHeight() view.setImageMatrix(matrix); // 下面的代码是为了查看matrix中的元素 float[] matrixValues = new float[9]; matrix.getValues(matrixValues); for(int i = 0; i < 3; ++i) { String temp = new String(); for(int j = 0; j < 3; ++j) { temp += matrixValues[3 * i + j ] + "\t"; } Log.e("TestTransformMatrixActivity", temp); } // // 2. 旋转(围绕图像的中心点) // matrix.setRotate(45f, view.getImageBitmap().getWidth() / 2f, view.getImageBitmap().getHeight() / 2f); // // // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠 // matrix.postTranslate(view.getImageBitmap().getWidth() * 1.5f, 0f); // view.setImageMatrix(matrix); // // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrix.getValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + "\t"; // } // Log.e("TestTransformMatrixActivity", temp); // } // // 3. 旋转(围绕坐标原点) + 平移(效果同2) // matrix.setRotate(45f); // matrix.preTranslate(-1f * view.getImageBitmap().getWidth() / 2f, -1f * view.getImageBitmap().getHeight() / 2f); // matrix.postTranslate((float)view.getImageBitmap().getWidth() / 2f, (float)view.getImageBitmap().getHeight() / 2f); // // // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠 // matrix.postTranslate((float)view.getImageBitmap().getWidth() * 1.5f, 0f); // view.setImageMatrix(matrix); // // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrix.getValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp +