直播代碼Android手勢放大縮小組件

  1. 在Activity中使用
    首先創建ScaleGestureDetector實例;
private ScaleGestureDetector mScaleGestureDetector = null;

在onCreate方法中進行初始化,ScaleGestureDetector創建的時候需要兩個參數。參數1:上下文對象,參數2:用於監聽手勢的類,該類實現ScaleGestureDetector.OnScaleGestureListener;

//初始化
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    view = View.inflate(this, R.layout.activity_main, null);
setContentView(view); 
	//這裏的view是要設置縮放手勢的組件
    mScaleGestureDetector = new ScaleGestureDetector(this,new MyScaleGestureListener(view));
}

監聽onTouchEvent事件,在Fragment中實現View時這裏有些區別,下面會詳細介紹到;

@Override
public boolean onTouchEvent(MotionEvent event) {
    // 返回給ScaleGestureDetector來處理
    return mScaleGestureDetector.onTouchEvent(event);
}

MyScaleGestureListener類創建,用於處理監聽到的手勢事件 ;

import android.util.Log;
import android.view.ScaleGestureDetector;
import android.view.View;

public class MyScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener {

    private float scale;
    private float preScale = 1;// 默認前一次縮放比例爲1
    private View view;

    public ScaleGestureListener(View view) {
        this.view = view;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float previousSpan = detector.getPreviousSpan();
        float currentSpan = detector.getCurrentSpan();
        if (currentSpan < previousSpan) {
            // 縮小
            scale = preScale - (previousSpan - currentSpan) / 1000;
        } else {
            // 放大
            scale = preScale + (currentSpan - previousSpan) / 1000;
        }
        // 縮放view
        // scale表示縮放比,等於0時組件消失,爲1時撐滿父容器
        if (scale <= 0) {
            scale = 0;
        } else if (scale >= 1) {
            scale = 1;
        }
        view.setScaleX(scale);
        view.setScaleY(scale);
        return false;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        // 一定要返回true纔會進入onScale()這個函數
        return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
        preScale = scale;//記錄本次縮放比例
    }
}

這樣就能輕鬆的實現在Android中縮放組件。

  1. 在Fragment中使用
    在Fragment中縮放組件與在Activity中實現唯一的區別是Fragment中無法使用onTouchEvent方法進行監聽手勢。解決方法是在Activity中添加回調接口。

首先創建一個監聽的實例OnTouchLinsenter ;

private OnTouchLinsenter onTouchLinsenter;

創建監聽回調接口;

public interface OnTouchLinsenter {
    boolean onTouch(MotionEvent event);
}

分別提供添加監聽與銷燬監聽的方法;

public void registerOnTouch(OnTouchLinsenter onTouchLinsenter) {
    this.onTouchLinsenter = onTouchLinsenter;
}

public void unRegisterOnTouch() {
    this.onTouchLinsenter = null;
}

設置回調,觸發時會將event回調給Fragment中;

@Override
public boolean onTouchEvent(MotionEvent event) {
    // 返回給ScaleGestureDetector來處理
    if(onTouchLinsenter != null) {
    	return onTouchLinsenter.onTouch(event);
    }
    return super.onTouchEvent(event);
}

在Fragment中創建OnTouchLinsenter;

private MainActivity.OnTouchLinsenter onTouchLinsenter;

初始化的時候設置監聽;

mScaleGestureDetector = new MyScaleGestureDetector(getActivity(), new MyScaleGestureListener(view));
onTouchLinsenter = new MainActivity.OnTouchLinsenter(){
    @Override
    public boolean onTouch(MotionEvent event) {
        return mScaleGestureDetector.onTouchEvent(event);
    }
};

Fragment初始化的時候註冊onTouchLinsenter監聽;

((MainActivity)getActivity()).registerOnTouch(onTouchLinsenter);

Fragment中的onDestroy時候刪除監聽;

((MainActivity)getActivity()).registerOnTouch();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章