onTouchEvent ব্যবহার করে টাচ ইভেন্ট হ্যান্ডলিং
এই উদাহরণটি দেখায় কীভাবে Activity-এ `onTouchEvent()` ওভাররাইড করে স্ক্রিনে টাচ ইভেন্ট ডিটেক্ট করা এবং কোঅর্ডিনেট পাওয়া যায়।
ধাপ ১: নতুন প্রজেক্ট তৈরি করুন
Android Studio-তে File → New Project থেকে প্রজেক্ট তৈরি করুন।
ধাপ ২: লেআউট XML (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="4dp"
tools:context=".MainActivity">
</RelativeLayout>
ধাপ ৩: MainActivity.java বাস্তবায়ন
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private boolean isTouch = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
int action = event.getAction();
String actionName = "";
switch (action) {
case MotionEvent.ACTION_DOWN:
actionName = "ACTION_DOWN";
isTouch = true;
break;
case MotionEvent.ACTION_MOVE:
actionName = "ACTION_MOVE";
break;
case MotionEvent.ACTION_UP:
actionName = "ACTION_UP";
break;
case MotionEvent.ACTION_CANCEL:
actionName = "ACTION_CANCEL";
break;
case MotionEvent.ACTION_POINTER_DOWN:
actionName = "POINTER_DOWN (Multi-touch)";
break;
case MotionEvent.ACTION_POINTER_UP:
actionName = "POINTER_UP (Multi-touch)";
break;
}
// টোস্ট দেখান (বहুত ফ্রিকোয়েন্ট হলে লগ ব্যবহার করুন)
Toast.makeText(this, actionName + " X: " + x + " Y: " + y, Toast.LENGTH_SHORT).show();
return true; // true রিটার্ন করলে ইভেন্ট কনসুমড মনে হবে
}
}
MotionEvent এর মূল অ্যাকশন টাইপ
| অ্যাকশন | ব্যাখ্যা |
|---|---|
| ACTION_DOWN | প্রথম আঙুল স্ক্রিন স্পর্শ করল |
| ACTION_MOVE | আঙুল স্ক্রিনে সরানো হচ্ছে |
| ACTION_UP | আঙুল স্ক্রিন থেকে উঠল |
| ACTION_CANCEL | জেসচার ক্যান্সেল হয়েছে |
| ACTION_POINTER_DOWN/UP | মাল্টি-টাচ: অতিরিক্ত আঙুল স্পর্শ/উঠল |
প্রোগ্রাম্যাটিক্যালি টাচ ইভেন্ট সিমুলেট করা (Instrumentation)
টেস্টিং বা অটোমেশনের জন্য টাচ ইভেন্ট ইঞ্জেক্ট করা যায় (সিস্টেম পারমিশন দরকার):
import android.app.Instrumentation; import android.os.SystemClock; Instrumentation instrumentation = new Instrumentation(); // টাচ ডাউন long downTime = SystemClock.uptimeMillis(); MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0); instrumentation.sendPointerSync(downEvent); // টাচ আপ long upTime = SystemClock.uptimeMillis(); MotionEvent upEvent = MotionEvent.obtain(downTime, upTime, MotionEvent.ACTION_UP, x, y, 0); instrumentation.sendPointerSync(upEvent); // মেমরি রিলিজ downEvent.recycle(); upEvent.recycle();
দ্রষ্টব্য: সিকিউরিটি সীমাবদ্ধতা
- সাধারণ অ্যাপ অন্য অ্যাপের ওপর টাচ ইভেন্ট ইঞ্জেক্ট করতে পারে না
- `INJECT_EVENTS` পারমিশন শুধু সিস্টেম অ্যাপে দেয়া হয়
- UI টেস্টের জন্য **Espresso** বা **UIAutomator** ব্যবহার করুন
ধাপ ৪: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
অ্যাপ্লিকেশন টেস্ট করুন
অ্যাপ রান করুন এবং স্ক্রিনের যেকোনো জায়গায় টাচ করুন। টোস্ট মেসেজে টাচের ধরন (DOWN, MOVE, UP) এবং X, Y কোঅর্ডিনেট দেখাবে।