Guest User

Untitled

a guest
Apr 23rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.97 KB | None | 0 0
  1. imageView.setOnTouchListener(new onClick());
  2.  
  3. class onClick implements View.OnTouchListener {
  4. // these matrices will be used to move and zoom image
  5. private Matrix matrix = new Matrix();
  6. private Matrix savedMatrix = new Matrix();
  7. // we can be in one of these 3 states
  8. private static final int NONE = 0;
  9. private static final int DRAG = 1;
  10. private static final int ZOOM = 2;
  11. private int mode = NONE;
  12. // remember some things for zooming
  13. private PointF start = new PointF();
  14. private PointF mid = new PointF();
  15. private float oldDist = 1f;
  16. private float d = 0f;
  17. private float newRot = 0f;
  18. private float[] lastEvent = null;
  19.  
  20. @Override
  21. public boolean onTouch(View v, MotionEvent event) {
  22. // handle touch events here
  23. ImageView view = (ImageView) v;
  24. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  25. case MotionEvent.ACTION_DOWN:
  26. savedMatrix.set(matrix);
  27. start.set(event.getX(), event.getY());
  28. mode = DRAG;
  29. lastEvent = null;
  30. break;
  31. case MotionEvent.ACTION_POINTER_DOWN:
  32. oldDist = spacing(event);
  33. if (oldDist > 10f) {
  34. savedMatrix.set(matrix);
  35. midPoint(mid, event);
  36. mode = ZOOM;
  37. }
  38. lastEvent = new float[4];
  39. lastEvent[0] = event.getX(0);
  40. lastEvent[1] = event.getX(1);
  41. lastEvent[2] = event.getY(0);
  42. lastEvent[3] = event.getY(1);
  43. d = rotation(event);
  44. break;
  45. case MotionEvent.ACTION_UP:
  46. case MotionEvent.ACTION_POINTER_UP:
  47. mode = NONE;
  48. lastEvent = null;
  49. break;
  50. case MotionEvent.ACTION_MOVE:
  51. if (mode == DRAG) {
  52. matrix.set(savedMatrix);
  53. float dx = event.getX() - start.x;
  54. float dy = event.getY() - start.y;
  55. matrix.postTranslate(dx, dy);
  56. } else if (mode == ZOOM) {
  57. float newDist = spacing(event);
  58. if (newDist > 10f) {
  59. matrix.set(savedMatrix);
  60. float scale = (newDist / oldDist);
  61. matrix.postScale(scale, scale, mid.x, mid.y);
  62. }
  63. if (lastEvent != null && event.getPointerCount() == 3) {
  64. newRot = rotation(event);
  65. float r = newRot - d;
  66. float[] values = new float[9];
  67. matrix.getValues(values);
  68. float tx = values[2];
  69. float ty = values[5];
  70. float sx = values[0];
  71. float xc = (view.getWidth() / 2) * sx;
  72. float yc = (view.getHeight() / 2) * sx;
  73. matrix.postRotate(r, tx + xc, ty + yc);
  74. }
  75. }
  76. break;
  77. }
  78.  
  79. view.setImageMatrix(matrix);
  80. return true;
  81. }
  82.  
  83. private float spacing(MotionEvent event) {
  84. float x = event.getX(0) - event.getX(1);
  85. float y = event.getY(0) - event.getY(1);
  86. return (float)Math.sqrt(x * x + y * y);
  87. }
  88.  
  89. /**
  90. * Calculate the mid point of the first two fingers
  91. */
  92. private void midPoint(PointF point, MotionEvent event) {
  93. float x = event.getX(0) + event.getX(1);
  94. float y = event.getY(0) + event.getY(1);
  95. point.set(x / 2, y / 2);
  96. }
  97.  
  98. /**
  99. * Calculate the degree to be rotated by.
  100. *
  101. * @param event
  102. * @return Degrees
  103. */
  104. private float rotation(MotionEvent event) {
  105. double delta_x = (event.getX(0) - event.getX(1));
  106. double delta_y = (event.getY(0) - event.getY(1));
  107. double radians = Math.atan2(delta_y, delta_x);
  108. return (float) Math.toDegrees(radians);
  109. }
  110. }
Add Comment
Please, Sign In to add comment