zoukankan      html  css  js  c++  java
  • Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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(0, 0.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*2, 0);  
    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. }  

    TestMatrixImageView如下:

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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, 0, 0, null);  
    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. }  


    main.xml如下:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
      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>  
  • 相关阅读:
    REDIS缓存穿透,缓存击穿,缓存雪崩
    spring 自动装配
    SpringBoot @Condition
    【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法
    【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法
    【Azure 环境】基于Azure搭建企业级内部站点, 配置私有域名访问的详细教程 (含演示动画)
    【Azure Function】Function App和Powershell 集成问题, 如何安装PowerShell的依赖模块
    【Azure 应用服务】Python3.7项目在引用pandas 模块后,部署报错 
    【Azure 应用服务】部署Azure Web App时,是否可以替换hostingstart.html文件呢?
    【Azure 应用服务】添加自定义域时,Domain ownership 验证无法通过 
  • 原文地址:https://www.cnblogs.com/exmyth/p/4965891.html
Copyright © 2011-2022 走看看