Android работает мультитач кнопка - PullRequest
1 голос
/ 18 марта 2011

Привет, я хочу создать 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; }


 }

Ответы [ 4 ]

6 голосов
/ 04 января 2013

Старый вопрос, но я с этой проблемой бегал головой в стене, пока, наконец, не наткнулся на настройку

android:splitMotionEvents="true"

в представлении макета, содержащем виды кнопок, которые позволяют нажимать несколько кнопок, которые я нашел, копая в ApiDemos, которые доступны в загрузке демонстраций sdk

4 голосов
/ 18 марта 2011

В структуре пользовательского интерфейса Android все сенсорные события принадлежат к представлению, из которого произошло прикосновение. Поэтому, если вы касаетесь своей кнопки, все сенсорные события обрабатываются через эту кнопку, пока вы не поднимите палец вверх; это включает в себя другие сенсорные указатели для мультитач. По моему опыту, единственный способ добиться мультитач для отдельных объектов View (ваших 2-х кнопок) - это захватить все сенсорные события в одном View, охватывающем весь экран, и самостоятельно делегировать сенсорные события. Это немного работы, но это можно сделать.

Примером может быть включение ImageView, которое заполняет экран, но не имеет источника Drawable (или оно полностью прозрачно). Поместите это поверх других ваших элементов (возможно, с FrameLayout) и в методе onTouchEvent () ImageView проанализируйте координаты касания и передайте событие касания до нужной кнопки. Это несколько усложняется с помощью нескольких сенсорных указателей, но, насколько мне известно, это единственный способ передать сенсорные события в отдельные объекты View.

2 голосов
/ 09 сентября 2012

Мне было немного скучно с этим предметом, и я создал класс обработчика для управления с помощью кнопок мультитач.Не стесняйтесь использовать и / или обновлять это.

</p> <pre><code>//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; } }

</p> <pre><code>//CLASS TO FULLFILL WITH RESULT public class MultitouchButtonHandlerResult { public View view; public int event_type; }

</p> <pre><code>//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 голосов
/ 18 марта 2011

Проверяли ли вы эту ссылку -

Как использовать Multi-touch в Android 2
http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2/1747

Как кодировать для мультитача

...