2011-01-17 29 views
6

Là một nhà phát triển, tôi có xu hướng lập trình trước rồi nghiên cứu sau. Tôi đã cố gắng triển khai một màn hình có thể xử lý nhiều đầu vào của người dùng. Về cơ bản bản đồ nhiều hơn chỉ là một ngón tay. Tôi đã thử hai điều ..Android multitouch?

Tôi có một lớp Hoạt động đã triển khai OnTouchListener. Ở đây tôi có hai chế độ xem con riêng biệt đã thêm Hoạt động làm người nghe ontouch của họ. Và sau đó tôi có một dòng in đã in ra event.getPointerCount() và in ra vị trí của từng con trỏ.

Đã tải xuống điện thoại và kiểm tra nó. Tôi nhận thấy rằng các con trỏ không bao giờ lớn hơn hai. Tôi thậm chí còn nhận thấy nếu một ngón tay ở trên một đứa trẻ và một ngón tay khác trên quan điểm trẻ em khác rằng các sự kiện chỉ được thực hiện cho thành phần con đầu tiên. Tiếp theo, tôi đã cố gắng để đưa các trình lắng nghe riêng biệt vào từng thành phần con để xem nó có hoạt động hay không nhưng nó hoạt động giống nhau.

Vì vậy, có vẻ như Android chỉ hỗ trợ tổng cộng hai đầu vào người dùng khi xử lý các yếu tố đầu vào từ người dùng chạm vào màn hình.

Điều này có đúng không? Có vẻ như từ thử nghiệm và nghiên cứu rằng đây là trường hợp.

Có ai đã gặp phải hạn chế này. Bất kỳ công việc thông minh nào xung quanh?

Cảm ơn bạn đã dành thời gian và phản hồi.

dk

Trả lời

7

Số điểm chạm được hỗ trợ phụ thuộc vào thiết bị. Trong tất cả các phiên bản hiện có của Android MotionEvent s được gửi đến một chế độ xem mục tiêu duy nhất và mô tả trạng thái của tất cả các điểm tiếp xúc hiện đang hoạt động. Chế độ xem mục tiêu được xác định theo nơi xảy ra sự kiện MotionEvent.ACTION_DOWN đầu tiên.

Xem bài đăng Making Sense of Multitouch trên blog Nhà phát triển Android để biết tổng quan nhanh về cách làm việc với các sự kiện cảm ứng đa điểm trên Android.

+0

Cảm ơn các URL, nó giúp dọn dẹp một số thứ. Nhưng tôi phải tự mình xem. Vì vậy, tôi đã viết một ứng dụng đơn giản để kiểm tra những gì đã nói trong bài viết. Sẽ thêm mã để tự trả lời cho câu hỏi này. – dakira

3

Tôi đã viết một ứng dụng rất đơn giản để kiểm tra nhiều lần chạm trên điện thoại HTC Incredible của mình. Tôi cư xử khá giống như tôi nghĩ và khá giống với URL được đưa ra bởi adamp. Kết quả của tôi là điện thoại chỉ có thể xử lý hai đầu vào ngón tay. Tôi có cho mỗi hộp có một OnTouchListener của riêng mình. Khi tôi nhấp vào mỗi hộp, tôi in ra một văn bản cho mỗi hộp. Nhấp vào từng sự kiện liên lạc có được nhưng với ngón tay trỏ của tôi, tôi nhấp vào bất cứ nơi nào trên màn hình, tôi có hai con trỏ. Từ phương thức event.getPointerCount của MotionEvent. Không quan trọng nơi ngón tay thứ hai đáp xuống. Có thể đã ở bên ngoài chế độ xem gốc đã nhận được sự kiện đầu tiên xuống dưới ngón tay. Anyways đây là mã nếu bạn muốn thử nó cho mình.

Tôi có 7z toàn bộ dự án nhưng tôi không nghĩ mình có thể đính kèm nó.

Vì vậy, đây là hoạt động chính và xml cho bố cục.

package com.multitouch; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class MultiTouch extends Activity { 
    protected LinearLayout sq1; 
    protected LinearLayout sq2; 
    protected LinearLayout sq3; 
    protected LinearLayout sq4; 

    protected String sqText = new String(); 
    protected String sq1Text = new String(); 
    protected String sq2Text = new String(); 
    protected String sq3Text = new String(); 

    private Handler handler = new Handler(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     setViews(); 
     handler.postDelayed(mUpdateUITimerTask, 5000); 
    } 

    private final Runnable mUpdateUITimerTask = new Runnable() { 
     public void run() { 
      // do whatever you want to change here, like: 
      updateTextField(); 
     } 
    }; 

    private void updateTextField() { 
     TextView view1 = (TextView) this.findViewById(R.id.logView); 
     TextView view2 = (TextView) this.findViewById(R.id.logView1); 
     TextView view3 = (TextView) this.findViewById(R.id.logView2); 
     TextView view4 = (TextView) this.findViewById(R.id.logView3); 


     //view1.append(sqText + "\n"); 
     view1.setText(sqText); 
     view2.setText(sq1Text); 
     view3.setText(sq2Text); 
     view4.setText(sq3Text); 

     handler.post(mUpdateUITimerTask); 
    } 

    private void setViews() { 
     sq1 = (LinearLayout) this.findViewById(R.id.square1); 
     sq2 = (LinearLayout) this.findViewById(R.id.square2); 
     sq3 = (LinearLayout) this.findViewById(R.id.square3); 
     sq4 = (LinearLayout) this.findViewById(R.id.square4); 

     sq1.setOnTouchListener(new TouchListener()); 
     sq2.setOnTouchListener(new TouchListener()); 
     sq3.setOnTouchListener(new TouchListener()); 
     sq4.setOnTouchListener(new TouchListener());   
    } 

    private class TouchListener implements OnTouchListener { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if(event.getPointerCount()>2) { 
       sq1Text = "GOT THREE POINTERS!!"; 
       sq2Text = "GOT THREE POINTERS!!"; 
       sq3Text = "GOT THREE POINTERS!!"; 
       sqText = "GOT THREE POINTERS!!"; 
      } 

      if(event.getAction() == MotionEvent.ACTION_DOWN){ 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pressed::Pointer count = " + String.valueOf(event.getPointerCount()); 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_DOWN || 
         event.getAction() == MotionEvent.ACTION_POINTER_UP) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_1_DOWN) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer1Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer2Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 Pointer3Down::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_UP) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 UP::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } else if(event.getAction() == MotionEvent.ACTION_MOVE) { 
       switch(v.getId()) { 
        case R.id.square1: 
         sqText = "Square 1 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square2: 
         sq1Text = "Square 2 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square3: 
         sq2Text = "Square 3 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
        case R.id.square4: 
         sq3Text = "Square 4 MOVE::Pointer count = " + String.valueOf(event.getPointerCount()) + "\n"; 
        break; 
       } 
      } 


      // TODO Auto-generated method stub 
      return true; 
     } 

    } 
} 

Layout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:gravity="center_horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/MainLay" > 

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:gravity="center_horizontal" android:padding="10dip"> 


     <TableRow android:gravity="center_horizontal" android:padding="10dip"> 
      <LinearLayout android:background="#FFFF00" android:id="@+id/square1" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
      <LinearLayout android:background="#FF00FF" android:id="@+id/square2" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
     </TableRow> 

     <TableRow android:gravity="center_horizontal" android:padding="10dip"> 
      <LinearLayout android:background="#00FFFF" android:id="@+id/square3" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
      <LinearLayout android:background="#eeeeee" android:id="@+id/square4" android:padding="10px" android:layout_width="125px" android:layout_height="125px"/> 
     </TableRow>  


      <TextView android:id="@+id/logView" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
      <TextView android:id="@+id/logView1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
      <TextView android:id="@+id/logView2" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 
      <TextView android:id="@+id/logView3" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 



    </TableLayout> 

</LinearLayout> 

Chúc may mắn, và nếu bạn thử nó cho tôi biết nếu bạn nhận được GOT ba con trỏ !! báo cáo in. Tôi tự hỏi những gì điện thoại hỗ trợ nó.

cảm ơn, dk

+0

Galaxy S dường như hỗ trợ tới năm quầy. Thể hiện bởi một người nào đó từ một diễn đàn khác nhau bằng cách sử dụng phần mềm ở trên. – dakira

+0

Sử dụng Optimus LG. Chỉ phát hiện 1 bộ đếm. – Brahadeesh

0

Tôi đã chỉnh sửa @dakira answer.Đây là đoạn mã mẫu của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/MainLay" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center_horizontal" 
    android:orientation="vertical"> 


    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:id="@+id/tvHeader" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:padding="4dp" 
      android:text="Place Your Finger on Squire" 
      android:textColor="#000" 
      android:textSize="20sp" /> 

     <LinearLayout 
      android:id="@+id/llStatusHolder" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/tvHeader" 
      android:orientation="vertical" 
      android:weightSum="2"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:padding="8dp" 
       android:weightSum="2"> 

       <TextView 
        android:id="@+id/tvBox1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:background="#FFFF00" 
        android:gravity="center" 
        android:padding="4dp" 
        android:text="Finger : 0" 
        android:textColor="#000" 
        android:textSize="28sp" /> 

      </LinearLayout> 

     </LinearLayout> 


     <LinearLayout 
      android:id="@+id/square1" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="4dp" 
      android:layout_below="@+id/llStatusHolder" 
      android:layout_weight="1" 
      android:background="#FFFF00" 
      android:orientation="horizontal" 
      android:padding="10dp"> 

     </LinearLayout> 

     </RelativeLayout> 
    </LinearLayout> 

đây là mã JAVA:

import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.LinearLayout; 
import android.widget.TextView; 


public class MultiTouchTestActivity extends Activity { 
    protected LinearLayout sq1; 

    TextView tvBox1; 
    int counter1 = 0; 

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

    private void updateTextField() { 

     tvBox1.setText("Finger : " + counter1); 

    } 

    private void setViews() { 
     tvBox1 = (TextView) findViewById(R.id.tvBox1); 
     sq1 = (LinearLayout) this.findViewById(R.id.square1); 

     sq1.setOnTouchListener(new TouchListener()); 

    } 

    private class TouchListener implements OnTouchListener { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if (event.getAction() == 1) { 
       setCounterValue(1, 0); 
      }else if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_DOWN || 
        event.getAction() == MotionEvent.ACTION_POINTER_UP) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_1_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_2_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_UP) { 
       setCounterValue(1, event.getPointerCount()); 
      } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
       setCounterValue(1, event.getPointerCount()); 
      }else if (event.getAction() == MotionEvent.ACTION_BUTTON_RELEASE) { 
       setCounterValue(1, 0); 
      } 
      updateTextField(); 
      return true; 
     } 
    } 

    void setCounterValue(int hasvalue, int value) { 
     switch (hasvalue) { 
      case 1: 
       counter1 = value; 
       break; 
     } 
    } 
} 

Hy vọng điều này sẽ giải quyết được nhiều vấn đề người :)

enter image description here

Các vấn đề liên quan