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

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

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

এই টিউটোরিয়ালে শিখব কিভাবে `MotionEvent.ACTION_UP` ব্যবহার করে আঙুল স্ক্রিন থেকে তুলার মুহূর্তে (রিলিজ ইভেন্ট) অ্যাকশন নেওয়া যায়। এটি ক্লিক, ট্যাপ, ড্র্যাগ এন্ড ইত্যাদি ডিটেক্ট করার জন্য ব্যবহৃত হয়।

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

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

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 UP টেস্ট\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.view.MotionEvent;
import android.view.View;
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 UP টেস্ট\n(এখানে ট্যাপ করুন)");
        
        actionEvent.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = MotionEventCompat.getActionMasked(event);
                
                if (action == MotionEvent.ACTION_DOWN) {
                    // স্পর্শ শুরু - ভিজ্যুয়াল ফিডব্যাক
                    v.setBackgroundColor(0xFF4CAF50); // সবুজ
                    return true; // মুভ/আপ ইভেন্ট পেতে true
                } 
                else if (action == MotionEvent.ACTION_UP) {
                    // আঙুল তোলা - ক্লিক কমপ্লিট
                    Toast.makeText(MainActivity.this, 
                        "ACTION_UP: আঙুল তোলা হয়েছে!\nX: " + event.getX() + ", Y: " + event.getY(), 
                        Toast.LENGTH_SHORT).show();
                    v.setBackgroundColor(0xFFE0E0E0); // স্লেটি
                    return true;
                } 
                else if (action == MotionEvent.ACTION_CANCEL) {
                    // সিস্টেম দ্বারা ক্যান্সেল (যেমন: ফোন কল, নোটিফিকেশন)
                    v.setBackgroundColor(0xFFE0E0E0);
                    return true;
                }
                
                return false;
            }
        });
    }
}

ACTION_UP বনাম ACTION_DOWN বনাম ACTION_CANCEL

ক্লিক ডিটেকশন লজিক (সিম্পল ট্যাপ)

private float downX, downY;
private long downTime;
private static final float MAX_CLICK_DISTANCE = 20f; // পিক্সেল
private static final long MAX_CLICK_DURATION = 300; // মিলিসেকেন্ড

@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = MotionEventCompat.getActionMasked(event);
    float x = event.getX();
    float y = event.getY();
    
    switch (action) {
        case MotionEvent.ACTION_DOWN:
            downX = x; downY = y; downTime = System.currentTimeMillis();
            v.setBackgroundColor(0xFF4CAF50);
            return true;
            
        case MotionEvent.ACTION_MOVE:
            // বড় মুভমেন্ট হলে ক্লিক না ধরা
            float distance = (float) Math.hypot(x - downX, y - downY);
            if (distance > MAX_CLICK_DISTANCE) {
                v.setBackgroundColor(0xFFFF9800); // نارঙ্গি (ড্র্যাগ মোড)
            }
            return true;
            
        case MotionEvent.ACTION_UP:
            long duration = System.currentTimeMillis() - downTime;
            float distance = (float) Math.hypot(x - downX, y - downY);
            
            if (duration < MAX_CLICK_DURATION && distance < MAX_CLICK_DISTANCE) {
                // ভ্যালিড ক্লিক!
                performClickAction(v);
            }
            v.setBackgroundColor(0xFFE0E0E0);
            return true;
            
        case MotionEvent.ACTION_CANCEL:
            v.setBackgroundColor(0xFFE0E0E0);
            return true;
    }
    return false;
}

private void performClickAction(View v) {
    Toast.makeText(this, "সফল ক্লিক!", Toast.LENGTH_SHORT).show();
    // আপনার ক্লিক লজিক এখানে
}

OnClickListener vs OnTouchListener (ACTION_UP)

ইভেন্টট্রিগারব্যবহার
ACTION_DOWNপ্রথম স্পর্শড্র্যাগ শুরু, লং প্রেস টাইমার 스타্ট
ACTION_MOVEআঙুল সরানোড্র্যাগ চলছে, স্ক্রোল ডিটেকশন
ACTION_UPসফলভাবে আঙুল তোলাক্লিক/ট্যাপ কমপ্লিট, ড্র্যাগ এন্ড
ACTION_CANCELসিস্টেম ইন্টারাপ্টক্যান্সেলড অপারেশন, ক্লিনআপ
বিষয়OnClickListenerOnTouchListener (ACTION_UP)
সহজতাখুব সহজম্যানুয়াল লজিক লাগে
কোঅর্ডিনেটপাওয়া যায় নাপাওয়া যায় (event.getX/Y)
লং প্রেসOnLongClickListener আলাদাটাইমার দিয়ে কাস্টমাইজযোগ্য
ড্র্যাগ ডিটেকশননাহ্যাঁ (MOVE ট্র্যাক করে)
মাল্টি-টাচনাহ্যাঁ (পয়েন্টার আইডি দিয়ে)

GestureDetector ব্যবহার (সহজ পদ্ধতি)

GestureDetector detector = new GestureDetector(this, 
    new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            // সিঙ্গেল ট্যাপ কনফার্মড (ডাবল ট্যাপ ওয়াট না করে)
            return true;
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            // ডাবল ট্যাপ
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            // লং প্রেস
        }
    });

view.setOnTouchListener((v, event) -> detector.onTouchEvent(event));

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

রান করলে টেক্সট ভিউতে ট্যাপ করলে (ডাউন + আপ) টোস্টে "ACTION_UP" দেখাবে। ড্র্যাগ করলে কিছুই হবে না।

লক্ষ্য করুন

  • ACTION_DOWN-এ true রিটার্ন করলে মাত্র ACTION_UP পাবেন
  • ACTION_CANCEL হ্যান্ডল করুন (সিস্টেম ইন্টারাপ্টের জন্য)
  • ক্লিক ডিটেকশনে দূরত্ব ও সময় দুটোই চেক করুন
  • Accessibility: TalkBack ব্যবহারকারীরা ডাবল ট্যাপ করেন - onClick আপনারই কাজ করবে
  1. অ্যান্ড্রয়েড ফ্র্যাগমেন্টে Context ব্যবহারের পদ্ধতি

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

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

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