【问题标题】:Android work multitouch buttonAndroid 工作多点触控按钮
【发布时间】:2011-07-17 19:09:23
【问题描述】:

您好,我想创建 2 个按钮,我想多点触控??

我尝试过,但在互联网上没有例子..

所以如果你有一个你可以分享或者你能给我意见吗? 我的代码是这样的,但不支持多点触控

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


 }

【问题讨论】:

    标签: android button multi-touch sample


    【解决方案1】:

    老问题,但我一直在纠结这个问题,直到我终于遇到了设置

    android:splitMotionEvents="true"
    

    在包含按钮视图的布局视图上,它允许按下多个按钮,我发现在 sdk 演示下载中提供的 ApiDemos 中进行挖掘

    【讨论】:

      【解决方案2】:

      在 Android UI 框架中,所有的触摸事件都属于触摸起源的 View。因此,如果您触摸 Button,所有触摸事件都会通过该 Button 处理,直到您抬起手指为止;这包括用于多点触控的其他触控指针。根据我的经验,在单独的视图对象(您的 2 个按钮)之间实现多点触控的唯一方法是在一个覆盖整个屏幕的视图中捕获所有触摸事件,并自己委托触摸事件。这有点工作,但可以做到。

      一个示例可能是包含一个填充屏幕但没有可绘制源(或者它是完全透明的)的 ImageView。将它放在您的其他元素之上(可能使用 FrameLayout),并在 ImageView 的 onTouchEvent() 方法中,分析触摸坐标,并将触摸事件传递给正确的按钮。使用多个触摸指针会变得相当复杂,但据我所知,这是将触摸事件传递给单独的 View 对象的唯一方法。

      【讨论】:

        【解决方案3】:

        我对这个主题有点厌烦,我创建了一个处理程序类,用于使用多点触控按钮进行引导。随意使用和/或更新它。

        //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】:

          你检查过这个链接吗 -

          如何在 Android 2 中使用多点触控
          http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2/1747

          How to code for multitouch

          【讨论】:

          • 继续阅读:第 2 部分:构建触控示例 > zdnet.com/blog/burnette/…
          • 我做了一个多点触控的例子,但它使用屏幕位置..这意味着它可以让你点击屏幕空白部分..不是按钮或一些想法
          • 我得到了答案:你不能在同一时间触摸 2 按钮..但是你可以触摸屏幕并且你可以运行每个按钮的功能..你可以用按钮的位置来做......谢谢为所有人..
          猜你喜欢
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多