কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে ACTION_MOVE ইভেন্ট ব্যবহার

অ্যান্ড্রয়েডে ACTION_MOVE টাচ ইভেন্ট ব্যবহার

এই টিউটোরিয়ালে শিখব কিভাবে `MotionEvent.ACTION_MOVE` ব্যবহার করে আঙুল ড্র্যাগ করার সময় রিয়েল-টাইম কোঅর্ডিনেট ট্র্যাক করা যায়। এটি ড্র্যাগ-অ্যান্ড-ড্রপ, ড্রইং অ্যাপ, স্লাইডার কন্ট্রোলের জন্য অপরিহার্য।

প্রয়োজনীয় ধাপসমূহ

ধাপ ১: নতুন প্রজেক্ট তৈরি করুন

Android Studio-তে File → New Project নির্বাচন করে প্রজেক্ট তৈরি করুন।

ধাপ ২: লেআউট ফাইল

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:gravity="center"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">
    <TextView
        android:id="@+id/actionEvent"
        android:textSize="40sp"
        android:layout_marginTop="30dp"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="ACTION MOVE টেস্ট\n(এখানে ড্র্যাগ করুন)"
        android:gravity="center"
        android:padding="20dp"
        android:background="#E0E0E0" />
</LinearLayout>

ধাপ ৩: জাভা কোড

src/MainActivity.java ফাইলে:

package com.example.myapplication;

import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    TextView actionEvent;

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        actionEvent = findViewById(R.id.actionEvent);
        actionEvent.setText("ACTION MOVE টেস্ট\n(এখানে ড্র্যাগ করুন)");
        
        actionEvent.setOnTouchListener(new 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("TouchEvent", "টাচ ডাউন: (" + x + ", " + y + ")");
                        v.setBackgroundColor(0xFF4CAF50); // সবুজ
                        return true; // মুভ ইভেন্ট পেতে true দরকার
                    
                    case MotionEvent.ACTION_MOVE:
                        // রিয়েল-টাইম কোঅর্ডিনেট দেখানো
                        Toast.makeText(MainActivity.this, 
                            "ACTION_MOVE: সরানো হচ্ছে\nX: " + x + ", Y: " + y, 
                            Toast.LENGTH_SHORT).show();
                        // দ্রুত আপডেটের জন্য Log বা TextView.setText() ভালো (Toast سبম করে)
                        break;
                    
                    case MotionEvent.ACTION_UP:
                        Log.i("TouchEvent", "টাচ আপ: (" + x + ", " + y + ")");
                        v.setBackgroundColor(0xFFE0E0E0); // স্লেটি
                        break;
                    
                    case MotionEvent.ACTION_CANCEL:
                        Log.i("TouchEvent", "টাচ ক্যান্সেল");
                        v.setBackgroundColor(0xFFE0E0E0);
                        break;
                }
                return true; // সব ইভেন্ট হ্যান্ডল করা হয়েছে
            }
        });
    }
}

ACTION_MOVE বিশেষ징

  • হাই ফ্রিকোয়েন্সি: ড্র্যাগের সময় প্রতি সেকেন্ডে ৫০-১০০+ বার ফায়ার হতে পারে
  • ব্যাটারি/পারফরম্যান্স: Toast, লগিং, ভারী ক্যালকুলেশন এভอยেড করুন
  • ইতিহাস: `event.getHistorySize()` দিয়ে মিসড পয়েন্ট পাওয়া যায়
  • মাল্টি-টাচ: `getPointerCount()`, `getPointerId(index)` ব্যবহার করুন

ইতিহাস (History) এক্সেস করা

case MotionEvent.ACTION_MOVE:
    int historySize = event.getHistorySize();
    int pointerCount = event.getPointerCount();
    
    for (int h = 0; h < historySize; h++) {
        for (int p = 0; p < pointerCount; p++) {
            float historicalX = event.getHistoricalX(p, h);
            float historicalY = event.getHistoricalY(p, h);
            long historicalTime = event.getHistoricalEventTime(h);
            // পুরনো পয়েন্ট প্রসেস করুন (স্মুথ ড্রইং-এর জন্য)
        }
    }
    
    // বর্তমান পয়েন্ট
    for (int p = 0; p < pointerCount; p++) {
        float x = event.getX(p);
        float y = event.getY(p);
    }
    break;

অপ্টিমাইজেশন টিপস

  • Toast বদলে TextView বা Custom View-এ ড্র করুন
  • Choreographer বা Handler ব্যবহার করে UI আপডেট ব্যাচ করুন
  • অনাবশ্যক অবজেক্ট ক্রিয়েশন এভอยেড করুন (GC প্রেশার কমাতে)
  • Hardware acceleration সক্ষম রাখুন (ম্যানিফেস্টে `android:hardwareAccelerated="true"`)

ব্যবহারের ক্ষেত্র

  • ড্রইং/পেইন্টিং অ্যাপ
  • ড্র্যাগ-অ্যান্ড-ড্রপ UI
  • স্লাইডার/সিকবার কন্ট্রোল
  • ম্যাপ প্যান/জুম
  • গেম কন্ট্রোল (ভার্চুয়াল জয়স্টিক)
  • সোয়াইপ জেসচার ডিটেকশন

GestureDetector বিকল্প

সাধারণ জেসচারের জন্য (সোয়াইপ, ফ্লিং, স্ক্রোল):

GestureDetector gestureDetector = new GestureDetector(this, 
    new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, 
                                float distanceX, float distanceY) {
            // ড্র্যাগ/স্ক্রোল হ্যান্ডল
            return true;
        }
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, 
                               float velocityX, float velocityY) {
            // ফ্লিং (দ্রুত সোয়াইপ) হ্যান্ডল
            return true;
        }
    });

@Override
public boolean onTouchEvent(MotionEvent event) {
    return gestureDetector.onTouchEvent(event) || super.onTouchEvent(event);
}

অ্যাপ্লিকেশন চালানো

রান করলে টেক্সট ভিউতে আঙুল ড্র্যাগ করলে রিয়েল-টাইম কোঅর্ডিনেট টোস্টে দেখাবে (দ্রুত হবার কারণে স্প্যাম হতে পারে - লগক্যাট ভালো)।

লক্ষ্য করুন

  • ACTION_DOWN-এ true রিটার্ন না করলে ACTION_MOVE পাবেন না
  • MotionEventCompat ব্যবহার করুন API কমপ্যাটিবিলিটির জন্য
  • হাই ফ্রিকোয়েন্সি ইভেন্টে Toast নয়, লগ বা কাস্টম ভিউ ব্যবহার করুন
  1. অ্যান্ড্রয়েড ফ্র্যাগমেন্টে Context ব্যবহারের পদ্ধতি

  2. অ্যান্ড্রয়েডে Firebase Messaging ব্যবহারের পদ্ধতি

  3. অ্যান্ড্রয়েড টুলবারে SearchView ব্যবহার করার পদ্ধতি

  4. অ্যান্ড্রয়েডে XMLPullParser ব্যবহার করে XML পার্স করার পদ্ধতি