- 在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中縮放組件。
- 在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();