Android Multitouch Dynamic Imageview只拖动最近添加的Imageview

时间:2015-01-14 07:20:56

标签: android imageview gesture multi-touch ontouchlistener

这是My Touch Listener Class:

public class Touch_Listner implements OnTouchListener{


// these matrices will be used to move and zoom image
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
// 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();
private float oldDist = 1f;
private float d = 0f;
private float newRot = 0f;
private float[] lastEvent = null;
public boolean onTouch(View v, MotionEvent event) {
    // handle touch events here
    ImageView view = (ImageView) v;
    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);
                float dx = event.getX() - start.x;
                float dy = event.getY() - start.y;
                matrix.postTranslate(dx, dy);
            } 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);
                }
                if (lastEvent != null && event.getPointerCount() == 3) {
                    newRot = rotation(event);
                    float r = newRot - d;
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float tx = values[2];
                    float ty = values[5];
                    float sx = values[0];
                    float xc = (view.getWidth() / 2) * sx;
                    float yc = (view.getHeight() / 2) * sx;
                    matrix.postRotate(r, tx + xc, ty + yc);
                }
            }
            break;
    }

    view.setImageMatrix(matrix);
    return true;
}

/**
 * Determine the space between the first two fingers
 */
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);
}

/**
 * Calculate the mid point of the first two fingers
 */
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);
}

/**
 * Calculate the degree to be rotated by.
 *
 * @param event
 * @return Degrees
 */
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);
}

} }

使用以下方法创建动态Imageview:

    private void Add_Imageview(final String btn_id,Bitmap resource) {
    ImageView  image = new ImageView(this);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( 
                    FrameLayout.LayoutParams.FILL_PARENT,
                    FrameLayout.LayoutParams.FILL_PARENT);

             Display display = getWindowManager().getDefaultDisplay(); 
              int width = display.getWidth();  // deprecated
              int height = display.getHeight();  // deprecated

    image.setScaleType(ImageView.ScaleType.MATRIX);
          image.setImageBitmap(resource);
          image.setTag(btn_id);
          image.setId(imgview_index);
          rel_image.addView(image);
            image.getLayoutParams().height = rel_image.getHeight();
            image.getLayoutParams().width =  rel_image.getWidth();

           int[] values = new int[2]; 
            image.getLocationOnScreen(values);
            System.out.println("x location::"+values[0]);
            System.out.println(" y location::"+values[1]);


           image.setOnTouchListener(new Touch_Listner());

}

当我不止一次调用此方法时,它只拖动最近添加的Imageview我想随时移动旋转缩放任何imageview

1 个答案:

答案 0 :(得分:1)

您可以为您的项目尝试此代码https://github.com/siddhpuraamitr/MultitouchWithDynamicAddandRemove ...