Advertisement
Guest User

ello, Android, 3rd Edition Touch

a guest
Mar 6th, 2012
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. /***
  2. * Excerpted from "Hello, Android",
  3. * published by The Pragmatic Bookshelf.
  4. * Copyrights apply to this code. It may not be used to create training material,
  5. * courses, books, articles, and the like. Contact us if you are in doubt.
  6. * We make no guarantees that this code is fit for any purpose.
  7. * Visit http://www.pragmaticprogrammer.com/titles/eband3 for more book information.
  8. ***/
  9. package org.example.touch;
  10.  
  11. import android.app.Activity;
  12. import android.graphics.Matrix;
  13. import android.graphics.PointF;
  14. import android.os.Bundle;
  15. import android.util.FloatMath;
  16. import android.util.Log;
  17. import android.view.MotionEvent;
  18. import android.view.View;
  19. import android.view.View.OnTouchListener;
  20. import android.widget.ImageView;
  21.  
  22. public class Touch extends Activity implements OnTouchListener {
  23. private static final String TAG = "Touch";
  24. // These matrices will be used to move and zoom image
  25. Matrix matrix = new Matrix();
  26. Matrix savedMatrix = new Matrix();
  27.  
  28. // We can be in one of these 3 states
  29. static final int NONE = 0;
  30. static final int DRAG = 1;
  31. static final int ZOOM = 2;
  32. int mode = NONE;
  33.  
  34. // Remember some things for zooming
  35. PointF start = new PointF();
  36. PointF mid = new PointF();
  37. float oldDist = 1f;
  38.  
  39. @Override
  40. public void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. setContentView(R.layout.main);
  43. ImageView view = (ImageView) findViewById(R.id.imageView);
  44. view.setOnTouchListener(this);
  45. }
  46.  
  47. public boolean onTouch(View v, MotionEvent event) {
  48. ImageView view = (ImageView) v;
  49.  
  50. // Dump touch event to log
  51. dumpEvent(event);
  52.  
  53. // Handle touch events here...
  54. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  55. case MotionEvent.ACTION_DOWN:
  56. savedMatrix.set(matrix);
  57. start.set(event.getX(), event.getY());
  58. Log.d(TAG, "mode=DRAG");
  59. mode = DRAG;
  60. break;
  61. case MotionEvent.ACTION_POINTER_DOWN:
  62. oldDist = spacing(event);
  63. Log.d(TAG, "oldDist=" + oldDist);
  64. if (oldDist > 10f) {
  65. savedMatrix.set(matrix);
  66. midPoint(mid, event);
  67. mode = ZOOM;
  68. Log.d(TAG, "mode=ZOOM");
  69. }
  70. break;
  71. case MotionEvent.ACTION_UP:
  72. case MotionEvent.ACTION_POINTER_UP:
  73. mode = NONE;
  74. Log.d(TAG, "mode=NONE");
  75. break;
  76. case MotionEvent.ACTION_MOVE:
  77. if (mode == DRAG) {
  78. // ...
  79. matrix.set(savedMatrix);
  80. matrix.postTranslate(event.getX() - start.x,
  81. event.getY() - start.y);
  82. }
  83. else if (mode == ZOOM) {
  84. float newDist = spacing(event);
  85. Log.d(TAG, "newDist=" + newDist);
  86. if (newDist > 10f) {
  87. matrix.set(savedMatrix);
  88. float scale = newDist / oldDist;
  89. matrix.postScale(scale, scale, mid.x, mid.y);
  90. }
  91. }
  92. break;
  93. }
  94.  
  95. view.setImageMatrix(matrix);
  96. return true; // indicate event was handled
  97. }
  98.  
  99. /** Show an event in the LogCat view, for debugging */
  100. private void dumpEvent(MotionEvent event) {
  101. String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
  102. "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
  103. StringBuilder sb = new StringBuilder();
  104. int action = event.getAction();
  105. int actionCode = action & MotionEvent.ACTION_MASK;
  106. sb.append("event ACTION_").append(names[actionCode]);
  107. if (actionCode == MotionEvent.ACTION_POINTER_DOWN
  108. || actionCode == MotionEvent.ACTION_POINTER_UP) {
  109. sb.append("(pid ").append(
  110. action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
  111. sb.append(")");
  112. }
  113. sb.append("[");
  114. for (int i = 0; i < event.getPointerCount(); i++) {
  115. sb.append("#").append(i);
  116. sb.append("(pid ").append(event.getPointerId(i));
  117. sb.append(")=").append((int) event.getX(i));
  118. sb.append(",").append((int) event.getY(i));
  119. if (i + 1 < event.getPointerCount())
  120. sb.append(";");
  121. }
  122. sb.append("]");
  123. Log.d(TAG, sb.toString());
  124. }
  125.  
  126. /** Determine the space between the first two fingers */
  127. private float spacing(MotionEvent event) {
  128. float x = event.getX(0) - event.getX(1);
  129. float y = event.getY(0) - event.getY(1);
  130. return FloatMath.sqrt(x * x + y * y);
  131. }
  132.  
  133. /** Calculate the mid point of the first two fingers */
  134. private void midPoint(PointF point, MotionEvent event) {
  135. float x = event.getX(0) + event.getX(1);
  136. float y = event.getY(0) + event.getY(1);
  137. point.set(x / 2, y / 2);
  138. }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement