2011-03-17 50 views
1

嗨,我想创建2按钮,我想多点触摸?Android工作多点触控按钮

我tryed做,但在网上没有例子..

所以,如果你得到一个可以共享,也可以你给我的意见? 我的代码是这样的,但不支持多点触控

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


} 

回答

4

在Android的UI框架,所有触摸事件,属于在触控起源观。所以如果你触摸你的按钮,所有的触摸事件都通过该按钮进行处理,直到你抬起手指;这包括用于多点触摸的其他触摸指针。根据我的经验,在单独的View对象(您的2个按钮)上实现多点触控的唯一方法是在一个View中捕捉所有触摸事件,以覆盖整个屏幕,并自行委派触摸事件。这是一项工作,但可以完成。

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

+0

cab你给和例子? – metin 2011-03-17 23:25:46

0
+0

每个人都给出了这个地址,但没有任何东西...... – metin 2011-03-18 23:00:46

+0

继续阅读:第2部分:建立触摸示例> http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-在-Android-2-part-2-building-the-touch-example/1763 – Abhi 2011-03-19 01:44:55

+0

我做了一个多点触控的例子,但它使用屏幕位置..这意味着它的工作,当你点击屏幕的空白部分..不按钮或一些思维 – metin 2011-03-19 23:02:50

2

我这个题目有点无聊,我做了一个处理程序类带有多点触控按钮。随意使用和/或更新。

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

}; 

+0

谢谢你,完美工作:D – Ertyui 2013-01-23 16:46:06

6

老问题,但我跑我的头撞墙这个问题,直到我终于跨越只是在布局设置

android:splitMotionEvents="true" 

来到包含按钮视图的视图,允许按压多个按钮d,我发现在ApiDemos中可以在sdk演示中使用下载