एंड्रॉइड में, हम कैसे पता लगा सकते हैं कि कोई उपयोगकर्ता बटन पर छूता है और इस बटन के क्षेत्र से बाहर निकलता है?एंड्रॉइड: पता लगाएँ कि क्या उपयोगकर्ता बटन क्षेत्र से छूता है और ड्रैग करता है?
उत्तर
चेक MotionEvent.MOVE_OUTSIDE:
चेक MotionEvent.MOVE:
private Rect rect; // Variable rect to hold the bounds of the view
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
// Construct a rect of the view's bounds
rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
// User moved outside bounds
}
}
return false;
}
नोट: यदि आप Android 4.0 को लक्षित करना चाहते हैं, तो नई संभावनाओं की एक पूरी दुनिया को खोलता है: http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER
एंट्रेको द्वारा पोस्ट किए गए उत्तर को मेरे मामले में कुछ मामूली tweaking की जरूरत है।
if(!rect.contains((int)event.getX(), (int)event.getY()))
के लिए
if(!rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY()))
क्योंकि event.getX()
और event.getY()
केवल imageView ही है, पूरे स्क्रीन नहीं करने के लिए लागू: मैं स्थानापन्न करना पड़ा।
+1 धन्यवाद, यह कस्टम दृश्य कार्यान्वयन में अधिक सार्वभौमिक दृष्टिकोण है और काम करता है – Knickedi
जबकि @FrostRocket से जवाब सही आप अनुवाद के लिए खाते view.getX() और वाई का उपयोग करना चाहिए है और साथ ही बदल देता है:
view.getHitRect(viewRect);
if(viewRect.contains(
Math.round(view.getX() + event.getX()),
Math.round(view.getY() + event.getY()))) {
// inside
} else {
// outside
}
यहाँ एक View.OnTouchListener
है कि आप देखने के लिए अगर MotionEvent.ACTION_UP
था का उपयोग कर सकते है भेजा जबकि उपयोगकर्ता को देखने के बाहर उसका/उसकी उंगली था:
private OnTouchListener mOnTouchListener = new View.OnTouchListener() {
private Rect rect;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v == null) return true;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
return true;
case MotionEvent.ACTION_UP:
if (rect != null
&& !rect.contains(v.getLeft() + (int) event.getX(),
v.getTop() + (int) event.getY())) {
// The motion event was outside of the view, handle this as a non-click event
return true;
}
// The view was clicked.
// TODO: do stuff
return true;
default:
return true;
}
}
};
शीर्ष 2 जवाब जब दृश्य एक scrollview के अंदर है, सिवाय इसके ठीक हैं: जब स्क्रॉल जगह लेता है क्योंकि आप अपनी उंगली ले जाते हैं, यह अभी भी पंजीकृत किया गया है एक स्पर्श घटना के रूप में लेकिन एक मोशनवेन्ट.एक्शन_MOVE घटना के रूप में नहीं। तो जवाब में सुधार करने के (जो केवल जरूरत है, तो आपके विचार एक स्क्रॉल तत्व के अंदर है):
private Rect rect; // Variable rect to hold the bounds of the view
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
// Construct a rect of the view's bounds
rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
} else if(rect != null && !rect.contains(v.getLeft() + (int) event.getX(), v.getTop() + (int) event.getY())){
// User moved outside bounds
}
return false;
}
मैं Android 4.3 और Android 4.4
पर इस परीक्षण किया मैं मोरित्ज़ के जवाब के बीच कोई अंतर नहीं दिखाई दी और शीर्ष पर 2 लेकिन यह भी अपने जवाब के लिए लागू होता है:
private Rect rect; // Variable rect to hold the bounds of the view
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
// Construct a rect of the view's bounds
rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
} else if (rect != null){
v.getHitRect(rect);
if(rect.contains(
Math.round(v.getX() + event.getX()),
Math.round(v.getY() + event.getY()))) {
// inside
} else {
// outside
}
}
return false;
}
मैंने अभी इस कोड को एक बटन पर लागू किया है जो एक RecyclerView के किसी आइटम में निहित है और पूरी तरह से काम करता है। मैं सिर्फ यह कहना चाहता था कि अगर आप getHitRect से पहले इसे जोड़ते हैं तो आप ** ACTION_DOWN ** पर नए रेक्ट से छुटकारा पा सकते हैं। ** Rect rect = new Rect(); getHitRect (rect); ** –
मैं अपने OnTouch में कुछ लॉगिंग जोड़ा गया है और पता चला कि MotionEvent.ACTION_CANCEL
मारा जा रहा था। वह मेरे लिए काफी अच्छा है ...
आपको 'मोशनइवेंट.एक्शन_CANCEL' कॉलबैक मिलेगा यदि आपका' व्यू' 'स्क्रॉल व्यू' जैसे माता-पिता 'व्यू ग्रुप' के भीतर निहित है, जो कि अपने बच्चों से चाल छूने में रूचि रखता है लेकिन अन्यथा कोई गारंटी नहीं है कि आपको अपने 'व्यू' में 'मोशनइवेंट.एक्शन_CANCEL' कॉलबैक मिलेगा। –
view.setClickable(true);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!v.isPressed()) {
Log.e("onTouch", "Moved outside view!");
}
return false;
}
});
view.isPressed
view.pointInView
का उपयोग करता है और कुछ स्पर्श ढिलाई भी शामिल है। यदि आप ढलान नहीं चाहते हैं, तो बस तर्क को आंतरिक view.pointInView
से कॉपी करें (जो सार्वजनिक है, लेकिन छुपा हुआ है, इसलिए यह आधिकारिक एपीआई का हिस्सा नहीं है और किसी भी समय गायब हो सकता है)।
view.setClickable(true);
view.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.setTag(true);
} else {
boolean pointInView = event.getX() >= 0 && event.getY() >= 0
&& event.getX() < (getRight() - getLeft())
&& event.getY() < (getBottom() - getTop());
boolean eventInView = ((boolean) v.getTag()) && pointInView;
Log.e("onTouch", String.format("Dragging currently in view? %b", pointInView));
Log.e("onTouch", String.format("Dragging always in view? %b", eventInView));
v.setTag(eventInView);
}
return false;
}
});
मैं ओ पी के रूप में यह एक ही समस्या थी जिससे मुझे पता है कि जब (1) एक विशेष View
नीचे छुआ था और साथ ही चाहता था या तो (2) जब नीचे स्पर्श View
या को जारी किया गया (3) जब डाउन टच View
की सीमाओं के बाहर चले गए। मैंने View.OnTouchListener
(SimpleTouchListener
नामित) का एक सरल विस्तार बनाने के लिए इस धागे में विभिन्न उत्तरों को एक साथ लाया ताकि अन्य MotionEvent
ऑब्जेक्ट के साथ घूमने की आवश्यकता न हो। कक्षा के लिए स्रोत here या इस उत्तर के नीचे पाया जा सकता है।
इस वर्ग का उपयोग करने के लिए बस View.setOnTouchListener(View.OnTouchListener)
विधि के एकल पैरामीटर के रूप में सेट इस प्रकार है:
public abstract class SimpleTouchListener implements View.OnTouchListener {
/**
* Flag determining whether the down touch has stayed with the bounds of the view.
*/
private boolean touchStayedWithinViewBounds;
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStayedWithinViewBounds = true;
onDownTouchAction();
return true;
case MotionEvent.ACTION_UP:
if (touchStayedWithinViewBounds) {
onUpTouchAction();
}
return true;
case MotionEvent.ACTION_MOVE:
if (touchStayedWithinViewBounds
&& !isMotionEventInsideView(view, event)) {
onCancelTouchAction();
touchStayedWithinViewBounds = false;
}
return true;
case MotionEvent.ACTION_CANCEL:
onCancelTouchAction();
return true;
default:
return false;
}
}
/**
* Method which is called when the {@link View} is touched down.
*/
public abstract void onDownTouchAction();
/**
* Method which is called when the down touch is released on the {@link View}.
*/
public abstract void onUpTouchAction();
/**
* Method which is called when the down touch is canceled,
* e.g. because the down touch moved outside the bounds of the {@link View}.
*/
public abstract void onCancelTouchAction();
/**
* Determines whether the provided {@link MotionEvent} represents a touch event
* that occurred within the bounds of the provided {@link View}.
*
* @param view the {@link View} to which the {@link MotionEvent} has been dispatched.
* @param event the {@link MotionEvent} of interest.
* @return true iff the provided {@link MotionEvent} represents a touch event
* that occurred within the bounds of the provided {@link View}.
*/
private boolean isMotionEventInsideView(View view, MotionEvent event) {
Rect viewRect = new Rect(
view.getLeft(),
view.getTop(),
view.getRight(),
view.getBottom()
);
return viewRect.contains(
view.getLeft() + (int) event.getX(),
view.getTop() + (int) event.getY()
);
}
}
यह एक अच्छा जवाब है, खासकर इस मुद्दे के साथ काम करने वाले लोगों के लिए जब ACTION_CANCEL इसे ट्रिगर नहीं कर रहा है। –
- 1. jQuery: पता लगाएँ कि तत्व मौजूद है
- 2. पता लगाएँ कि ब्राउज़र स्थिति का समर्थन करता है: निश्चित
- 3. पता लगाएँ कि क्या डेटा डेटाैकेंटेक्स्ट
- 4. एंड्रॉइड: उपयोगकर्ता निष्क्रियता/पता लगाएँ (सॉफ्टकीबोर्ड) कीबोर्ड इनपुट
- 5. पता लगाएँ कि iframe क्रॉस-डोमेन है, तो इसे
- 6. जेएस: पता लगाएं कि जब उपयोगकर्ता बटन
- 7. पता लगाएँ एंड्रॉइड वेबव्यू यूआरएल स्थान परिवर्तन
- 8. पता लगाएँ कि आईई में फ़ॉन्ट डाउनलोड सक्षम है
- 9. पता लगाएँ एंटर कुंजी jquery
- 10. एंड्रॉइड: पता लगाएँ जब स्क्रॉलव्यू स्क्रॉलिंग समाप्त हो गया है और वापस उछाल रहा है?
- 11. नोड.जेएस: पता लगाएँ कि कमांड लाइन
- 12. पता लगाएं कि उपयोगकर्ता ने बैक बटन
- 13. डब्ल्यूपीएफ: पता लगाएँ कि खिड़की फोकस
- 14. फ्लेक्स 4 पता लगाता है कि क्या उपयोगकर्ता कुंजी दर्ज करता है
- 15. केकफ़्पी - पता लगाएँ कि डेटाबेस से कनेक्ट करने में असमर्थ है और
- 16. व्यूपार्जर पता लगाता है कि उपयोगकर्ता
- 17. पता लगाएँ कि इनपुट प्रकार = "दिनांक" प्लेसहोल्डर का समर्थन करता है
- 18. जब पता चलता है कि उपयोगकर्ता जावा
- 19. पता लगाएँ कि क्या विंडोज बंद या एप्लिकेशन सिस्टम मेनू से बंद करने का प्रयास करता है (WM_CLOSE)
- 20. MKMapView पर उपयोगकर्ता छूता का पता लगाने आईओएस 5
- 21. jQuery - पता लगाएँ कि घटना शुरू हो रहा
- 22. पता लगाएं कि उपयोगकर्ता द्वारा
- 23. क्या जावास्क्रिप्ट पता लगा सकता है कि उपयोगकर्ता का ब्राउज़र gzip का समर्थन करता है?
- 24. यह पता लगाना कि जब कोई उपयोगकर्ता किसी HTML5/जावास्क्रिप्ट ऐप में किसी विज्ञापन नियंत्रण पर ड्रैग करता है?
- 25. पता लगाएँ कि ब्राउज़र राइट-क्लिक ईवेंट ओवरराइडिंग
- 26. क्या एक स्थिर सी पुस्तकालय में कार्य करता है पता लगाएँ
- 27. पीईसाइड/पीईक्यूटी पता लगाता है कि क्या उपयोगकर्ता विंडो
- 28. पता लगाएँ कि जावास्क्रिप्ट का उपयोग करते समय विंडो का आकार बदलता है?
- 29. पता लगाएँ कि कितने द्विआधारी अंकों एक विशेष पूर्णांक
- 30. एंड्रॉइड 4.0 पता लगाता है कि उपयोगकर्ता के पास हार्डवेयर बैक/होम कुंजियां हैं
:
यहाँ वर्ग के स्रोत आप अपने प्रोजेक्ट को जोड़ सकते हैं जो है क्षमा करें लेकिन यह काम नहीं करता है। मैं केवल ACTION_UP, ACTION_DOWN और ACTION_MOVE को पकड़ सकता हूं लेकिन ACTION_OUTSIDE नहीं। – anticafe
यह एपीआई स्तर 3 से आगे उपलब्ध है: http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_OUTSIDE – Entreco
इस उत्तर के अनुसार (http://stackoverflow.com/questions/6162497/when- क्या-एक्शन-आउट-आउट-ट्रिगर/8059266 # 8059266) मेरा मानना है कि हम केवल ACTION_OUTSIDE का उपयोग यह पता लगाने के लिए कर सकते हैं कि स्पर्श गतिविधि के बाहर है या नहीं। – anticafe