Android手势放大缩小组件
16lz
2021-01-23
每天学一点2020.4.22(Android-1)
- Android手势放大缩小组件
- 1. 在Activity中使用
- 2. 在Fragment中使用
Android手势放大缩小组件
这次是我第一次分享每天所学到的东西。今天所要分享的是在Android中实现对组件进行缩放(包括ImageView,TextView等组件)。实现该功能主要依靠ScaleGestureDetector类,该类主要是用于识别一些特定的手势,通过监听手势事件,从而进行相应的处理。下面就介绍具体如何使用。
1. 在Activity中使用
- 首先创建ScaleGestureDetector实例;
private ScaleGestureDetector mScaleGestureDetector = null;
- 在onCreate方法中进行初始化,ScaleGestureDetector创建的时候需要两个参数。参数1:上下文对象,参数2:用于监听手势的类,该类实现ScaleGestureDetector.OnScaleGestureListener;
//初始化@Overridepublic 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时这里有些区别,下面会详细介绍到;
@Overridepublic 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中缩放组件。
2. 在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();
这样在Fragment中也能轻松实现缩放组件啦!希望所分享得能够帮到你们。
更多相关文章
- [置顶] android四大组件之intent
- Android中使用手势识别功能
- Android单张图片查看、单指移动、双指缩放、双击最大化或最小化
- Android 应用程序四大组件
- Android常用组件之四大天王
- LinearLayout组件右对齐
- Android 学习笔记 —— Android 四大组件 与 MVC 架构模式