ScaleGestureDetector ব্যবহার করে ইমেজ জুম ইমপ্লিমেন্টেশন
এই উদাহরণটি দেখাবে কীভাবে ScaleGestureDetector ব্যবহার করে পিনচ-টু-জুম (pinch-to-zoom) ফাংশনালিটি ইমেজভিউ-তে যোগ করা যায়।
পদক্ষেপ ১: প্রজেক্ট তৈরি করুন
Android Studio-তে নতুন প্রজেক্ট শুরু করুন।
পদক্ষেপ ২: লেআউট 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"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="matrix"
android:src="@drawable/your_image"
android:contentDescription="Zoomable image" />
</RelativeLayout>
পদক্ষেপ ৩: MainActivity.java - জুম লজিক
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private ScaleGestureDetector scaleGestureDetector;
private float scaleFactor = 1.0f;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
scaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());
}
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
scaleGestureDetector.onTouchEvent(motionEvent);
return true;
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFactor *= detector.getScaleFactor();
// জুম লিমিট: 1x থেকে 10x
scaleFactor = Math.max(1.0f, Math.min(scaleFactor, 10.0f));
imageView.setScaleX(scaleFactor);
imageView.setScaleY(scaleFactor);
return true;
}
}
}
মূল উদাহরণের সমস্যা ও সমাধান
মূল উদাহরণে লেআউট XML এবং জাভা কোডের ক্রম ভুল ছিল। এছাড়া `setScaleX/Y` শুধু স্কেল করে, প্যান (drag) করে নয়।
উন্নত জুম + প্যান ইমপ্লিমেন্টেশন (Matrix ব্যবহার)
public class ZoomableImageView extends AppCompatImageView {
private Matrix matrix = new Matrix();
private float maxScale = 10.0f;
private float minScale = 1.0f;
private float[] matrixValues = new float[9];
private ScaleGestureDetector scaleDetector;
private GestureDetector gestureDetector;
public ZoomableImageView(Context context, AttributeSet attrs) {
super(context, attrs);
setScaleType(ScaleType.MATRIX);
scaleDetector = new ScaleGestureDetector(context, new ScaleListener());
gestureDetector = new GestureDetector(context, new GestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleDetector.onTouchEvent(event);
gestureDetector.onTouchEvent(event);
return true;
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scale = detector.getScaleFactor();
float currentScale = getCurrentScale();
if ((scale > 1 && currentScale < maxScale) || (scale < 1 && currentScale > minScale)) {
matrix.postScale(scale, scale, detector.getFocusX(), detector.getFocusY());
fixTranslations();
setImageMatrix(matrix);
}
return true;
}
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) {
if (getCurrentScale() > minScale) {
matrix.postTranslate(-dx, -dy);
fixTranslations();
setImageMatrix(matrix);
}
return true;
}
}
private float getCurrentScale() {
matrix.getValues(matrixValues);
return matrixValues[Matrix.MSCALE_X];
}
private void fixTranslations() {
matrix.getValues(matrixValues);
float width = getDrawable().getIntrinsicWidth() * matrixValues[Matrix.MSCALE_X];
float height = getDrawable().getIntrinsicHeight() * matrixValues[Matrix.MSCALE_Y];
// সীমাবদ্ধ করুন যাতে ইমেজ ভিউয়ের বাইরে না যায়
// ... implementation details
}
}
লাইব্রেরি সুপারিশ (প্রোডাকশনের জন্য)
- PhotoView: `implementation 'com.github.chrisbanes:PhotoView:2.3.0'` - সবচেয়ে পপুলার
- TouchImageView: সিঙ্গেল ক্লাস ইমপ্লিমেন্টেশন
- Glide/Picasso + PhotoView: নেটওয়ার্ক ইমেজের জন্য