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. private class TouchListenerImpl implements OnTouchListener{
  30. @Override
  31. public boolean onTouch(View v, MotionEvent event) {
  32. if (event.getAction()==MotionEvent.ACTION_UP) {
  33. //1 测试平移
  34. testTranslate();
  35. //2 测试围绕图片中心点旋转
  36. //testRotate();
  37. //3 测试围绕原点旋转后平移
  38. //testRotateAndTranslate();
  39. //4 缩放
  40. //testScale();
  41. //5 水平倾斜
  42. //testSkewX();
  43. //6 垂直倾斜
  44. //testSkewY();
  45. //7 水平且垂直倾斜
  46. //testSkewXY();
  47. //8 水平对称
  48. //testSymmetryX();
  49. //9 垂直对称
  50. //testSymmetryY();
  51. //10 关于X=Y对称
  52. //testSymmetryXY();
  53. }
  54. return true;
  55. }
  56. }
  57. //平移
  58. private void testTranslate(){
  59. Matrix matrix=new Matrix();
  60. int width=mTestMatrixImageView.getBitmap().getWidth();
  61. int height=mTestMatrixImageView.getBitmap().getHeight();
  62. matrix.postTranslate(width, height);
  63. mTestMatrixImageView.setImageMatrix(matrix);
  64. showMatrixEveryValue(matrix);
  65. }
  66. //围绕图片中心点旋转
  67. private void testRotate(){
  68. Matrix matrix=new Matrix();
  69. int width=mTestMatrixImageView.getBitmap().getWidth();
  70. int height=mTestMatrixImageView.getBitmap().getHeight();
  71. matrix.postRotate(45f, width/2, height/2);
  72. matrix.postTranslate(width, height);
  73. mTestMatrixImageView.setImageMatrix(matrix);
  74. showMatrixEveryValue(matrix);
  75. }
  76. //围绕原点旋转后平移
  77. //注意以下三行代码的执行顺序:
  78. //matrix.setRotate(45f);
  79. //matrix.preTranslate(-width, -height);
  80. //matrix.postTranslate(width, height);
  81. //先执行matrix.preTranslate(-width, -height);
  82. //后执行matrix.setRotate(45f);
  83. //再执行matrix.postTranslate(width, height);
  84. private void testRotateAndTranslate() {
  85. Matrix matrix = new Matrix();
  86. int width = mTestMatrixImageView.getBitmap().getWidth();
  87. int height = mTestMatrixImageView.getBitmap().getHeight();
  88. matrix.setRotate(45f);
  89. matrix.preTranslate(-width, -height);
  90. matrix.postTranslate(width, height);
  91. mTestMatrixImageView.setImageMatrix(matrix);
  92. showMatrixEveryValue(matrix);
  93. }
  94. //缩放
  95. private void testScale() {
  96. Matrix matrix = new Matrix();
  97. matrix.setScale(0.5f, 0.5f);
  98. mTestMatrixImageView.setImageMatrix(matrix);
  99. showMatrixEveryValue(matrix);
  100. }
  101. //水平倾斜
  102. private void testSkewX() {
  103. Matrix matrix = new Matrix();
  104. matrix.setSkew(0.5f, 0);
  105. mTestMatrixImageView.setImageMatrix(matrix);
  106. showMatrixEveryValue(matrix);
  107. }
  108. // 垂直倾斜
  109. private void testSkewY() {
  110. Matrix matrix = new Matrix();
  111. matrix.setSkew(0, 0.5f);
  112. mTestMatrixImageView.setImageMatrix(matrix);
  113. showMatrixEveryValue(matrix);
  114. }
  115. // 水平且垂直倾斜
  116. private void testSkewXY() {
  117. Matrix matrix = new Matrix();
  118. matrix.setSkew(0.5f, 0.5f);
  119. mTestMatrixImageView.setImageMatrix(matrix);
  120. showMatrixEveryValue(matrix);
  121. }
  122. // 水平对称--图片关于X轴对称
  123. private void testSymmetryX() {
  124. Matrix matrix = new Matrix();
  125. int height = mTestMatrixImageView.getBitmap().getHeight();
  126. float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
  127. matrix.setValues(matrixValues);
  128. //若是matrix.postTranslate(0, height);
  129. //表示将图片上下倒置
  130. matrix.postTranslate(0, height*2);
  131. mTestMatrixImageView.setImageMatrix(matrix);
  132. showMatrixEveryValue(matrix);
  133. }
  134. // 垂直对称--图片关于Y轴对称
  135. private void testSymmetryY() {
  136. Matrix matrix = new Matrix();
  137. int width=mTestMatrixImageView.getBitmap().getWidth();
  138. float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
  139. matrix.setValues(matrixValues);
  140. //若是matrix.postTranslate(width,0);
  141. //表示将图片左右倒置
  142. matrix.postTranslate(width*2, 0);
  143. mTestMatrixImageView.setImageMatrix(matrix);
  144. showMatrixEveryValue(matrix);
  145. }
  146. // 关于X=Y对称--图片关于X=Y轴对称
  147. private void testSymmetryXY() {
  148. Matrix matrix = new Matrix();
  149. int width = mTestMatrixImageView.getBitmap().getWidth();
  150. int height = mTestMatrixImageView.getBitmap().getHeight();
  151. float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
  152. matrix.setValues(matrixValues);
  153. matrix.postTranslate(width+height, width+height);
  154. mTestMatrixImageView.setImageMatrix(matrix);
  155. showMatrixEveryValue(matrix);
  156. }
  157. //获取变换矩阵Matrix中的每个值
  158. private void showMatrixEveryValue(Matrix matrix){
  159. float matrixValues []=new float[9];
  160. matrix.getValues(matrixValues);
  161. for (int i = 0; i <3; i++) {
  162. String valueString="";
  163. for (int j = 0; j < 3; j++) {
  164. valueString=matrixValues[3*i+j]+"";
  165. System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);
  166. }
  167. }
  168. }
  169. }

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, 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. public Bitmap getBitmap(){
  39. System.out.println("---> getBitmap");
  40. return mBitmap;
  41. }
  42. }

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. <TextView
    7. android:layout_width="wrap_content"
    8. android:layout_height="wrap_content"
    9. android:text="@string/hello_world" />
    10. </RelativeLayout>

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

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

    MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...

  2. Android 图片的缩放与旋转

    本文实现Android中的图片的缩放效果 首先设计布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  3. android图片拖动缩放

    这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助.android 大图片拖拽缩放 这篇就不做过多介绍了,直接上源码: public class ...

  4. iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果

    一.需求 实现imageView的缩放旋转效果,一般有两种方式: 1.底层加scrollview,利用scrollview的属性实现.(推荐这种,这是我比较后发现的,手势做缩放旋转会有点弊端) 2.利 ...

  5. Android图片的缩放效果

    一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我 ...

  6. android图片的缩放、圆角处理

    android中图片缩放方法有三种:1,bitmapFactory:2,bitmap+metrix:3,thumbUtil 方法一:bitmapFactory: public static Bitma ...

  7. Android 图片旋转(使用Matrix.setRotate方法)

    imageView2 = (ImageView) findViewById(R.id.img2); Bitmap bitmap = BitmapFactory.decodeResource(getRe ...

  8. Android 图片旋转

    拍照后的照片有时被系统旋转,纠正步骤如下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 * ...

  9. CSS3旋转缩放移动倾斜等效果——transform

    1.transform浏览器支持情况 也就是说目前不考虑老浏览器的话是不用加前缀的,感谢菜鸟教程:https://www.runoob.com/cssref/css3-pr-transform.htm ...

随机推荐

  1. 帝国cms7.0修改默认搜索模版中的分页[!--show.page--]

    修改默认搜索模版的分页是在e/class/connect.php下 搜索下function page1就是我们要修改的分页了 下面贴上我修改后的分页 //前台分页 function page1($nu ...

  2. Cinder-1 TinderBox

    Cinder:http://libcinder.org/,当前版本是0.8.5,代码托管位置:https://github.com/cinder/Cinder.git 下载Cinder之后,其目录结构 ...

  3. 字符串还可以这样初始化--uboot篇

  4. 检测目标程序ELF bit是32还是64

    android操作系统在5.0之后加入了对64位程序的支持,同时兼容运行32位的进程 android的进程绝大部分是zygote父进程fork出来的子进程 zygote进程fork出来的进程是32位进 ...

  5. Web-Scale-IT 到底是啥?

    Gartner 对 2015 年 10 大 IT 趋势的预测中有一个词条为:Web Scale IT.我们跟随 Matthias Ankli 来了解一下究竟什么是 Web Scale IT.本文译自 ...

  6. codeforces D. Multiplication Table

    http://codeforces.com/contest/448/problem/D 题意:一个n×m的矩阵,a[i][j]=i*j; 然后把a数组排序,找出第k个数. 思路:1-n×m二分枚举,然 ...

  7. 【poj1087/uva753】A Plug for UNIX(最大流)

    A Plug for UNIX   Description You are in charge of setting up the press room for the inaugural meeti ...

  8. h.264并行解码算法分析

    并行算法类型可以分为两类 Function-level Decomposition,按照功能模块进行并行 Data-level Decomposition,按照数据划分进行并行 Function-le ...

  9. Silicon Labs电容式触摸感应按键技术原理及应用

    市场上的消费电子产品已经开始逐步采用触摸感应按键,以取代传统的机械式按键.针对此趋势,Silicon Labs公司推出了内置微控制器(MCU)功能的电容式触摸感应按键(Capacitive Touch ...

  10. 15个网页设计必备的Google Chrome 扩展

    2011年第一篇,翻译自freelancefolder的一篇文章.以下为译文内容: 最近,我将Google Chrome作为了我的主力浏览器,同时,将其作为我设计和开发网页的工具,尽管我还时常会去Fi ...