2013-07-27 10 views
6

मैं एंड्रॉयड में इशारा गतिविधि पर काम कर रहा हूँ मैं कड़ी चोट कार्रवाई का पता लगाने के वर्ग में प्रयोग किया जाता हैएंड्रॉयड onDown बिना LinearLayout पर कड़ी चोट इशारा जोड़ने के बारे में सच

public class ActivitySwipeDetector implements View.OnTouchListener { 

    static final String logTag = "ActivitySwipeDetector"; 
    private Activity activity; 
    static final int MIN_DISTANCE = 100; 
    private float downX, downY, upX, upY; 

    public ActivitySwipeDetector(Activity activity){ 
     this.activity = activity; 
    } 

    public void onRightToLeftSwipe(){ 
     Log.i(logTag, "RightToLeftSwipe!"); 
     Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show(); 
     //activity.doSomething(); 
    } 

    public void onLeftToRightSwipe(){ 
     Log.i(logTag, "LeftToRightSwipe!"); 
     Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show(); 
     //activity.doSomething(); 
    } 

    public void onTopToBottomSwipe(){ 
     Log.i(logTag, "onTopToBottomSwipe!"); 
     //Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show(); 
     //activity.doSomething(); 
    } 

    public void onBottomToTopSwipe(){ 
     Log.i(logTag, "onBottomToTopSwipe!"); 
     //Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show(); 
     //activity.doSomething(); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()){ 
     case MotionEvent.ACTION_DOWN: { 
      downX = event.getX(); 
      downY = event.getY(); 
      return true; 
     } 
     case MotionEvent.ACTION_UP: { 
      upX = event.getX(); 
      upY = event.getY(); 

      float deltaX = downX - upX; 
      float deltaY = downY - upY; 

      // swipe horizontal? 
        if(Math.abs(deltaX) > MIN_DISTANCE){ 
         // left or right 
         if(deltaX < 0) { this.onLeftToRightSwipe(); return true; } 
         if(deltaX > 0) { this.onRightToLeftSwipe(); return true; } 
        } 
        else { 
         Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE); 
         return false; // We don't consume the event 
        } 

        // swipe vertical? 
        if(Math.abs(deltaY) > MIN_DISTANCE){ 
         // top or down 
         if(deltaY < 0) { this.onTopToBottomSwipe(); return true; } 
         if(deltaY > 0) { this.onBottomToTopSwipe(); return true; } 
        } 
        else { 
         Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE); 
         return false; // We don't consume the event 
        } 

        return true; 
     } 
     } 
     return false; 
    } 

} 

मेरी xml फ़ाइल

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/action_settings" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 

</LinearLayout> 

है और मेरे गतिविधि में मैं इस

ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this); 
     LinearLayout lowestLayout = (LinearLayout)this.findViewById(R.id.action_settings); 
     lowestLayout.setOnTouchListener(activitySwipeDetector); 

मैं ActivitySwipeDetector(this); तो इसका ठीक काम कर रहा बुलाया भरा एक साथ की तरह बुला ctivity। लेकिन मैं पूरी गतिविधि के लिए केवल LinearLayout पर स्वाइप डिटेक्टर को कैसे लागू कर सकता हूं। कृपया मेरी मदद करें।

+0

आप किसी विशेष दृश्य के लिए टच श्रोता को जोड़ रहे हैं। तय करें कि आप किस दृश्य को स्वाइप का पता लगाना चाहते हैं, और इसे उस उचित दृश्य से संलग्न करें। यदि आप इसे यहां की गतिविधि में शीर्ष स्तर के दृश्य में संलग्न करते हैं, तो यह पूरी गतिविधि पर काम करेगा। –

+0

लेकिन अगर मैं बच्चे के दृश्य को संलग्न करता हूं तो यह काम नहीं करता है ... –

उत्तर

18

मुझे के लिए आवश्यक और सबसे अच्छा आपके कोड था, इसलिए मैं थोड़ा,

public class RelativeLayoutTouchListener implements OnTouchListener { 

    static final String logTag = "ActivitySwipeDetector"; 
    private Activity activity; 
    static final int MIN_DISTANCE = 100;// TODO change this runtime based on screen resolution. for 1920x1080 is to small the 100 distance 
    private float downX, downY, upX, upY; 

    // private MainActivity mMainActivity; 

    public RelativeLayoutTouchListener(MainActivity mainActivity) { 
     activity = mainActivity; 
    } 

    public void onRightToLeftSwipe() { 
     Log.i(logTag, "RightToLeftSwipe!"); 
     Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show(); 
     // activity.doSomething(); 
    } 

    public void onLeftToRightSwipe() { 
     Log.i(logTag, "LeftToRightSwipe!"); 
     Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show(); 
     // activity.doSomething(); 
    } 

    public void onTopToBottomSwipe() { 
     Log.i(logTag, "onTopToBottomSwipe!"); 
     Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show(); 
     // activity.doSomething(); 
    } 

    public void onBottomToTopSwipe() { 
     Log.i(logTag, "onBottomToTopSwipe!"); 
     Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show(); 
     // activity.doSomething(); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: { 
      downX = event.getX(); 
      downY = event.getY(); 
      return true; 
     } 
     case MotionEvent.ACTION_UP: { 
      upX = event.getX(); 
      upY = event.getY(); 

      float deltaX = downX - upX; 
      float deltaY = downY - upY; 

      // swipe horizontal? 
      if (Math.abs(deltaX) > MIN_DISTANCE) { 
       // left or right 
       if (deltaX < 0) { 
        this.onLeftToRightSwipe(); 
        return true; 
       } 
       if (deltaX > 0) { 
        this.onRightToLeftSwipe(); 
        return true; 
       } 
      } else { 
       Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long horizontally, need at least " + MIN_DISTANCE); 
       // return false; // We don't consume the event 
      } 

      // swipe vertical? 
      if (Math.abs(deltaY) > MIN_DISTANCE) { 
       // top or down 
       if (deltaY < 0) { 
        this.onTopToBottomSwipe(); 
        return true; 
       } 
       if (deltaY > 0) { 
        this.onBottomToTopSwipe(); 
        return true; 
       } 
      } else { 
       Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long vertically, need at least " + MIN_DISTANCE); 
       // return false; // We don't consume the event 
      } 

      return false; // no swipe horizontally and no swipe vertically 
     }// case MotionEvent.ACTION_UP: 
     } 
     return false; 
    } 

} 

प्रयोग अधिक ठीक की जरूरत है, देखते हैं कि टिप्पणी तय: मूल के साथ

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    rlTop = (RelativeLayout) findViewById(R.id.rlTop);  
    rlTop.setOnTouchListener(new RelativeLayoutTouchListener(this)); 
} 
+0

मैं तुम्हें नहीं मिला, जहां आपने बिल्कुल मारा ??? –

+0

मैंने अभी अपना कोड संपादित कर लिया है, उसे जांचें .. मुझे लगता है कि आपकी समस्या के साथ किया गया .. –

+0

+1 इससे मुझे धन्यवाद मिली :) –

0

मैं पड़ा है अच्छे परिणाम कोड। लेकिन श्रोता को एक दृश्य में जोड़ा जाना चाहिए, एक लेआउट नहीं। हम सब के बाद View.OnTouchListener का विस्तार कर रहे हैं।

+1

लीनियरलाइट व्यू ग्रुप को बढ़ाता है जो व्यू को बढ़ाता है। मैं यह देखने में असफल रहा कि एक श्रोता को लेआउट में क्यों जोड़ा नहीं जा सका। – mhenry

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