Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix .

MainActivity如下:
  1. import android.os.Bundle;  
  2. import android.view.MotionEvent;  
  3. import android.view.View;  
  4. import android.view.View.OnTouchListener;  
  5. import android.widget.ImageView;  
  6. import android.app.Activity;  
  7. import android.graphics.Matrix;  
  8. /** 
  9.  * Demo描述: 
  10.  * 利用mImageView.setImageMatrix(matrix)实现 
  11.  * 图片的平移,缩放,旋转,倾斜以及对称 
  12.  *  
  13.  * 参考资料: 
  14.  * 0 http://blog.csdn.net/pathuang68/article/details/6991988 
  15.  * 1 http://blog.csdn.net/mingli198611/article/details/7830633 
  16.  *  
  17.  * Thank you very much 
  18.  */  
  19. public class MainActivity extends Activity {  
  20.     private TestMatrixImageView mTestMatrixImageView;  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);  
  25.         mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//??   
  26.         mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());  
  27.         setContentView(mTestMatrixImageView);  
  28.     }  
  29.       
  30.     private class TouchListenerImpl implements OnTouchListener{  
  31.         @Override  
  32.         public boolean onTouch(View v, MotionEvent event) {  
  33.             if (event.getAction()==MotionEvent.ACTION_UP) {  
  34.                 //1 测试平移   
  35.                 testTranslate();  
  36.                 //2 测试围绕图片中心点旋转   
  37.                 //testRotate();   
  38.                 //3 测试围绕原点旋转后平移   
  39.                 //testRotateAndTranslate();   
  40.                 //4 缩放   
  41.                 //testScale();   
  42.                 //5 水平倾斜   
  43.                 //testSkewX();   
  44.                 //6 垂直倾斜   
  45.                 //testSkewY();   
  46.                 //7 水平且垂直倾斜   
  47.                 //testSkewXY();   
  48.                 //8 水平对称   
  49.                 //testSymmetryX();   
  50.                 //9 垂直对称   
  51.                 //testSymmetryY();   
  52.                 //10 关于X=Y对称   
  53.                 //testSymmetryXY();   
  54.             }  
  55.             return true;  
  56.         }  
  57.           
  58.     }  
  59.       
  60.     //平移   
  61.     private void testTranslate(){  
  62.         Matrix matrix=new Matrix();  
  63.         int width=mTestMatrixImageView.getBitmap().getWidth();  
  64.         int height=mTestMatrixImageView.getBitmap().getHeight();  
  65.         matrix.postTranslate(width, height);  
  66.         mTestMatrixImageView.setImageMatrix(matrix);  
  67.         showMatrixEveryValue(matrix);  
  68.     }  
  69.     //围绕图片中心点旋转   
  70.     private void testRotate(){  
  71.         Matrix matrix=new Matrix();  
  72.         int width=mTestMatrixImageView.getBitmap().getWidth();  
  73.         int height=mTestMatrixImageView.getBitmap().getHeight();  
  74.         matrix.postRotate(45f, width/2, height/2);  
  75.         matrix.postTranslate(width, height);  
  76.         mTestMatrixImageView.setImageMatrix(matrix);  
  77.         showMatrixEveryValue(matrix);  
  78.     }  
  79.       
  80.     //围绕原点旋转后平移   
  81.     //注意以下三行代码的执行顺序:   
  82.     //matrix.setRotate(45f);   
  83.     //matrix.preTranslate(-width, -height);   
  84.     //matrix.postTranslate(width, height);   
  85.     //先执行matrix.preTranslate(-width, -height);   
  86.     //后执行matrix.setRotate(45f);   
  87.     //再执行matrix.postTranslate(width, height);   
  88.     private void testRotateAndTranslate() {  
  89.         Matrix matrix = new Matrix();  
  90.         int width = mTestMatrixImageView.getBitmap().getWidth();  
  91.         int height = mTestMatrixImageView.getBitmap().getHeight();  
  92.         matrix.setRotate(45f);  
  93.         matrix.preTranslate(-width, -height);  
  94.         matrix.postTranslate(width, height);  
  95.         mTestMatrixImageView.setImageMatrix(matrix);  
  96.         showMatrixEveryValue(matrix);  
  97.     }  
  98.       
  99.     //缩放   
  100.     private void testScale() {  
  101.         Matrix matrix = new Matrix();  
  102.         matrix.setScale(0.5f, 0.5f);  
  103.         mTestMatrixImageView.setImageMatrix(matrix);  
  104.         showMatrixEveryValue(matrix);  
  105.     }  
  106.       
  107.     //水平倾斜   
  108.     private void testSkewX() {  
  109.         Matrix matrix = new Matrix();  
  110.         matrix.setSkew(0.5f, 0);  
  111.         mTestMatrixImageView.setImageMatrix(matrix);  
  112.         showMatrixEveryValue(matrix);  
  113.     }  
  114.   
  115.     // 垂直倾斜   
  116.     private void testSkewY() {  
  117.         Matrix matrix = new Matrix();  
  118.         matrix.setSkew(00.5f);  
  119.         mTestMatrixImageView.setImageMatrix(matrix);  
  120.         showMatrixEveryValue(matrix);  
  121.     }  
  122.       
  123.     // 水平且垂直倾斜   
  124.     private void testSkewXY() {  
  125.         Matrix matrix = new Matrix();  
  126.         matrix.setSkew(0.5f, 0.5f);  
  127.         mTestMatrixImageView.setImageMatrix(matrix);  
  128.         showMatrixEveryValue(matrix);  
  129.     }  
  130.       
  131.     // 水平对称--图片关于X轴对称   
  132.     private void testSymmetryX() {  
  133.         Matrix matrix = new Matrix();  
  134.         int height = mTestMatrixImageView.getBitmap().getHeight();  
  135.         float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };  
  136.         matrix.setValues(matrixValues);  
  137.         //若是matrix.postTranslate(0, height);   
  138.         //表示将图片上下倒置   
  139.         matrix.postTranslate(0, height*2);  
  140.         mTestMatrixImageView.setImageMatrix(matrix);  
  141.         showMatrixEveryValue(matrix);  
  142.     }  
  143.       
  144.     // 垂直对称--图片关于Y轴对称   
  145.     private void testSymmetryY() {  
  146.         Matrix matrix = new Matrix();  
  147.         int width=mTestMatrixImageView.getBitmap().getWidth();  
  148.         float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};  
  149.         matrix.setValues(matrixValues);  
  150.         //若是matrix.postTranslate(width,0);   
  151.         //表示将图片左右倒置   
  152.         matrix.postTranslate(width*20);  
  153.         mTestMatrixImageView.setImageMatrix(matrix);  
  154.         showMatrixEveryValue(matrix);  
  155.   
  156.     }  
  157.   
  158.     // 关于X=Y对称--图片关于X=Y轴对称   
  159.     private void testSymmetryXY() {  
  160.         Matrix matrix = new Matrix();  
  161.         int width = mTestMatrixImageView.getBitmap().getWidth();  
  162.         int height = mTestMatrixImageView.getBitmap().getHeight();  
  163.         float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };  
  164.         matrix.setValues(matrixValues);  
  165.         matrix.postTranslate(width+height, width+height);  
  166.         mTestMatrixImageView.setImageMatrix(matrix);  
  167.         showMatrixEveryValue(matrix);  
  168.     }  
  169.       
  170.     //获取变换矩阵Matrix中的每个值   
  171.     private void showMatrixEveryValue(Matrix matrix){  
  172.         float matrixValues []=new float[9];  
  173.         matrix.getValues(matrixValues);  
  174.         for (int i = 0; i <3; i++) {  
  175.             String valueString="";  
  176.             for (int j = 0; j < 3; j++) {  
  177.                 valueString=matrixValues[3*i+j]+"";  
  178.                 System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);  
  179.             }  
  180.         }  
  181.     }  
  182.   
  183. }  
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.app.Activity;
import android.graphics.Matrix;
/**
 * Demo描述:
 * 利用mImageView.setImageMatrix(matrix)实现
 * 图片的平移,缩放,旋转,倾斜以及对称
 * 
 * 参考资料:
 * 0 http://blog.csdn.net/pathuang68/article/details/6991988
 * 1 http://blog.csdn.net/mingli198611/article/details/7830633
 * 
 * Thank you very much
 */
public class MainActivity extends Activity {
    private TestMatrixImageView mTestMatrixImageView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);
		mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//??
		mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());
		setContentView(mTestMatrixImageView);
	}
	
	private class TouchListenerImpl implements OnTouchListener{
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if (event.getAction()==MotionEvent.ACTION_UP) {
				//1 测试平移
				testTranslate();
				//2 测试围绕图片中心点旋转
				//testRotate();
				//3 测试围绕原点旋转后平移
				//testRotateAndTranslate();
				//4 缩放
				//testScale();
				//5 水平倾斜
				//testSkewX();
				//6 垂直倾斜
				//testSkewY();
				//7 水平且垂直倾斜
				//testSkewXY();
				//8 水平对称
				//testSymmetryX();
				//9 垂直对称
				//testSymmetryY();
				//10 关于X=Y对称
				//testSymmetryXY();
			}
			return true;
		}
		
	}
	
	//平移
	private void testTranslate(){
		Matrix matrix=new Matrix();
		int width=mTestMatrixImageView.getBitmap().getWidth();
		int height=mTestMatrixImageView.getBitmap().getHeight();
		matrix.postTranslate(width, height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	//围绕图片中心点旋转
	private void testRotate(){
		Matrix matrix=new Matrix();
		int width=mTestMatrixImageView.getBitmap().getWidth();
		int height=mTestMatrixImageView.getBitmap().getHeight();
		matrix.postRotate(45f, width/2, height/2);
		matrix.postTranslate(width, height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	//围绕原点旋转后平移
	//注意以下三行代码的执行顺序:
	//matrix.setRotate(45f);
	//matrix.preTranslate(-width, -height);
	//matrix.postTranslate(width, height);
	//先执行matrix.preTranslate(-width, -height);
	//后执行matrix.setRotate(45f);
	//再执行matrix.postTranslate(width, height);
	private void testRotateAndTranslate() {
		Matrix matrix = new Matrix();
		int width = mTestMatrixImageView.getBitmap().getWidth();
		int height = mTestMatrixImageView.getBitmap().getHeight();
		matrix.setRotate(45f);
		matrix.preTranslate(-width, -height);
		matrix.postTranslate(width, height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	//缩放
	private void testScale() {
		Matrix matrix = new Matrix();
		matrix.setScale(0.5f, 0.5f);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	//水平倾斜
	private void testSkewX() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	// 垂直倾斜
	private void testSkewY() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0, 0.5f);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	// 水平且垂直倾斜
	private void testSkewXY() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0.5f);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	// 水平对称--图片关于X轴对称
	private void testSymmetryX() {
		Matrix matrix = new Matrix();
		int height = mTestMatrixImageView.getBitmap().getHeight();
		float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrixValues);
		//若是matrix.postTranslate(0, height);
		//表示将图片上下倒置
		matrix.postTranslate(0, height*2);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	// 垂直对称--图片关于Y轴对称
	private void testSymmetryY() {
		Matrix matrix = new Matrix();
		int width=mTestMatrixImageView.getBitmap().getWidth();
		float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
		matrix.setValues(matrixValues);
		//若是matrix.postTranslate(width,0);
		//表示将图片左右倒置
		matrix.postTranslate(width*2, 0);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);

	}

	// 关于X=Y对称--图片关于X=Y轴对称
	private void testSymmetryXY() {
		Matrix matrix = new Matrix();
		int width = mTestMatrixImageView.getBitmap().getWidth();
		int height = mTestMatrixImageView.getBitmap().getHeight();
		float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrixValues);
		matrix.postTranslate(width+height, width+height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	
	//获取变换矩阵Matrix中的每个值
	private void showMatrixEveryValue(Matrix matrix){
		float matrixValues []=new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i <3; i++) {
			String valueString="";
			for (int j = 0; j < 3; j++) {
				valueString=matrixValues[3*i+j]+"";
				System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);
			}
		}
	}

}

TestMatrixImageView如下:

  1. package cn.testmatrix;  
  2. import android.content.Context;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.BitmapFactory;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Matrix;  
  7. import android.widget.ImageView;  
  8. /** 
  9.  * 总结: 
  10.  * 在MainActivity中执行: 
  11.  * mTestMatrixImageView.setImageMatrix(matrix); 
  12.  * 时此自定义View会先调用setImageMatrix(Matrix matrix) 
  13.  * 然后调用onDraw(Canvas canvas) 
  14.  */  
  15. public class TestMatrixImageView extends ImageView{  
  16.     private Matrix mMatrix;  
  17.     private Bitmap mBitmap;  
  18.     public TestMatrixImageView(Context context) {  
  19.         super(context);  
  20.         mMatrix=new Matrix();  
  21.         mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);  
  22.     }  
  23.     @Override  
  24.     protected void onDraw(Canvas canvas) {  
  25.         System.out.println("---> onDraw");  
  26.         //画原图   
  27.         canvas.drawBitmap(mBitmap, 00null);  
  28.         //画经过Matrix变化后的图   
  29.         canvas.drawBitmap(mBitmap, mMatrix, null);  
  30.         super.onDraw(canvas);  
  31.     }  
  32.     @Override  
  33.     public void setImageMatrix(Matrix matrix) {  
  34.         System.out.println("---> setImageMatrix");  
  35.         this.mMatrix.set(matrix);  
  36.         super.setImageMatrix(matrix);  
  37.     }  
  38.       
  39.     public Bitmap getBitmap(){  
  40.         System.out.println("---> getBitmap");  
  41.         return mBitmap;  
  42.     }  
  43.   
  44. }  
package cn.testmatrix;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.widget.ImageView;
/**
 * 总结:
 * 在MainActivity中执行:
 * mTestMatrixImageView.setImageMatrix(matrix);
 * 时此自定义View会先调用setImageMatrix(Matrix matrix)
 * 然后调用onDraw(Canvas canvas)
 */
public class TestMatrixImageView extends ImageView{
	private Matrix mMatrix;
    private Bitmap mBitmap;
	public TestMatrixImageView(Context context) {
		super(context);
		mMatrix=new Matrix();
		mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		System.out.println("---> onDraw");
		//画原图
		canvas.drawBitmap(mBitmap, 0, 0, null);
		//画经过Matrix变化后的图
		canvas.drawBitmap(mBitmap, mMatrix, null);
		super.onDraw(canvas);
	}
	@Override
	public void setImageMatrix(Matrix matrix) {
		System.out.println("---> setImageMatrix");
		this.mMatrix.set(matrix);
		super.setImageMatrix(matrix);
	}
	
	public Bitmap getBitmap(){
		System.out.println("---> getBitmap");
		return mBitmap;
	}

}

main.xml如下:
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     >  
  6.   
  7.     <TextView  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="@string/hello_world" />  
  11.   
  12. </RelativeLayout>  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值