Android多點觸控

jopen 10年前發布 | 17K 次閱讀 Android Android開發 移動開發

可對圖片進行縮放和移動 但是移動的只是內容圖片,ImageView是固定的,自己定義的。

public class MainActivity extends Activity implements OnTouchListener {
    // 放大縮小
    Matrix matrix = new Matrix();
    Matrix savedMatrix = new Matrix();

PointF start = new PointF();
PointF mid = new PointF();
float oldDist;

private ImageView myImageView;

// 模式
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myImageView = (ImageView) findViewById(R.id.iv_image);
    myImageView.setOnTouchListener(this);

}

@Override
public boolean onTouch(View v, MotionEvent event) {
    ImageView myImageView = (ImageView) v;
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    // 設置拖拉模式
    case MotionEvent.ACTION_DOWN:
        Log.i("point", "action_pointer_down");
        matrix.set(myImageView.getImageMatrix());
        savedMatrix.set(matrix);
        start.set(event.getX(), event.getY());
        mode = DRAG;
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
        mode = NONE;
        break;

    // 設置多點觸摸模式
    case MotionEvent.ACTION_POINTER_DOWN:
        oldDist = spacing(event);
        if (oldDist > 10f) {
            savedMatrix.set(matrix);
            midPoint(mid, event);
            mode = ZOOM;
        }
        break;
    // 若為DRAG模式,則點擊移動圖片
    case MotionEvent.ACTION_MOVE:
        if (mode == DRAG) {
            matrix.set(savedMatrix);
            matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
        }
        // 若為ZOOM模式,則點擊觸摸縮放
        else if (mode == ZOOM) {
            float newDist = spacing(event);
            if (newDist > 10f) {
                matrix.set(savedMatrix);
                float scale = newDist / oldDist;
                // 設置碩放比例和圖片的中點位置
                matrix.postScale(scale, scale, mid.x, mid.y);
            }
        }
        break;
    }
    myImageView.setImageMatrix(matrix);
    return true;
}

// 計算移動距離
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);
}

}</pre>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="

<ImageView
    android:id="@+id/iv_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="matrix"
    android:src="@drawable/koala" />

</LinearLayout></pre></span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!