2012-06-07 17 views
7

मैं पिछले कुछ घंटों के लिए अपना सिर तोड़ रहा हूं, Google से बाहर निकल गया हूं और स्टैक ओवरफ्लो या मेरे लिए काम करने वाले अन्य स्थानों पर कोई भी उदाहरण नहीं है, इसलिए यह ...बटन के साथ कस्टम व्यू ऑनगेशर लिस्टनर

मेरे पास एक कस्टम दृश्य है, extends LinearLayout and implements GestureDetector.OnGestureListener

मेरे कस्टम लेआउट में मेरे पास 3 बटन हैं, प्रत्येक में एक क्लिक श्रोता है। मैं जो कुछ चाहता हूं वह कुछ करने के लिए दृश्य में हर जगह फ़्लिंग करने में सक्षम होना है, लेकिन बटन पर क्लिक करने में सक्षम होना भी है।

मेरा ऑनफ्लिंग फ़ंक्शन शानदार दृश्य काम करता है यदि मैं दृश्य के अंदर फ़्लिंग करता हूं लेकिन बटनों में से एक नहीं। यदि मैं बटनों में से किसी एक पर फ़्लिंग करता हूं, तो यह ज्यादातर मामलों में कुछ क्लिक करता है या कुछ में कुछ भी नहीं करता है।

यहाँ मेरी कोड के प्रासंगिक हिस्सा है:

@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
      return false; 
     } 
     // right to left swipe 
     if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      viewFlipper.setInAnimation(slideLeftIn); 
      viewFlipper.setOutAnimation(slideLeftOut); 
      viewFlipper.showNext(); 
      return true; 

     } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      viewFlipper.setInAnimation(slideRightIn); 
      viewFlipper.setOutAnimation(slideRightOut); 
      viewFlipper.showPrevious(); 
      return true; 
     } 

     return false; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (gestureDetector.onTouchEvent(event)) { 
      return gestureDetector.onTouchEvent(event); 
     } 
     return false; 
    } 

वापसी सच के किसी भी संयोजन की कोशिश की, विवरण झूठा है; मैं सोच सकता था ... किसी भी मदद की सराहना करेंगे! :)

धन्यवाद! http://developer.android.com/reference/android/view/SurfaceView.html

शीर्ष पर SurfaceView साथ

, अपने बटन अभी भी काम करना चाहिए और अपने प्रेषण नहीं किसी भी बिना बटन पर प्राप्त करने के लिए सक्षम होना चाहिए:

उत्तर

3

का वर्णन कर रहे हैं यहाँ क्या (मेरे सवाल से केवल संशोधित कोड) मेरे लिए इसे हल अंततः ... के लिए प्रासंगिक हो सकता है। सुनिश्चित नहीं हैं कि अगर यह सबसे अच्छा समाधान है, लेकिन यह काम करता है:

@Override 
    public boolean onDown(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

@Override 
    public boolean onTouchEvent(MotionEvent e) { 
     return gestureDetector.onTouchEvent(e); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e) { 
     return onTouchEvent(e); 
    } 

इस बटन लेकिन पर साधारण क्लिक की अनुमति देते हैं, तो आप इस के पीछे बटन के साथ एक और दृश्य है भी बटन पर, फ़्लिंग इशारा अनुमति देते हैं और यह भी होगा देखें, कभी-कभी क्लिक पीछे की तरफ गुज़रेंगे और दृश्य के पीछे बटन पर क्लिक करें। इसके लिए समाधान "android:clickable="true" को फ्रंट व्यू के रूट लेआउट (LinearLayout, FrameLayout या जो कुछ भी) में जोड़ना है।

0

शायद तुम एक उपरिशायी जिसमें SurfaceView का उपयोग कर आप सभी का प्रेषण नहीं संभाल सेट कर सकते हैं समस्या का।

+0

उत्तर देने के लिए धन्यवाद लेकिन मैं SurfaceView का उपयोग नहीं करना पसंद करता क्योंकि यह इसके लिए इरादा नहीं है और मुख्य रूप से क्योंकि मेरा मुद्दा सही तरीके से सही "वापसी वापस; झूठी वापसी" करने का मामला होना चाहिए। –