Android work multitouch button

不羁岁月 提交于 2019-12-28 03:05:35

问题


Hi i want to create 2 Button and i want to multitouch ??

i tryed to do but no example in internet..

So if you got one can you share or can you give me opinion ?? my code is this but not support multitouch

 package multi.touch;

 import android.app.Activity;
 import android.os.Bundle;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnTouchListener;
 import android.widget.AbsoluteLayout.LayoutParams;
 import android.widget.Button;
 import android.widget.TextView;

 public class baslat extends Activity implements OnTouchListener  { 
 TextView yazi;
 TextView bir,iki;
 Button buton1,buton2;

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

 yazi=(TextView)findViewById(R.id.textView1);
 bir=(TextView)findViewById(R.id.textView2);
 iki=(TextView)findViewById(R.id.textView3);
 buton1=(Button)findViewById(R.id.button1);
 buton2=(Button)findViewById(R.id.button2);

 buton2.setOnTouchListener(this);

 buton1.setOnTouchListener(this);

 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
    yazi.setText(String.valueOf(event.getPointerCount()+"\n\n"));
            bir.setText(String.valueOf("Birinci "
 + (int)event.getX(0)+"\n\n"+(int)event.getY(0)));
        iki.setText(String.valueOf("Ikinci"+
 (int)event.getX(1)+"\n\n"+(int)event.getY(1)));
    //buton2.setLayoutParams(new
 LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,
 (int)event.getX(0),
 (int)event.getY(0)));      return
 super.onTouchEvent(event);
            } @Override public boolean onTouch(View v, MotionEvent event) {
    Button fds=(Button)v;


            return false; }


 }

回答1:


Old question but I was running my head in the wall with this problem until I finally came across just setting

android:splitMotionEvents="true"

on the layout view that contains the button views, which allows for multiple buttons to be pressed, which I found digging in the ApiDemos that are available in the sdk demos download




回答2:


In the Android UI framework, all touch events belong to the View where the touch originated. So if you touch your Button, all touch events are processed through that Button until you lift your finger up; this includes other touch pointers for multi-touch. In my experience the only way to achieve multi-touch across separate View objects (your 2 Buttons), is to capture all touch events in one View that covers the whole screen, and delegate the touch events yourself. It's a bit of work, but it can be done.

An example might be to include an ImageView that fills the screen but has no Drawable source (or it's completely transparent). Put this on top of your other elements (perhaps with a FrameLayout), and in the onTouchEvent() method of the ImageView, analyze the touch coordinates, and pass the touch event down to the correct button. This gets rather complicated with multiple touch pointers, but as far as I know, it's the only way to pass touch events to separate View objects.




回答3:


I was a little bored with this subject and i made an handler class for leading with multitouch buttons. Feel free to use and/or update that.

//CLASS TO HANDLE THE EVENT
    public class MultitouchButtonHandler {
            ArrayList<View> views_info = new ArrayList<View>();
            public MultitouchButtonHandlerResult onTouchEvent(View v, MotionEvent ev) {

            //GET EVENT INFO 
            final int action = ev.getAction();
            int action_masked = action & MotionEvent.ACTION_MASK;
            if(action_masked==MotionEvent.ACTION_MOVE){
                return null;
            }

                //GET ABSOLUTE SIZE AND CHECK IF THIS ANY VIEW ATTACHED TO THIS POSITION
                final int original_location[] = { 0, 0 };
                v.getLocationOnScreen(original_location);
                final int actionPointerIndex = ev.getActionIndex();
                float rawX = (int) ev.getX(actionPointerIndex) + original_location[0];
                float rawY = (int) ev.getY(actionPointerIndex) + original_location[1];
                View eventView = getViewByLocation((int)rawX, (int)rawY);
                if(eventView==null) return null;

                MultitouchButtonHandlerResult result = new MultitouchButtonHandlerResult();
                result.view  = eventView;


                //CHECK WHAT KIND OF EVENT HAPPENED 
                switch (action_masked) {
                case MotionEvent.ACTION_DOWN: {
                    result.event_type = MotionEvent.ACTION_DOWN;
                    return result;
                }

                case MotionEvent.ACTION_UP: {
                    result.event_type = MotionEvent.ACTION_UP;
                    return result;
                }

                case MotionEvent.ACTION_CANCEL: {
                    result.event_type = MotionEvent.ACTION_CANCEL;
                    return result;
                }

                case MotionEvent.ACTION_POINTER_UP: {
                    result.event_type = MotionEvent.ACTION_UP;
                    return result;
                }

                case MotionEvent.ACTION_POINTER_DOWN: {
                    result.event_type = MotionEvent.ACTION_DOWN;
                    return result;
                }

                default:

                break;

                }

                return null;
            }

            public void addMultiTouchView(View v){
                views_info.add(v);;
            }
            public void removeMultiTouchView(View v){
                views_info.remove(v);;
            }

            public View getViewByLocation(int x, int y){

                for(int key=0; key!= views_info.size(); key++){
                    View v = views_info.get(key);
                    //GET BUTTON ABSOLUTE POSITION ON SCREEN
                    int[] v_location = { 0, 0 };
                    v.getLocationOnScreen(v_location);

                    //FIND THE BOUNDS
                    Point min = new Point(v_location[0], v_location[1]);
                    Point max = new Point(min.x + v.getWidth(), min.y + v.getHeight());


                    if(x>=min.x && x<=max.x && y>=min.y && y<=max.y){
                        //Log.d("mylog", "***Found a view: " + v.getId());
                        return v;
                    }

                }

                //Log.d("mylog", "Searching: " + x +", " + y + " but not found!");

                return null;
            }

        }

//CLASS TO FULLFILL WITH RESULT
public class MultitouchButtonHandlerResult {
    public View view;
    public int event_type;
}

//In your view 
private OnTouchListener listener_touch_button = new OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
      MultitouchButtonHandlerResult result=multitouch_handler.onTouchEvent(v, event);
     if(result==null) return true;

                switch(result.event_type){
                    case MotionEvent.ACTION_DOWN:
                        Log.d("mylog", "DOWN");
                break;
                    case MotionEvent.ACTION_UP:
                        Log.d("mylog", "UP");
                break;
                    case MotionEvent.ACTION_CANCEL:
                            Log.d("mylog", "CANCEL");
                break;

                }

               Log.d("mylog", "View ID: " + result.view.getId());

               return false;
      }

 };




回答4:


Did you check this link -

How to use Multi-touch in Android 2
http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2/1747

How to code for multitouch



来源:https://stackoverflow.com/questions/5346148/android-work-multitouch-button

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!