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

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

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>

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

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

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  2. Android清理设备内存具体完整演示样例(二)

    版权声明: https://blog.csdn.net/lfdfhl/article/details/27672913 MainActivity例如以下: package cc.c; import j ...

  3. FutureTask使用完整演示样例

    MainActivity例如以下: package cc.cv; import java.util.concurrent.FutureTask; import android.os.Bundle; i ...

  4. 通过Canvas及File API缩放并上传图片完整演示样例

    创建一个只管的用户界面,并同意你控制图片的大小.上传到server端的数据,并不须要处理enctype为 multi-part/form-data 的情况.只一个简单的POST表单处理程序就能够了. ...

  5. Android清理设备内存具体完整演示样例(一)

    MainActivity例如以下: package come.on; import android.app.Activity; import android.content.Context; impo ...

  6. Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1

    在大学期间我做过非常多类似这种APP.这个是我们小组之前做的,我后期增加非常多新元素.完好了这个应用,由于为了加强 专业技术嘛.也是常常熬夜写些小东西,嘿嘿.只是还算不错.起码技术长进了不少嘛,还是非 ...

  7. Android利用Volley异步载入数据完整具体演示样例(二)

    MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import ...

  8. 10分钟理解Android数据库的创建与使用(附具体解释和演示样例代码)

    1.Android数据库简单介绍. Android系统的framework层集成了Sqlite3数据库.我们知道Sqlite3是一种轻量级的高效存储的数据库. Sqlite数据库具有以下长处: (1) ...

  9. Android模糊演示样例-RenderScript-附效果图与代码

    本文链接    http://blog.csdn.net/xiaodongrush/article/details/31031411 參考链接    Android高级模糊技术    http://s ...

随机推荐

  1. 阅读《Android 从入门到精通》(15)——数字时钟

    数字时钟(DigitalClock) java.lang.Object; android.view.View; android.widget.TextView; android.widget.Digi ...

  2. 【万里征程——Windows App开发】控件大集合2

    以下再来看看一些前面还没有讲过的控件,只是控件太多以至于无法所有列出来,大家仅仅好举一反三啦. Button 前面最经常使用的控件就是Button啦,Button另一个有意思的属性呢.当把鼠标指针放在 ...

  3. [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)

    题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...

  4. [JZOJ 100026] [NOIP2017提高A组模拟7.7] 图 解题报告 (倍增)

    题目链接: http://172.16.0.132/senior/#main/show/100026 题目: 有一个$n$个点$n$条边的有向图,每条边为$<i,f(i),w(i)>$,意 ...

  5. Edge 浏览器

    Edge浏览器设计理念 无法播放:https://edgewelcomecdn.microsoft.com/site/images/tabs/rs3/tabs_screen.acd367a2.mp4 ...

  6. jQuery学习(七)——使用JQ完成下拉列表左右选择

    1.需求:实现以下功能 2.步骤分析: 第一步:确定事件(鼠标单击事件click) 第二步:获取左侧下拉列表被选中的option($(“#left option:selected”)) [假设左侧se ...

  7. ASP.NET使用MergeInto做数据同步,同步SQLSERVER不同数据库的相同表结构的数据

    public string SynchronousData() { ReturnJson Rejson = new ReturnJson(); //将WebConfig中的数据库连接name中的值写进 ...

  8. java 获取线程id

    如何获取正在运行的线程的ID? 解决方法 下面的示例演示如何使用getThreadId() 方法一个正在运行线程的ID. public class Main extends Object implem ...

  9. cuda float atomic操作

    atomic add.用第二个,暂时还没弄明白 #ifdef FLOAT #define T float #else #define T int #endif #ifdef FORUM __devic ...

  10. hadoop从wordCount开始

    最近一段时间大数据很火,我有稍微有点java基础,自然选择了由java编写的hadoop框架,wordCount是hadoop中类似于java中helloWorld的存在,自然不能错过. packag ...