How to detect single touch as well as multi-touch in onTouchEvent()

后端 未结 7 1976
眼角桃花
眼角桃花 2020-12-29 11:19

I used the following code to detect the single finger touch and double finger touch. The code detects the double finger touch (when count==2).

I need t

7条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-29 11:42

    You checked that ACTION_DOWN but at the same time you also need to check ACTION_POINTER_DOWN, which makes sense more clear. try it

     @Override
        public boolean onTouchEvent(MotionEvent event) {    
             scaleGestureDetector.onTouchEvent(event);
    
             int action = event.getAction();
    
             if( (action == MotionEvent.ACTION_DOWN) && (action != MotionEvent.ACTION_POINTER_DOWN))
                 // Single touch
            else if ( action == MotionEvent.ACTION_POINTER_DOWN)
                //multi touch
    
            return true;
    }   
    

    Edited

    boolean multiTouch=false;
     @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
    
        int index= event.getActionIndex();
        int action = event.getAction();
    
        if( index ==1)
        {
            multiTouch=true;
            System.out.println("mutli");
        }
        else if (multiTouch==false)
            System.out.println("single");
        //else if (action== MotionEvent.ACTION_POINTER_1_UP)
        //  multiTouch=false;
        else if (action== MotionEvent.ACTION_MOVE && multiTouch)
            System.out.println("mutli");
        else if (action== MotionEvent.ACTION_MOVE && !multiTouch)
            System.out.println("single");
    
            return super.onTouchEvent(event);
    }
    

    EDITED:

     package com.pinch.detect;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.ContextWrapper;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.util.FloatMath;
    import android.util.Log;
    import android.view.Display;
    import android.view.MotionEvent;
    import android.view.ScaleGestureDetector;
    import android.view.View;
    import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
    import android.view.View.OnClickListener;
    import android.view.View.OnTouchListener;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class PinchDetectorActivity extends Activity {
        TextView textGestureAction;
        ImageView img1, img2;
        static Bitmap bm, bm1;
    
    boolean multiTouch = false;
    Context context;
    float scaleFactor = 0.0f;
    float lastscale;
    int scr_width, scr_height;
    Display display;
    private ScaleGestureDetector scaleGestureDetector;
    
    /** Called when the activity is first created. */
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textGestureAction = (TextView) findViewById(R.id.GestureAction);
        img1 = (ImageView) findViewById(R.id.img_left);
        img2 = (ImageView) findViewById(R.id.img_right);
        display = getWindowManager().getDefaultDisplay();
    
        scr_width = display.getWidth();
        scr_height = display.getHeight();
        Log.v("width >>", Integer.toString(scr_width));
        Log.v("height >>", Integer.toString(scr_height));
    
        bm = BitmapFactory.decodeResource(this.getResources(),
                R.drawable.fiction1);
        img1.setImageBitmap(bm);
        bm1 = BitmapFactory.decodeResource(this.getResources(),
                R.drawable.fiction2);
        img2.setImageBitmap(bm1);
        img1.setScaleType(ImageView.ScaleType.FIT_START);
        img2.setScaleType(ImageView.ScaleType.FIT_END);
    
        scaleGestureDetector = new ScaleGestureDetector(this,
                new MySimpleOnScaleGestureListener());
    
    
    
        img1.setOnTouchListener(new OnTouchListener(){
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                system.out.println("Image 1 touched");
                return false;
            }
    
        });
    
    
    
    img2.setOnTouchListener(new OnTouchListener(){
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                system.out.println("Image 2 touched");
                return false;
            }
    
        });
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    
        scaleGestureDetector.onTouchEvent(event);
        int index = event.getActionIndex();
        Log.v("Index value ",index+"");
        int action = event.getAction();
    
        if (index == 1) {
            multiTouch = true;
            System.out.println("mutli1");
        } else if (multiTouch == false) {
            System.out.println("single1");
            img1.onTouch(view, event);
    
        }
    
         else if (action == MotionEvent.ACTION_MOVE && multiTouch) {
            System.out.println("mutli2");
             img2.onTouch(view, event);
    
            if (scaleFactor > 1) {
    
                Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
                        scr_width / 2, scr_height, true);
                img1.setImageBitmap(resizedbitmap);
                Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
                        scr_width / 2, scr_height, true);
                img2.setImageBitmap(resizedbitmap1);
                Log.v("width >>", Integer.toString(scr_width));
                Log.v("height >>", Integer.toString(scr_height));
    
            } else if(scaleFactor<1){
    
                Log.v("width >>", Integer.toString(scr_width));
                Log.v("height >>", Integer.toString(scr_height));
                if (scr_width >= 640) {
                    Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
                            scr_height + 90, scr_height, true);
    
                    img1.setImageBitmap(resizedbitmap);
    
                    Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
                            scr_height + 90, scr_height, true);
    
                    img2.setImageBitmap(resizedbitmap1);
                } else {
                    Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
                            scr_height, scr_height + 30, true);
    
                    img1.setImageBitmap(resizedbitmap);
    
                    Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
                            scr_height, scr_height + 30, true);
    
                    img2.setImageBitmap(resizedbitmap1);
                }
    
            }
    
    
    
        } else if (action == MotionEvent.ACTION_MOVE && !multiTouch)
        {
            System.out.println("single2");
        }
    
        return super.onTouchEvent(event);
    
    }
    
    public class MySimpleOnScaleGestureListener extends
            SimpleOnScaleGestureListener {
    
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            // TODO Auto-generated method stub
    
            scaleFactor = detector.getScaleFactor();
    
            Log.v("scaleFactor >>>", scaleFactor + "");
    
            return true;
        }
    }
    
    }
    

    Latest:

    if (index == 1) {
            multiTouch = true;
            img2.onTouch(view, event);
        System.out.println("mutli1");
    } else if (multiTouch == false) {
        System.out.println("single1");
        img1.onTouch(view, event);
    
    }
    
     else if (action == MotionEvent.ACTION_MOVE && multiTouch) {
        System.out.println("mutli2");
    

提交回复
热议问题