2010-04-20 12 views
6

मुझे आश्चर्य है कि एंड्रॉइड मल्टी-टच समर्थन विश्वसनीय है या नहीं? मैंने पढ़ा है कि यह कुछ समस्याओं से पीड़ित है।एंड्रॉइड मल्टी-टच समर्थन

मुझे यह भी आश्चर्य है कि मैं कस्टम मल्टी-टच जेस्चर को कैसे परिभाषित कर सकता हूं? पसंद: 3 उंगलियां घूमती हैं या 3 उंगलियां स्थिर रहती हैं और चौथाई चलती है।

मैं कुछ संसाधनों में आया हूं (डेवलपर.android.com पर जेस्चर या मोशनवेन्ट) लेकिन कुछ भी स्पष्ट रूप से यह नहीं बताता है।

सादर,

Zdenek

उत्तर

11

मैं चारों ओर एपीआई में खोदा गया है और/चुटकी तरह जेस्चर निष्पादित चुटकी उल्टा करने के लिए एक रास्ता मिल गया है, तो मेरा मानना ​​है कि इशारों आप का वर्णन संभव हो रहे हैं - यह सिर्फ लगाना लेता है उन्हें कैसे कोडित करें। नीचे मैंने लागू एक रिवर्स चुटकी का एक उदाहरण चिपकाया है। मैं चाहता था कि चुटकी केवल तभी रजिस्टर करे जब यह क्षैतिज उन्मुख हो। यह बहुत साफ या पुन: प्रयोज्य कोड नहीं है लेकिन इसे आगे बढ़ने में आपकी मदद करनी चाहिए। यह एंड्रॉइड 2.0.x पर काम करता है। मैंने मल्टी-टच पढ़ा है पिछले संस्करणों पर मुद्दों हो सकता है। उदाहरण एक वर्ग है जिसे मैं गतिविधि के onTouchEvent के भीतर से कॉल करता हूं, जिससे ईवेंट को कक्षा में अग्रेषित किया जाता है।

public class HorizontalReversePinchDetector { 

    public boolean onTouchEvent(MotionEvent e) { 

     int pointerCount = e.getPointerCount(); 

     if(pointerCount != 2) { 
      Log.d(GESTURE, "not pinching - exactly 2 fingers are needed but have " + pointerCount); 
      clearPinch(); 
      return false; 
     } 

     int firstIndex = e.getX(0) < e.getX(1) ? 0: 1; 
     int secondIndex = e.getX(0) < e.getX(1) ? 1: 0; 

     Finger currentLeftFinger = new Finger(e.getX(firstIndex), e.getY(firstIndex)); 
     Finger currentRightFinger = new Finger(e.getX(secondIndex), e.getY(secondIndex)); 

     float yDifference = Math.abs(currentLeftFinger.getY() - currentRightFinger.getY()); 
     if(yDifference > 80) { 
      Log.d(GESTURE, "not pinching - fingers too vertically-oriented"); 
      clearPinch(); 
      return false; 
     } 

     if(initialLeftFinger == null) { 
      initialLeftFinger = currentLeftFinger; 
      initialRightFinger = currentRightFinger; 
      Log.d(GESTURE, "not pinching, but might be starting a pinch..."); 
      return false; 
     } 

     float leftFingerDistance = initialLeftFinger.getX() - currentLeftFinger.getX(); 
     float rightFingerDistance = currentRightFinger.getX() - initialRightFinger.getX(); 

     float xDistanceBetweenFingers = Math.abs(currentLeftFinger.getX() - currentRightFinger.getX()); 
     if(xDistanceBetweenFingers < minimumDistanceBetweenFingers) { 
      Log.d(GESTURE, "pinching, but fingers are not far enough apart..."); 
      return true; 
     } 

     if(leftFingerDistance < minimumDistanceForEachFinger) { 
      Log.d(GESTURE, "pinching, but left finger has not moved enough..."); 
      return true; 
     } 
     if(rightFingerDistance < minimumDistanceForEachFinger) { 
      Log.d(GESTURE, "pinching, but right finger has not moved enough..."); 
      return true; 
     } 

     pinchCompleted(); 
     return true; 
    } 

    private void pinchCompleted() { 
     Log.d(GESTURE, "pinch completed"); 
     if(pinchListener != null) pinchListener.onPinch(); 
     clearPinch(); 
    } 

    public static interface OnPinchListener { 
     void onPinch(); 
    } 

    private void clearPinch() { 
     initialLeftFinger = null; 
     initialRightFinger = null; 
    } 

    public void setPinchListener(OnPinchListener pinchListener) { 
     this.pinchListener = pinchListener; 
    } 

    private static class Finger { 

     private Finger(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public float getX() { 
      return x; 
     } 

     public float getY() { 
      return y; 
     } 

     private float x; 
     private float y; 
    } 

    private Finger initialLeftFinger; 
    private Finger initialRightFinger; 
    private OnPinchListener pinchListener; 
    private static final float minimumDistanceForEachFinger = 30; 
    private static final float minimumDistanceBetweenFingers = 50; 
} 

विश्वसनीयता के संबंध में, यह कोड पूरी तरह से विश्वसनीय है। फिर, केवल एंड्रॉइड 2.0.x पर। मैंने मंच के अन्य संस्करणों पर इसका परीक्षण नहीं किया है।

+0

बढ़िया! प्रतिक्रिया के लिए धन्यवाद, यह वही चीज है जिसे मैं ढूंढ रहा हूं। –

संबंधित मुद्दे