Phóng to thu nhỏ trong Android với ScaleGestureDetector

Nếu chưa biết thì khó khăn nhưng khi biết rồi chúng ta thực hiện nó một cách rất đơn giản.

Để phóng to thu nhỏ 1 cái View hay ImageView (bản chất nó cũng là View) thì cần sử dụng một đối tượng của lớp ScaleGestureDetector đặt tại Library/Android/sdk/platforms/android-28/android.jar!/android/view/ScaleGestureDetector.java đường dẫn này sẽ thay đổi tuỳ thuộc vào bộ SDK (là cái compileSdkVersion) mà bạn đang dùng là gì.

Lớp này có 1 interface là OnScaleGestureListener và 1 lớp SimpleOnScaleGestureListener đã implement cái interface OnScaleGestureListener này sẵn rồi.

Vậy vấn đề là bạn cần hiểu khi View hay Activity của bạn cần chức năng zoom thì bắt buộc phải:
1. là implement interface OnScaleGestureListener
2. là phải kế thừa lớp SimpleOnScaleGestureListener

Cả 2 cách đều giống nhau và khác nhau duy nhất là tính chất của interface và class. Nếu bạn dùng interface thì phải override hết các method còn dùng extend thì chỉ cần override hàm mà bạn cần.

Có 3 hàm sau:

public boolean onScale – chỉ cần hàm này cũng phóng to thu nhỏ được.

public boolean onScaleBegin

public void onScaleEnd

Lý thuyết là thế, bây giờ đến thực hành:

Tạo một đối tượng xử lý nghe sự kiện scale trên màn hình

private float mScaleFactor = 1.0f;
private ScaleGestureDetector.SimpleOnScaleGestureListener onScaleGestureListener = new ScaleGestureDetector.SimpleOnScaleGestureListener() {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            mScaleFactor *= detector.getScaleFactor();
            mScaleFactor = Math.max(0.5f, Math.min(mScaleFactor, 2.5f));
            wrapper1.setScaleX(mScaleFactor);
            wrapper1.setScaleY(mScaleFactor);
            return true;
        }
    };

cái wrapper1 là cái sẽ được phóng to thu nhỏ. 0.5f là thu nhỏ nhất có thể và 2.5f là phóng to nhất có thể.

Tạo đối tượng mScaleGestureDetector của lớp ScaleGestureDetector

private ScaleGestureDetector mScaleGestureDetector = new ScaleGestureDetector(wrapper1.getContext(), onScaleGestureListener);

Gọi hàm onTouchEvent của lớp scale

@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleGestureDetector.onTouchEvent(event);
return true;
}

Ok vậy là xong, bạn tạo project nhỏ và thử cái này xem sao. Có thắc hãy để lại comment bên dưới.

Bạn có thể đọc thêm bài này cũng khá tổng quát: https://en.proft.me/2017/06/25/detecting-gestures-android-gesturedetector/

Các bài viết không xem thì tiếc:

Chia sẻ là sexy

dotrinh

Một lập trình viên dũng cảm, hòa đồng, luôn sống tích cực và anh ấy quay tay khỏe và khéo trong môn bi lắc :) Xem thêm thông tin tại trang -> Giới thiệu

Thảo luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.