OnClickListener - x, y स्थान की घटना?


85

मेरे पास व्यू से प्राप्त एक कस्टम दृश्य है। जब दृश्य क्लिक किया जाता है, तो मुझे सूचित किया जाना चाहिए, और x, y स्थान जहां क्लिक हुआ है। लंबे-क्लिक के लिए भी।

ऐसा करने के लिए लगता है, मुझे ओवरराइड करने की आवश्यकता है onTouchEvent()। क्या इस घटना से x, y स्थान का पता लगाने का कोई तरीका नहीं है OnClickListener, हालांकि?

यदि नहीं, तो यह बताने का एक अच्छा तरीका है कि क्या गति घटना एक 'वास्तविक' क्लिक बनाम एक लंबी-क्लिक आदि है? onTouchEventतेजी से उत्तराधिकार आदि में कई घटनाओं को उत्पन्न करता है

जवाबों:


91

धन्यवाद। मुझे इसी की तो तलाश थी। मेरा कोड अब है:

imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                textView.setText("Touch coordinates : " +
                        String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
            }
            return true;
        }
    });

जो मार्क के लिए पूछा ठीक है ...


4
क्या ये कोर्ड स्थानीय हैं?
— निगेल

7
falseयह स्पर्श घटनाओं को ब्लॉक नहीं करता है, तो onTouch हैंडलर वापसी नहीं करना चाहिए ? (View.OnTouchListener.onTouch सही है अगर श्रोता ने घटना को झूठा खा लिया है, तो सही है।)
— एहरटवेल

5
ठीक है, "ठीक" नहीं है कि चूंकि OnClickListenerउंगली जारी होने पर निकाल दिया जाता है, इसलिए ACTION_UPसीमाओं के साथ: यदि फाई फ्लिंग (स्वाइप) इशारा किया गया था, तो OnClickListenerनिकाल नहीं दिया जाता है लेकिन ACTION_UPफिर भी संसाधित किया जाएगा।
— एलेक्स सेमेनिउक

मैं क्लिक किए गए निर्देशांक पर पाठ लिखने का प्रयास कर रहा हूं। मैंने निर्देशांक पर पाठ लिखने की कोशिश की (event.getX(), event.getY()) लेकिन यह सही स्थिति में नहीं लिख रहा है।
— प्रिंस

यहाँ मेरा सवाल है: stackoverflow.com/questions/40199539/…
— प्रिंस

26

पूर्ण उदाहरण

अन्य उत्तर कुछ विवरण याद कर रहे हैं। यहाँ एक पूर्ण उदाहरण है।

public class MainActivity extends AppCompatActivity {

    // class member variable to save the X,Y coordinates
    private float[] lastTouchDownXY = new float[2];

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

        // add both a touch listener and a click listener
        View myView = findViewById(R.id.my_view);
        myView.setOnTouchListener(touchListener);
        myView.setOnClickListener(clickListener);
    }

    // the purpose of the touch listener is just to store the touch X,Y coordinates
    View.OnTouchListener touchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            // save the X,Y coordinates
            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                lastTouchDownXY[0] = event.getX();
                lastTouchDownXY[1] = event.getY();
            }

            // let the touch event pass on to whoever needs it
            return false;
        }
    };

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // retrieve the stored coordinates
            float x = lastTouchDownXY[0];
            float y = lastTouchDownXY[1];

            // use the coordinates for whatever
            Log.i("TAG", "onLongClick: x = " + x + ", y = " + y);
        }
    };
}

सारांश

  • निर्देशांक को संग्रहीत करने के लिए एक वर्ग चर जोड़ें
  • X को सहेजें, Y एक का उपयोग करके निर्देशांक करता है OnTouchListener
  • एक्स तक पहुँच, वाई में निर्देशांक OnClickListener

1
2 रिक्त स्थान फ्लोट ऐरे के बजाय, एक पॉइंट () का उपयोग किया जा सकता है।
— 15:15 बजे ZooMagic

बिंदु में टाइप पूर्णांक का X और Y है। निर्देशांक फ्लोट मान हैं। यदि मैं पॉइंट क्लास का उपयोग करता हूं, तो मुझे लगता है कि मैं सटीक खो रहा हूं .... मैं एंड्रॉइड में बहुत नया हूं और हो सकता है कि मैंने कुछ याद किया हो।
— मबोदा

@ म्बोडा, आप सही कह रहे हैं। प्वाइंटएफ बेहतर होगा।
— Suragch

OnTouchListener से बचने और सिर्फ onClickListener का उपयोग करने का एक तरीका होना चाहिए। किसी भी तरह, ContextMenu को इसकी आवश्यकता नहीं है। एक आइटम पर क्लिक करने और एक एंकर के रूप में दृश्य के साथ मेनू दिखाने पर, यह जानता है कि इसे कहां रखा जाए, स्पर्श स्थान के पास। यहाँ देखें: stackoverflow.com/q/57290574/878126 । क्या आप जानते हैं कि यह कैसे संभव है? यदि हां, तो कृपया वहां उत्तर देने पर विचार करें।
— Android डेवलपर

3

OverTouchEvent (MotionEvent ev) को ओवरराइड करें

तो आप कर सकते हैं:

ev.getXLocation()

या कुछ इस तरह का। एक कसाई है।


2
हाय टॉम, हाँ हम onTouchEvent का उपयोग कर सकते हैं, लेकिन फिर हमें क्लिकों और लंबे क्लिकों के बीच समझदारी से काम लेने की जरूरत है, क्या हम नहीं? यह समझ में नहीं आता है कि वे आपको यह जानने का एक तरीका प्रदान नहीं करेंगे कि कहां पर क्लिक या लॉन्ग क्लिक ऑनक्लीक्लिंटर आदि में हुए थे? साभार
— मार्क

21
आपको बस पिछले ACTION_UP या ACTION_MOVE ईवेंट की x & y स्थिति रिकॉर्ड करनी है और अपने ऑनक्लाइलस्टनर में इन मानों का उपयोग करना है।
— रोमेन गाइ

@RomainGuy लेकिन आपको एक क्लिक का निर्धारण करने के लिए दो बिंदुओं के बीच की दूरी की भी गणना करनी चाहिए। यदि आपको (0,0) पर ACTION_DOWN घटना और (100,100) ACTION_UP घटना प्राप्त होती है, तो यह निश्चित रूप से एक क्लिक नहीं है।
— TheRealChx101

@ chx101, रोमेनग्यू का क्या मतलब था (मुझे लगता है) यह था कि यदि आप केवल अंतिम कार्रवाई_अप निर्देशांक को रिकॉर्ड करते हैं तो वे निर्देशांक हैं जिन्हें आप ऑन्कलिक में उपयोग कर सकते हैं। हालाँकि, मुझे लगता है कि अभ्यास में दृश्य को उपवर्ग की आवश्यकता होगी, या onclick does not get कहा जाता है। तुम भी एक इशारा डिटेक्टर के रूप में नल stackoverflow.com/questions/19538747/… जवाब में पता लगा सकते हैं
— Lassi Kinnunen

0

आप इस तरह से कोटलिन में एक विस्तार समारोह कर सकते हैं:

fun View.setOnClickListenerWithPoint(action: (Point) -> Unit) {
    val coordinates = Point()
    val screenPosition = IntArray(2)
    setOnTouchListener { v, event ->
        if (event.action == MotionEvent.ACTION_DOWN) {
            v.getLocationOnScreen(screenPosition)
            coordinates.set(event.x.toInt() + screenPosition[0], event.y.toInt() + screenPosition[1])
        }
        false
    }
    setOnClickListener {
        action.invoke(coordinates)
    }
}

यदि आपको एक लंबी क्लिक की आवश्यकता है - बस प्रतिस्थापित करें setOnClickListener

मैं उपयोग करता हूं getLocationOnScreen()क्योंकि मुझे RecyclerView के ViewHolder के लिए निर्देशांक की आवश्यकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.