Guest User

Untitled

a guest
Aug 14th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. Custom image view breaks in Honeycomb
  2. public class CustomMapView extends View {
  3.  
  4. Bitmap map;
  5.  
  6. // These matrices will be used to move and zoom image
  7. Matrix matrix = new Matrix();
  8. Matrix savedMatrix = new Matrix();
  9.  
  10. // We can be in one of these 3 states
  11. static final int NONE = 0;
  12. static final int DRAG = 1;
  13. static final int ZOOM = 2;
  14. private static final float LOWER_BOUND = 0;
  15. int mode = NONE;
  16.  
  17. PointF start = new PointF();
  18. PointF mid = new PointF();
  19. float oldDist = 0;
  20. private int width;
  21. private int height;
  22.  
  23. public CustomMapView(final Context context, AttributeSet attrs) throws NoMapDefinedException {
  24. super(context, attrs);
  25.  
  26.  
  27. // currently grabbing from assets directory, but same artifacts appear when
  28. // grabbing from a drawable
  29. AssetManager assets = context.getResources().getAssets();
  30. InputStream buffer = null;
  31. try {
  32. buffer = new BufferedInputStream((assets.open("images/custom_map.jpg")));
  33. map = BitmapFactory.decodeStream(buffer);
  34. } catch (IOException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }
  39.  
  40. public final void zoomOut() {
  41. float scale = 0.9f;
  42. matrix.postScale(scale, scale, mid.x, mid.y);
  43. invalidate();
  44. }
  45.  
  46. public final void zoomIn() {
  47. float scale = 1.1f;
  48. matrix.postScale(scale, scale, mid.x, mid.y);
  49. invalidate();
  50. }
  51.  
  52. @Override
  53. protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  54. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  55.  
  56. int width = MeasureSpec.getSize(widthMeasureSpec);
  57. int height = MeasureSpec.getSize(heightMeasureSpec);
  58.  
  59. if (height > 0) {
  60. this.setMeasuredDimension(width, height);
  61. this.width = width;
  62. this.height = height;
  63. }
  64. }
  65.  
  66. @Override
  67. protected void onDraw(Canvas canvas) {
  68. super.onDraw(canvas);
  69. canvas.drawBitmap(map, matrix, new Paint());
  70. }
  71.  
  72.  
  73. @Override
  74. public boolean onTouchEvent(MotionEvent event) {
  75. // Handle touch events here...
  76. campusMapInterface.hideKey();
  77. switch (event.getAction() & MotionEvent.ACTION_MASK) {
  78. case MotionEvent.ACTION_DOWN:
  79. savedMatrix.set(matrix);
  80. start.set(event.getX(), event.getY());
  81. mode = DRAG;
  82. break;
  83. case MotionEvent.ACTION_UP:
  84. case MotionEvent.ACTION_POINTER_UP:
  85. mode = NONE;
  86. break;
  87. case MotionEvent.ACTION_MOVE:
  88. if (mode == DRAG) {
  89. matrix.set(savedMatrix);
  90. matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
  91. } else if (mode == ZOOM) {
  92. float newDist = spacing(event);
  93. if (newDist > 10f) {
  94. matrix.set(savedMatrix);
  95. float scale = newDist / oldDist;
  96. matrix.postScale(scale, scale, mid.x, mid.y);
  97. }
  98. }
  99. break;
  100. case MotionEvent.ACTION_POINTER_DOWN:
  101. oldDist = spacing(event);
  102. if (oldDist > 10f) {
  103. savedMatrix.set(matrix);
  104. midPoint(mid, event);
  105. mode = ZOOM;
  106. }
  107. break;
  108. }
  109. invalidate();
  110. return true; // indicate event was handled
  111. }
  112.  
  113. private float spacing(MotionEvent event) {
  114. float x = event.getX(0) - event.getX(1);
  115. float y = event.getY(0) - event.getY(1);
  116. return FloatMath.sqrt((x * x) + (y * y));
  117. }
  118.  
  119. private void midPoint(PointF point, MotionEvent event) {
  120. float x = event.getX(0) + event.getX(1);
  121. float y = event.getY(0) + event.getY(1);
  122. point.set(x / 2, y / 2);
  123. }
  124.  
  125.  
  126. }
Add Comment
Please, Sign In to add comment