Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में एक्शन मूव इवेंट का उपयोग कैसे करें?

एंड्रॉइड में ACTION_MOVE टच इवेंट हैंडल करें

यह ट्यूटोरियल दिखाता है कि MotionEvent.ACTION_MOVE का उपयोग करके टच मूवमेंट (ड्रैग/स्वाइप) कैसे ट्रैक करें और रियल-टाइम निर्देशांक प्राप्त करें।

चरण 1: प्रोजेक्ट बनाएं

एंड्रॉइड स्टूडियो में नया प्रोजेक्ट बनाएं।

चरण 2: लेआउट (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="24dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/touchView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:textSize="18sp"
        android:gravity="center"
        android:background="#E3F2FD"
        android:text="यहां ड्रैग करें\n(ACTION_MOVE ट्रैकिंग)"
        android:layout_marginTop="30dp"/>

    <TextView
        android:id="@+id/coordsText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_marginTop="16dp"
        android:padding="12dp"
        android:background="#FFF3E0"
        android:text="निर्देशांक: -"/>

</LinearLayout>

चरण 3: एक्टिविटी कोड (src/MainActivity.java)

package com.example.actionmovedemo;

import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.MotionEventCompat;

public class MainActivity extends AppCompatActivity {

    private TextView touchView;
    private TextView coordsText;

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        touchView = findViewById(R.id.touchView);
        coordsText = findViewById(R.id.coordsText);

        touchView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getX();
                int y = (int) event.getY();
                
                int action = MotionEventCompat.getActionMasked(event);

                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        Log.i("TOUCH", "टच डाउन: (" + x + ", " + y + ")");
                        coordsText.setText("DOWN: (" + x + ", " + y + ")");
                        v.setBackgroundColor(0xFF4CAF50);
                        return true; // MOVE/UP प्राप्त करने के लिए आवश्यक

                    case MotionEvent.ACTION_MOVE:
                        // रियल-टाइम निर्देशांक अपडेट
                        coordsText.setText("MOVE: (" + x + ", " + y + ")");
                        // Toast बार-बार न दिखाएं - केवल लॉग या UI अपडेट
                        // Toast.makeText(MainActivity.this, "मूविंग: (" + x + "," + y + ")", Toast.LENGTH_SHORT).show();
                        break;

                    case MotionEvent.ACTION_UP:
                        Log.i("TOUCH", "टच अप: (" + x + ", " + y + ")");
                        coordsText.setText("UP: (" + x + ", " + y + ")");
                        v.setBackgroundColor(0xFF2196F3);
                        break;

                    case MotionEvent.ACTION_CANCEL:
                        Log.i("TOUCH", "टच कैंसल");
                        v.setBackgroundColor(0xFF2196F3);
                        break;
                }
                return true;
            }
        });
    }
}

ACTION_MOVE विशेषताएं

  • उच्च आवृत्ति: उंगली घुमाने पर प्रति सेकंड दर्जनों बार फायर होता है
  • बैचिंग: Android बैटरी बचाने के लिए मूव इवेंट्स बैच कर सकता है (event.getHistorySize())
  • निर्देशांक: getX(), getY() व्यू-सापेक्ष; getRawX(), getRawY() स्क्रीन-सापेक्ष
  • मल्टी-टच: getX(pointerIndex), getPointerId() उपयोग करें

हिस्टोरिकल पॉइंट्स एक्सेस करना (बैच्ड इवेंट्स)

case MotionEvent.ACTION_MOVE:
    int historySize = event.getHistorySize();
    
    // वर्तमान पॉइंट सहित सभी हिस्टोरिकल पॉइंट्स प्रोसेस करें
    for (int h = 0; h < historySize; h++) {
        float hx = event.getHistoricalX(h);
        float hy = event.getHistoricalY(h);
        long ht = event.getHistoricalEventTime(h);
        // पथ ड्रॉ करें, स्मूथिंग करें, आदि
    }
    
    // वर्तमान पॉइंट
    float cx = event.getX();
    float cy = event.getY();
    break;

ड्रैग-एंड-ड्रॉप कार्यान्वयन

private float dX, dY;
private int lastAction;

@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = MotionEventCompat.getActionMasked(event);
    
    switch (action) {
        case MotionEvent.ACTION_DOWN:
            dX = v.getX() - event.getRawX();
            dY = v.getY() - event.getRawY();
            lastAction = ACTION_DOWN;
            return true;
            
        case MotionEvent.ACTION_MOVE:
            if (lastAction == ACTION_DOWN) {
                // ड्रैग थ्रेशोल्ड जांचें
                float diffX = Math.abs(event.getRawX() - (v.getX() - dX));
                float diffY = Math.abs(event.getRawY() - (v.getY() - dY));
                if (diffX > 10 || diffY > 10) {
                    lastAction = ACTION_MOVE;
                }
            }
            
            if (lastAction == ACTION_MOVE) {
                v.animate()
                    .x(event.getRawX() + dX)
                    .y(event.getRawY() + dY)
                    .setDuration(0)
                    .start();
            }
            return true;
            
        case MotionEvent.ACTION_UP:
            if (lastAction == ACTION_DOWN) {
                // क्लिक के रूप में व्यवहार करें
                onClick(v);
            }
            lastAction = ACTION_UP;
            return true;
    }
    return false;
}

प्रदर्शन टिप्स

  • UI थ्रेड पर भारी काम न करें - MOVE में जटिल गणना से बचें
  • थ्रॉटलिंग: निश्चित अंतराल पर अपडेट करें (Handler/Choreographer)
  • कैनवास ड्रॉइंग: पथ ड्रॉ करने के लिए कस्टम व्यू + onDraw() उपयोग करें
  • ऑब्जेक्ट आवंटन से बचें: लूप में नए ऑब्जेक्ट न बनाएं

चरण 4: टेस्ट करें

  1. ऐप चलाएं
  2. नीले क्षेत्र में उंगली रखें और घुमाएं
  3. निर्देशांक रियल-टाइम में अपडेट होंगे
  4. उंगली उठाने पर अंतिम स्थिति दिखेगी

एंड्रॉइड में एक्शन मूव इवेंट का उपयोग कैसे करें?

  1. एंड्रॉइड एप्लिकेशन में फायरबेस मैसेजिंग का उपयोग कैसे करें? एंड्रॉइड एप्लिकेशन में फायरबेस मैसेजिंग का उपयोग कैसे करें?

    एंड्रॉइड में फायरबेस क्लाउड मैसेजिंग (FCM) सेटअप यह गाइड एक आधुनिक एंड्रॉइड ऐप (Kotlin/Java) में FCM को एंड-टू-एंड कवर करता है: निर्भरताएं, मैनिफेस्ट, टोकन हैंडलिंग, फोरग्राउंड/बैकग्राउंड संदेश, और नोटिफिकेशन चैनल (API 26+) 1. निर्भरताएं (build.gradle.kts / .gradle) dependencies { // Firebase B

  1. Android Toolbar में SearchView का उपयोग कैसे करें? Android Toolbar में SearchView का उपयोग कैसे करें?

    Android Toolbar/ActionBar में SearchView जोड़कर ListView फ़िल्टर करना टूलबार में सर्च आइकन जोड़कर ListView डेटा को रियल-टाइम फ़िल्टर करने का पूरा उदाहरण। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project। चरण 2: लेआउट में Toolbar और ListView res/layout/activity_main.xml: <?xml ve

  1. एंड्रॉइड में XMLPullParser से XML पार्स कैसे करें? एंड्रॉइड में XMLPullParser से XML पार्स कैसे करें?

    एंड्रॉइड में XMLPullParser का उपयोग करके XML डेटा पार्स करना XMLPullParser एंड्रॉइड में XML प्रोसेसिंग के लिए एक हल्का, कुशल और लो-मेमोरी पार्सर है। यह पुल मॉडल पर काम करता है — यानी आप पार्सर से अगला इवेंट मांगते हैं, बजाय इसके कि पार्सर आपको कॉलबैक दे (जैसे SAX)। यह बड़े XML फाइल्स के लिए आदर्श है