Android手势放大缩小组件

Android手势放大缩小组件

这次是我第一次分享每天所学到的东西。今天所要分享的是在Android中实现对组件进行缩放(包括ImageView,TextView等组件)。实现该功能主要依靠ScaleGestureDetector类,该类主要是用于识别一些特定的手势,通过监听手势事件,从而进行相应的处理。下面就介绍具体如何使用。

1. 在Activity中使用

  1. 首先创建ScaleGestureDetector实例;
	private ScaleGestureDetector mScaleGestureDetector = null;
  1. 在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));
	}
  1. 监听onTouchEvent事件,在Fragment中实现View时这里有些区别,下面会详细介绍到;
	@Override
	public boolean onTouchEvent(MotionEvent event) {
	    // 返回给ScaleGestureDetector来处理
	    return mScaleGestureDetector.onTouchEvent(event);
	}
  1. 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中缩放组件。

2. 在Fragment中使用

在Fragment中缩放组件与在Activity中实现唯一的区别是Fragment中无法使用onTouchEvent方法进行监听手势。解决方法是在Activity中添加回调接口。

  1. 首先创建一个监听的实例OnTouchLinsenter ;
	private OnTouchLinsenter onTouchLinsenter;
  1. 创建监听回调接口;
    public interface OnTouchLinsenter {
        boolean onTouch(MotionEvent event);
    }
  1. 分别提供添加监听与销毁监听的方法;
    public void registerOnTouch(OnTouchLinsenter onTouchLinsenter) {
        this.onTouchLinsenter = onTouchLinsenter;
    }
    
    public void unRegisterOnTouch() {
        this.onTouchLinsenter = null;
    }
  1. 设置回调,触发时会将event回调给Fragment中;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 返回给ScaleGestureDetector来处理
        if(onTouchLinsenter != null) {
        	return onTouchLinsenter.onTouch(event);
        }
        return super.onTouchEvent(event);
    }
  1. 在Fragment中创建OnTouchLinsenter;
    private MainActivity.OnTouchLinsenter onTouchLinsenter;
  1. 初始化的时候设置监听;
	mScaleGestureDetector = new MyScaleGestureDetector(getActivity(), new MyScaleGestureListener(view));
	onTouchLinsenter = new MainActivity.OnTouchLinsenter(){
	    @Override
	    public boolean onTouch(MotionEvent event) {
	        return mScaleGestureDetector.onTouchEvent(event);
	    }
	};
  1. Fragment初始化的时候注册onTouchLinsenter监听;
	((MainActivity)getActivity()).registerOnTouch(onTouchLinsenter);
  1. Fragment中的onDestroy时候删除监听;
	((MainActivity)getActivity()).registerOnTouch();

这样在Fragment中也能轻松实现缩放组件啦!希望所分享得能够帮到你们。

猜你喜欢

转载自blog.csdn.net/qq_42866851/article/details/105695396
今日推荐