অ্যান্ড্রয়েডে 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 নয়, লগ বা কাস্টম ভিউ ব্যবহার করুন