2012-08-15 12 views
5

मैं एक आवेदन पर काम कर रहा हूँ (एक Galaxy Nexus के), और मैंने देखा है गूगल आवेदन लागू किया है कि "Google अभी" जब आप भी स्क्रीन (क्रोम ब्राउज़र पर फलक के नीचे से स्वाइप के साथ पेनल जेस्चर थोड़ी देर के लिए यह किया, यकीन नहीं है कि यह अभी भी करता है)। मैं चारों ओर देख रहा हूं लेकिन यह निर्धारित करने में असमर्थ रहा कि उन्होंने इसे कैसे पूरा किया। वहाँ एक आसान तरीका इशारों कि फलक के बजाय स्क्रीन पर शुरू संभाल करने है?एंड्रॉयड

मैं संदर्भ के लिए डेवलपर पृष्ठों की जाँच की है, लेकिन केवल लेख मैं मिल सकता है यहाँ था:

http://developer.android.com/design/patterns/gestures.html

वहाँ कहीं और जहां इस जानकारी उपलब्ध होगी है?

[संपादित करें]

मैं किनारे इशारों Lain_B की पद्धति पर आधारित कार्य करवाने के लिए बहुत असफल कोशिश कर रहा है, लेकिन यह काम नहीं कर सकता। यहाँ कोड है कि मैं कोशिश करते हैं और जेस्चर का पता लगाने के लिए उपयोग कर रहा हूँ, लेकिन logcat हमेशा एक शून्य outputting है ...

public class MainActivity extends Activity implements OnGestureListener { 

private GestureDetector myGesture; 

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

    myGesture = new GestureDetector(getBaseContext(), 
      (OnGestureListener) this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Log.e("Flags Touch", "Flags: " + event.getEdgeFlags()); 
    return myGesture.onTouchEvent(event); 
} 

@Override 
public boolean onDown(MotionEvent e) { 
    Log.e("Flags", "Flags: " + e.getEdgeFlags()); 
    Log.e("Event", "onDown"); 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void onLongPress(MotionEvent e) { 
    Log.e("Event", "onLongPress"); 
    // TODO Auto-generated method stub 

} 

@Override 
public void onShowPress(MotionEvent e) { 
    Log.e("Flags", "Flags: " + e.getEdgeFlags()); 
    Log.e("Event", "onShowPress"); 
    // TODO Auto-generated method stub 

} 

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

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
     float distanceY) { 
    // Log.e("Event", "onScroll"); 
    return false; 
} 

// these constants are used for onFling 
private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 

    Log.e("Event", "onFling"); 
    Log.e("Flags", "Flags: " + e1.getEdgeFlags()); 

    if (e1.getEdgeFlags() == MotionEvent.EDGE_LEFT) { 
     // code to handle swipe from left edge 
     Log.e("!!!!!", "Edge fling!"); 
    } 

    try { 
     // do not do anything if the swipe does not reach a certain length 
     // of distance 
     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) { 

     } 
     // left to right swipe 
     else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) { 

     } 
    } catch (Exception e) { 
     // nothing 
    } 
    return false; 

} 
} 

[संपादित करें 2]

Lain_B के अनुरोध किया उत्पादन के साथ

...

(नेक्सस 7 का उपयोग करते हुए) ... फलक पर सब से अधिक दूर संभव बाईं बिंदु से शुरू, और मध्यम (ish) के लिए सही स्वाइप।

08-16 16:44:13.674: I/Fling(16702): Flags: 0 
08-16 16:44:13.674: I/Fling(16702): e1: 2.5 711.5152 
08-16 16:44:13.674: I/Fling(16702): e2: 215.4591 717.08105 

स्क्रीन के केंद्र बिंदु, स्क्रीन बंद से (दाईं ओर)

08-16 16:46:37.364: I/Fling(16702): Flags: 0 
08-16 16:46:37.364: I/Fling(16702): e1: 392.5 758.1818 
08-16 16:46:37.364: I/Fling(16702): e2: 783.4375 743.3334 
+0

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन आप इस के लिए देख रहे हैं? http://developer.android.com/reference/android/view/GestureDetector.html –

+0

मैं पहले से ही एक इशारा श्रोता का उपयोग कर रहा हूं, मैं बस यह निर्धारित करने की कोशिश कर रहा था कि स्क्रीन के किनारे से बाहर से शुरू होने पर इसे कैसे कार्यान्वित किया जाए। – RyanInBinary

उत्तर

8

स्वाइप मुझे लगता है कि MotionEvent.getEdgeFlags() आप जो खोज रहे हैं है। इसके बाद आप EDGE_LEFT, EDGE_RIGHT, आदि के साथ दिए गए मान तुलना देखने के लिए जो बढ़त छुआ था कर सकते हैं।

if(event1.getEdgeFlags()&MotionEvent.EDGE_LEFT != 0){ 
    //code to handle swipe from left edge 
} 

या

if(e1.getX() < 5.0f){ 
    //handle swipe from left edge 
} 
+0

इसे किसी न किसी। धन्यवाद लैन! आप मेरे कोड को पिछले कुछ दिनों में सुधार रहे हैं – RyanInBinary

+0

मदद करने में खुशी है, प्रश्न ऐसे क्षेत्रों में हैं जहां मैंने काफी काम किया है। –

+1

ठीक है, तो यह अभी भी मेरे लिए काम नहीं कर रहा है, मैंने इसे अपने ऑनफ्लिंग इवेंट में जोड़ा, और यह हमेशा किनारे के झंडे के लिए 0x0 लौटा रहा है (कुछ भी छुआ नहीं)। क्या मैं कुछ भूल रहा हूँ? क्या जेलीबीन का सिस्टम यूआई इनका उपयोग करने के किसी भी प्रयास को ओवरराइड करता है क्योंकि यह "Google नाओ" को सुनकर बेज़ेल के नीचे से स्वाइप कर रहा है? मैं इसी तरह की कार्यक्षमता में काम करने की कोशिश कर रहा हूं, लेकिन बाएं/दाएं किनारों से – RyanInBinary

7

MotionEvent.getEdgeFlags पर निर्भर गलत है। अधिक जानकारी के लिए इस चर्चा देखें: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/ZNjpzbkxeNM

वैचारिक एक किनारे कड़ी चोट आप एक खींचें/पुस्तक घटना का पता लगाने और यह भी सुनिश्चित करने की जरूरत है पता लगाने के लिए मूल "x" नीचे घटना के समन्वय किनारे से कुछ दूरी पर है।

ऐसा करने का सबसे आसान तरीका ड्रैग/स्क्रॉल का पता लगाने के लिए एक जेस्चरडेक्टर का उपयोग करना है। सौभाग्य से Onscroll SimpleOnGestureListener की विधि सब कुछ आप की जरूरत है।

तो कुछ इस तरह (यदि आप एक GestureDetector SimpleOnGestureListener के साथ विन्यस्त उपयोग कर रहे हैं):

public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 

     if (e1.getX() < SOME_DISTANCE_FROM_SCREEN) { 
      //your code 
      return true; 
     } 
     return false; 
} 
+0

यह बहुत आसान है और मेरे लिए बहुत अच्छा काम किया – Mike

+1

स्क्रीन से कुछ दूरी क्या है? इसका उद्देश्य क्या है? मैं ऊपर दिए गए कोड को समझ नहीं रहा हूं। – ilikeyoyo

+0

@ रारस्टर यह कुछ स्थिर है कि आप स्क्रीन के किनारे से अधिकतम स्वीकृति दूरी को चिह्नित करने के लिए परिभाषित करते हैं जिसमें एक स्पर्श ईवेंट को किनारे पर स्वाइप माना जाएगा। – ataulm