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

অ্যান্ড্রয়েডে ইমেজ জুম ফাংশনালিটি যোগ করা

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: নেটওয়ার্ক ইমেজের জন্য
  1. অ্যান্ড্রয়েডে Spinner ভ্যালু পাওয়ার পদ্ধতি

  2. অ্যান্ড্রয়েড ডিভাইসের স্ক্রিন উচ্চতা ও প্রস্থ কীভাবে পেতে হয়?

  3. প্রোগ্রামেটিক্যালি বর্তমান অ্যান্ড্রয়েড SDK ভার্সন কীভাবে পাবেন?

  4. অ্যান্ড্রয়েডে বাগ রিপোর্ট করার জন্য Logcat কীভাবে নিতে হয়