在一个活动中触摸多个图像视图上的监听器

问题描述 投票:1回答:1

我想在我的活动上动态添加多个imageView,然后分别处理每个imageView上的触摸事件。我可以使用单个imageView执行此操作,如下所示:

这是活动:

public class Touch extends Activity implements OnTouchListener {
private static final String TAG = "Touch";
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
 private PointF start = new PointF();
 private PointF mid = new PointF();
 private float oldDist = 1f;

// We can be in one of these 3 states
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);
    ImageView view = (ImageView) findViewById(R.id.imageView);
    view.setOnTouchListener(this);
}

public boolean onTouch(View v, MotionEvent event)

{
    ImageView view = (ImageView) v;
    // Dump touch event to log
    dumpEvent(event);

    // Handle touch events here... 
    switch (event.getAction() & MotionEvent.ACTION_MASK)
    { 

    case MotionEvent.ACTION_DOWN:

        savedMatrix.set(matrix);
        start.set(event.getX(), event.getY());
        Log.d(TAG, "mode=DRAG" );
        mode = DRAG;
        break;

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        mode = NONE;
        Log.d(TAG, "mode=NONE" );
        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) {
            float newDist = spacing(event);
            Log.d(TAG, "newDist=" + newDist);
            if (newDist > 10f) {
            matrix.set(savedMatrix);
            float scale = newDist / oldDist;
            matrix.postScale(scale, scale, mid.x, mid.y);
            }
            }
        break;

        case MotionEvent.ACTION_POINTER_DOWN:
            oldDist = spacing(event);
            Log.d(TAG, "oldDist=" + oldDist);
            if (oldDist > 10f) {
            savedMatrix.set(matrix);
            midPoint(mid, event);
            mode = ZOOM;
            Log.d(TAG, "mode=ZOOM" );
            }
            break;
    }

    view.setImageMatrix(matrix); 
    return true; // indicate event was handled
}

/** Show an event in the LogCat view, for debugging */
private void dumpEvent(MotionEvent event) {
    String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
            "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
    StringBuilder sb = new StringBuilder();
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    sb.append("event ACTION_").append(names[actionCode]);
    if (actionCode == MotionEvent.ACTION_POINTER_DOWN
            || actionCode == MotionEvent.ACTION_POINTER_UP) {
        sb.append("(pid ").append(
                action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
        sb.append(")");
    }
    sb.append("[");
    for (int i = 0; i < event.getPointerCount(); i++) {
        sb.append("#").append(i);
        sb.append("(pid ").append(event.getPointerId(i));
        sb.append(")=").append((int) event.getX(i));
        sb.append(",").append((int) event.getY(i));
        if (i + 1 < event.getPointerCount())
            sb.append(";");
    }
    sb.append("]");
    Log.d(TAG, sb.toString());
}

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);
    }

}

这是main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout`xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/basketball"
android:scaleType="matrix"/>
</LinearLayout>

但是如果我在它下面添加另一个图像并将其宽度和高度设置为“wrap_content”,那么它只会在指定区域中移动。下面是我尝试添加多个触摸事件时得到的结果图像的链接:

https://www.dropbox.com/s/vymbsv88fqm26xx/SC20121118-231359.png

android android-imageview multi-touch
1个回答
0
投票

我希望我的下面的代码可以帮助您解决问题。在这段代码中,我使用for循环创建了一个ImageViews数组。根据触摸的图像,我向TextView添加与单击的图像对应的数字。

mImages= new ImageView[numImage];
    for (int i=0; i <numImage; i++) {
        String imgID = "imageNum" + (i+1);
        int resID = getResources().getIdentifier(imgID, "id", getActivity().getPackageName());
        mImages[i] = view.findViewById(resID);


        mImages[i].setOnTouchListener(new ImageView.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent motionEvent) {




                int msg=-1;
                //v.getId() will give you the image id
                switch(v.getId()){
                    case R.id.imageNum1:
                        if(v.getPivotX()==motionEvent.getX() && v.getPivotY()==motionEvent.getY()) {
                            msg = 1;
                        }
                        break;
                    case R.id.imageNum2:
                        msg=2;
                        break;
                    case R.id.imageNum3:
                        msg=3;
                        break;
                    case R.id.imageNum4:
                        msg=4;
                        break;
                    case R.id.imageNum5:
                        msg=5;
                        break;
                    case R.id.imageNum6:
                        msg=6;
                        break;
                    case R.id.imageNum7:
                        msg=7;
                        break;
                    case R.id.imageNum8:
                        msg=8;
                        break;
                    case R.id.imageNum9:
                        msg=9;
                        break;


                }//switch

                if(msg!=-1)
                usertextView.setText(usertextView.getText().toString()+msg);

        return true;
            }//onTouch
        });//setOnTouchlistener



    }//for
© www.soinside.com 2019 - 2024. All rights reserved.