Facebook
From Scorching Wigeon, 1 Week ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 24
  1. package com.example.simplegestures;
  2.         import android.app.Activity;
  3.         import android.graphics.Matrix;
  4.         import android.graphics.PointF;
  5.         import android.os.Bundle;
  6.         import android.util.FloatMath;
  7.         import android.view.MotionEvent;
  8.         import android.view.View;
  9.         import android.view.View.OnTouchListener;
  10.         import android.widget.ImageView;
  11.  
  12. public class MainActivity extends Activity implements OnTouchListener {
  13.     private Matrix matrix = new Matrix();
  14.     private Matrix savedMatrix = new Matrix();
  15.     private static final int NONE = 0;
  16.     private static final int DRAG = 1;
  17.     private static final int ZOOM = 2;
  18.     private int mode = NONE;
  19.     private PointF start = new PointF();
  20.     private PointF mid = new PointF();
  21.     private float oldDist = 1f;
  22.     private float d = 0f;
  23.     private float newRot = 0f;
  24.     private float[] lastEvent = null;
  25.  
  26.     @Override
  27.     public void onCreate(Bundle savedInstanceState) {
  28.         super.onCreate(savedInstanceState);
  29.         setContentView(R.layout.activity_main);
  30.         ImageView view = (ImageView) findViewById(R.id.imageView);
  31.         view.setOnTouchListener(this);
  32.     }
  33.  
  34.     public boolean onTouch(View v, MotionEvent event) {
  35.         ImageView view = (ImageView) v;
  36.         switch (event.getAction() & MotionEvent.ACTION_MASK) {
  37.             case MotionEvent.ACTION_DOWN:
  38.                 savedMatrix.set(matrix);
  39.                 start.set(event.getX(), event.getY());
  40.                 mode = DRAG;
  41.                 lastEvent = null;
  42.                 break;
  43.             case MotionEvent.ACTION_POINTER_DOWN:
  44.                 oldDist = spacing(event);
  45.                 if (oldDist > 10f) {
  46.                     savedMatrix.set(matrix);
  47.                     midPoint(mid, event);
  48.                     mode = ZOOM;
  49.                 }
  50.                 lastEvent = new float[4];
  51.                 lastEvent[0] = event.getX(0);
  52.                 lastEvent[1] = event.getX(1);
  53.                 lastEvent[2] = event.getY(0);
  54.                 lastEvent[3] = event.getY(1);
  55.                 d = rotation(event);
  56.                 break;
  57.             case MotionEvent.ACTION_UP:
  58.             case MotionEvent.ACTION_POINTER_UP:
  59.                 mode = NONE;
  60.                 lastEvent = null;
  61.                 break;
  62.             case MotionEvent.ACTION_MOVE:
  63.                 if (mode == DRAG) {
  64.                     matrix.set(savedMatrix);
  65.                     float dx = event.getX() - start.x;
  66.                     float dy = event.getY() - start.y;
  67.                     matrix.postTranslate(dx, dy);
  68.                 } else if (mode == ZOOM) {
  69.                     float newDist = spacing(event);
  70.                     if (newDist > 10f) {
  71.                         matrix.set(savedMatrix);
  72.                         float scale = (newDist / oldDist);
  73.                         matrix.postScale(scale, scale, mid.x, mid.y);
  74.                     }
  75.                     if (lastEvent != null && event.getPointerCount() == 2) {
  76.                         newRot = rotation(event);
  77.                         float r = newRot - d;
  78.                         float[] values = new float[9];
  79.                         matrix.getValues(values);
  80.                         float tx = values[2];
  81.                         float ty = values[5];
  82.                         float sx = values[0];
  83.                         float xc = (view.getWidth() / 2) * sx;
  84.                         float yc = (view.getHeight() / 2) * sx;
  85.                         matrix.postRotate(r, tx + xc, ty + yc);
  86.                     }
  87.                 }
  88.                 break;
  89.         }
  90.  
  91.         view.setImageMatrix(matrix);
  92.         return true;
  93.     }
  94.     private float spacing(MotionEvent event) {
  95.         float x = event.getX(0) - event.getX(1);
  96.         float y = event.getY(0) - event.getY(1);
  97.         return (float)Math.sqrt(x * x + y * y);
  98.     }
  99.     private void midPoint(PointF point, MotionEvent event) {
  100.         float x = event.getX(0) + event.getX(1);
  101.         float y = event.getY(0) + event.getY(1);
  102.         point.set(x / 2, y / 2);
  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. }
  111.