1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="horizontal" >
  6. <!-- 定义TextView的文本标签 -->
  7. <TextView
  8. android:id="@+id/Tv"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. android:text="点击屏幕,隐藏或显示导航栏!" />
  12. </RelativeLayout>
  1. MyView.java
  1. package com.example.yanlei.yl;
  2.  
  3. import android.app.Activity;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Matrix;
  8. import android.graphics.PointF;
  9. import android.util.DisplayMetrics;
  10. import android.util.FloatMath;
  11. import android.view.MotionEvent;
  12. import android.widget.ImageView;
  13. //自定义MyView类继承自ImageView
  14. public class MyView extends ImageView {
  15. private float x_down = 0;
  16. private float y_down = 0;
  17. //起始点的坐标
  18. private PointF start = new PointF();
  19. //中心点的坐标
  20. private PointF mid = new PointF();
  21. private float oldDist = 1f;
  22. private float oldRotation = 0;
  23. private Matrix matrix = new Matrix();
  24. private Matrix matrix1 = new Matrix();
  25. private Matrix savedMatrix = new Matrix();
  26.  
  27. private static final int NONE = 0;
  28. private static final int DRAG = 1;
  29. private static final int ZOOM = 2;
  30. private int mode = NONE;
  31.  
  32. private boolean matrixCheck = false;
  33.  
  34. //记录当前屏幕的宽度
  35. private int widthScreen;
  36. //记录当前屏幕的高度
  37. private int heightScreen;
  38.  
  39. //在页面中显示的Bitmap图片
  40. private Bitmap kenan;
  41.  
  42. public MyView(Activity activity) {
  43. super(activity);
  44. //通过Bitampfactory读取drawable目录下的kenan资源
  45. kenan = BitmapFactory.
  46. decodeResource(getResources(), R.drawable.kenan);
  47.  
  48. //定义图片一个显示矩阵
  49. DisplayMetrics dm = new DisplayMetrics();
  50. //得到当前屏幕的显示矩阵存入dm变量
  51. activity.getWindowManager().
  52. getDefaultDisplay().getMetrics(dm);
  53. //通过显示矩阵得到当前屏幕的宽度和高度的像素值
  54. widthScreen = dm.widthPixels;
  55. heightScreen = dm.heightPixels;
  56.  
  57. matrix = new Matrix();
  58. }
  59.  
  60. //显示view的时候回调onDraw
  61. protected void onDraw(Canvas canvas) {
  62. //首先保存当前页面已有的图像
  63. canvas.save();
  64. //按照当前的矩阵绘制kenan图片
  65. canvas.drawBitmap(kenan, matrix, null);
  66. //画图板恢复
  67. canvas.restore();
  68. }
  69.  
  70. //当用户触摸此视图的时候回调次方法
  71. public boolean onTouchEvent(MotionEvent event) {
  72. //得到touch的事件类型
  73. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  74. case MotionEvent.ACTION_DOWN:
  75. //当按下屏幕时,记录当前的状态为拖动
  76. mode = DRAG;
  77. //记录xy坐标
  78. x_down = event.getX();
  79. y_down = event.getY();
  80. //保存当前的矩阵
  81. savedMatrix.set(matrix);
  82. break;
  83. case MotionEvent.ACTION_POINTER_DOWN:
  84. //多个手指触摸的状态
  85. mode = ZOOM;
  86. //记录之前的两手指间距
  87. oldDist = spacing(event);
  88. //记录之前的角度
  89. oldRotation = rotation(event);
  90. //保存当前的图片矩阵
  91. savedMatrix.set(matrix);
  92. //得到旋转的中心点
  93. midPoint(mid, event);
  94. break;
  95. case MotionEvent.ACTION_MOVE:
  96. //当手指移动时的状态
  97. if (mode == ZOOM) {
  98. //缩放并且平移
  99. matrix1.set(savedMatrix);
  100. //得到旋转的角度
  101. float rotation =
  102. rotation(event) - oldRotation;
  103. //得到距离
  104. float newDist = spacing(event);
  105. //得到放大倍数
  106. float scale = newDist / oldDist;
  107. //缩放倍数
  108. matrix1.postScale(scale, scale, mid.x, mid.y);
  109. //得到旋转角度
  110. matrix1.postRotate(rotation, mid.x, mid.y);
  111. //得到图片是否出边界
  112. matrixCheck = matrixCheck();
  113. if (matrixCheck == false) {
  114. matrix.set(matrix1);
  115. invalidate();
  116. }
  117. } else if (mode == DRAG) {
  118. //平行移动
  119. matrix1.set(savedMatrix);
  120. matrix1.postTranslate(event.getX() - x_down
  121. , event.getY() - y_down);// 平移
  122. matrixCheck = matrixCheck();
  123. matrixCheck = matrixCheck();
  124. if (matrixCheck == false) {
  125. matrix.set(matrix1);
  126. invalidate();
  127. }
  128. }
  129. break;
  130. case MotionEvent.ACTION_UP:
  131. case MotionEvent.ACTION_POINTER_UP:
  132. mode = NONE;
  133. break;
  134. }
  135. return true;
  136. }
  137.  
  138. //对图片的矩阵进行检测
  139. private boolean matrixCheck() {
  140. float[] f = new float[9];
  141. matrix1.getValues(f);
  142. // 图片4个顶点的坐标
  143. float x1 = f[0] * 0 + f[1] * 0 + f[2];
  144. float y1 = f[3] * 0 + f[4] * 0 + f[5];
  145. float x2 = f[0] * kenan.getWidth()
  146. + f[1] * 0 + f[2];
  147. float y2 = f[3] * kenan.getWidth()
  148. + f[4] * 0 + f[5];
  149. float x3 = f[0] * 0 + f[1] *
  150. kenan.getHeight() + f[2];
  151. float y3 = f[3] * 0 + f[4] *
  152. kenan.getHeight() + f[5];
  153. float x4 = f[0] * kenan.getWidth() +
  154. f[1] * kenan.getHeight() + f[2];
  155. float y4 = f[3] * kenan.getWidth() +
  156. f[4] * kenan.getHeight() + f[5];
  157. // 图片现宽度
  158. double width = Math.sqrt((x1 - x2) *
  159. (x1 - x2) + (y1 - y2) * (y1 - y2));
  160. // 缩放比率判断
  161. if (width < widthScreen / 3 || width > widthScreen * 3) {
  162. return true;
  163. }
  164. // 出界判断
  165. if ((x1 < widthScreen / 3 && x2 < widthScreen / 3
  166. && x3 < widthScreen / 3
  167. && x4 < widthScreen / 3)
  168. || (x1 > widthScreen * 2 / 3
  169. && x2 > widthScreen * 2 / 3
  170. && x3 > widthScreen * 2 / 3
  171. && x4 > widthScreen * 2 / 3)
  172. || (y1 < heightScreen / 3
  173. && y2 < heightScreen / 3
  174. && y3 < heightScreen / 3
  175. && y4 < heightScreen / 3)
  176. || (y1 > heightScreen * 2 / 3
  177. && y2 > heightScreen * 2 / 3
  178. && y3 > heightScreen * 2 / 3
  179. && y4 > heightScreen * 2 / 3)) {
  180. return true;
  181. }
  182. return false;
  183. }
  184.  
  185. // 触碰两点间距离
  186. private float spacing(MotionEvent event) {
  187. //通过三角函数得到两点间的距离
  188. float x = event.getX(0) - event.getX(1);
  189. float y = event.getY(0) - event.getY(1);
  190. return FloatMath.sqrt(x * x + y * y);
  191. }
  192.  
  193. // 取手势中心点
  194. private void midPoint(PointF point, MotionEvent event) {
  195. //得到手势中心点的位置
  196. float x = event.getX(0) + event.getX(1);
  197. float y = event.getY(0) + event.getY(1);
  198. point.set(x / 2, y / 2);
  199. }
  200.  
  201. // 取旋转角度
  202. private float rotation(MotionEvent event) {
  203. //得到两个手指间的旋转角度
  204. double delta_x = (event.getX(0) - event.getX(1));
  205. double delta_y = (event.getY(0) - event.getY(1));
  206. double radians = Math.atan2(delta_y, delta_x);
  207. return (float) Math.toDegrees(radians);
  208. }
  209. }
  1. MainActivity
  1. package com.example.yanlei.yl;
  2.  
  3. import android.graphics.Color;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6.  
  7. import android.view.Menu;
  8. import android.view.MenuItem;
  9. import android.widget.TextView;
  10. import android.text.Html;
  11. import android.text.Html.ImageGetter;
  12.  
  13. import java.util.regex.Matcher;
  14. import java.util.regex.Pattern;
  15.  
  16. import android.text.Editable;
  17. import android.text.TextWatcher;
  18. import android.widget.EditText;
  19. import android.widget.Button;
  20.  
  21. import android.app.Activity;
  22. import android.content.Intent;
  23.  
  24. import android.view.MotionEvent;
  25. import android.widget.TextView;
  26. import android.view.Window;
  27. import android.view.WindowManager;
  28.  
  29. public class MainActivity extends AppCompatActivity {
  30. //定义TextView对象
  31. private TextView Tv;
  32.  
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. //定义自定义View的对象
  37. MyView myview = new MyView(this);
  38. //设置当前页面的视图为自定义的myview
  39. setContentView(myview);
  40.  
  41. }
  42.  
  43. }

android 图片的平移,缩放和旋转的更多相关文章

  1. Android 图片的平移和镜面和倒影效果

    在前面的文章中陆续介绍了图片的旋转与缩放,本文继续介绍关于图片的操作 图片的平移 使用下面的代码将图水平竖直方向平移10个像素 matrix.setTranslate(10, 10); 可以看到图片不 ...

  2. 使用C#进行图片转换格式,缩放,自动旋转,保留exif(转载)

    这几天心血来潮做了一个批量图片缩放,转换格式,并且可以根据exif的信息旋转图片,校正exif信息后保存的小程序.根据配置文件 指定需要的功能. 1 2 3 4 5 6 7 8 9 10 11 12 ...

  3. 23.Quick QML-简单且好看的图片浏览器-支持多个图片浏览、缩放、旋转、滑轮切换图片

    之前我们已经学习了Image.Layout布局.MouseArea.Button.GroupBox.FileDialog等控件. 所以本章综合之前的每章的知识点,来做一个图片浏览器,使用的Qt版本为Q ...

  4. android图片透明度跟缩放大小动画事件

    概序 : 动画事件写在xml中,然后用AnimationUtils去加载动画事件,再监听动画结束事件,隐藏imageview. 1. player_double_click_animation.xml ...

  5. android图片等比例缩放 填充屏幕

    在ImageView的t同事设置两个属性 android:adjustViewBounds="true"android:scaleType="fitXY"

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

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

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

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

  8. Android动画及图片的缩放和旋转

    Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说Tween动画吧. Tween动画是对视图对象中的内容进行一系列简单的转换,比如位置的移动 ...

  9. 【C#/WPF】Image图片的Transform变换:平移、缩放、旋转

    WPF中图像控件Image的变换属性Transform: 平移 缩放 旋转 即要想实现图片的平移.缩放.旋转,是修改它所在的Image控件的Transform变换属性. 下面在XAML中定义了Imag ...

随机推荐

  1. [CODEVS] 2189 数字三角形W

    数字三角形 要求走到最后mod 100最大 可达性DP(好像是这样叫) 用bool数组f[i][j][k]表示 位置(i,j)能否得到k(mod 100意义下) 转移条件 f[i][j][k]=f[i ...

  2. 【Java_多线程并发编程】基础篇——synchronized关键字

    1. synchronized同步锁的原理 当我们调用某对象的synchronized方法或代码块时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了“obj这个对象”的同步锁 ...

  3. 目录扫描工具DirBuster

    DirBuster是用来探测web服务器上的目录和隐藏文件的.因为DirBuster是采用java编写的,所以运行前要安装上java的环境. 来看一下基本的使用: ①:TargetURL下输入要探测网 ...

  4. ZZULIoj 1907 小火山的宝藏收益

    Description      进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通.   每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这 ...

  5. bash中的算术运算

    bash中的算术运算     +, -, *, /, %     实现算术运算:         (1) let var=算术表达式          (2) var=$[算术表达式]         ...

  6. PowerShell-第1章 交互界面

    1.1运行程序.脚本和已有的工具: Program.exe arguments ScriptName.ps1 arguments BatchFile.cmd arguments 如果运行的命令名中包含 ...

  7. python基础学习笔记——time模块

    time模块 time翻译过来就是时间,有我们其实在之前编程的时候有用到过. #常用方法 1.time.sleep(secs) (线程)推迟指定的时间运行.单位为秒. 2.time.time() 获取 ...

  8. java读写串口数据

    本博文参考自https://www.cnblogs.com/Dreamer-1/p/5523046.html 最近接触到了串口及其读写,在此记录java进行串口读写的过程. 1.导入串口支持包 需要下 ...

  9. windons杀死8080进程

    1,netstat -aon|findstr "8080" //8080端口号 2,taskkill -PID 2976 -F //2976 ,8080端口号对应的进程号

  10. HDU 3947 River Problem

    River Problem Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...