2012-02-09 4 views
2

私は、3つの機能を回転させ、ズームし、ユーザーの指で画像を1つのアプリケーションで同時に動かすことができますか? 画像とズーム機能をドラッグするソースコードが見つかりました。しかし、私はコードに回転関数を追加する方法を見つけることができません。Androidの指は、画像を一緒に回転、ズーム、移動しますか?

これらの3つの機能を一緒に構築する方法を教えることはできますか?

答えて

1

android-multitouch-controllerを使用することをおすすめします。それは私にとってうまくいっています。また、マルチタッチズーム、パン、回転も可能です。 Apache v2でライセンスされています。回転には注意してください。マルチタッチの回転は特定のデバイスでのみ有効です。

注記:回転 シナプティクスまたはシナプティクス状「2x1D」センサー(G1、myTouchの、ドロイド、ネクサス つ)としないHTC信じられないような真の2次元センサを使用する古いタッチスクリーンデバイスに風変わりであるか、またはHTC EVO 4G。

2

私のために以下のコードを試してみてください。

float[] lastEvent = null; 
float d = 0f; 
float newRot = 0f; 
private Matrix matrix = new Matrix(); 
private Matrix savedMatrix = new Matrix(); 
public static String fileNAME; 
public static int framePos = 0; 

private float scale = 0; 
private float newDist = 0; 

// Fields 
private String TAG = this.getClass().getSimpleName(); 

// We can be in one of these 3 states 
private static final int NONE = 0; 
private static final int DRAG = 1; 
private static final int ZOOM = 2; 
private int mode = NONE; 

// Remember some things for zooming 
private PointF start = new PointF(); 
private PointF mid = new PointF(); 
float oldDist = 1f; 

public boolean onTouch(View v, MotionEvent event) { 
      ImageView view = (ImageView) v; 

      // Handle touch events here... 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       savedMatrix.set(matrix); 
       start.set(event.getX(), event.getY()); 
       mode = DRAG; 
       lastEvent = null; 
       break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
       oldDist = spacing(event); 
       if (oldDist > 10f) { 
        savedMatrix.set(matrix); 
        midPoint(mid, event); 
        mode = ZOOM; 
       } 
       lastEvent = new float[4]; 
       lastEvent[0] = event.getX(0); 
       lastEvent[1] = event.getX(1); 
       lastEvent[2] = event.getY(0); 
       lastEvent[3] = event.getY(1); 
       d = rotation(event); 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
       mode = NONE; 
       lastEvent = null; 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if (mode == DRAG) { 
        // ... 
        matrix.set(savedMatrix); 
        matrix.postTranslate(event.getX() - start.x, event.getY() 
          - start.y); 
       } else if (mode == ZOOM && event.getPointerCount() == 2) { 
        float newDist = spacing(event); 
        matrix.set(savedMatrix); 
        if (newDist > 10f) { 
         float scale = newDist/oldDist; 
         matrix.postScale(scale, scale, mid.x, mid.y); 
        } 
        if (lastEvent != null) { 
         newRot = rotation(event); 
         float r = newRot - d; 
         matrix.postRotate(r, view.getMeasuredWidth()/2, 
           view.getMeasuredHeight()/2); 
        } 
       } 
       break; 
      } 

      view.setImageMatrix(matrix); 

      return true; 
     } 

//マルチタッチで画像を回転する。

private float rotation(MotionEvent event) { 
    double delta_x = (event.getX(0) - event.getX(1)); 
    double delta_y = (event.getY(0) - event.getY(1)); 
    double radians = Math.atan2(delta_y, delta_x); 

    return (float) Math.toDegrees(radians); 
} 
private float spacing(MotionEvent event) { 
     float x = event.getX(0) - event.getX(1); 
     float y = event.getY(0) - event.getY(1); 
     return FloatMath.sqrt(x * x + y * y); 
    } 

private void midPoint(PointF point, MotionEvent event) { 
     float x = event.getX(0) + event.getX(1); 
     float y = event.getY(0) + event.getY(1); 
     point.set(x/2, y/2); 
    } 
関連する問題