Android работает мультитач кнопка

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

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

android:splitMotionEvents="true"

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

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

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

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

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

 };

Вы проверили эту ссылку -

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

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

Другие вопросы по тегам