每天学一点2020.4.22(Android-1)

  • Android手势放大缩小组件
    • 1. 在Activity中使用
    • 2. 在Fragment中使用

Android手势放大缩小组件

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

1. 在Activity中使用

  1. 首先创建ScaleGestureDetector实例;
private ScaleGestureDetector mScaleGestureDetector = null;
  1. 在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));}
  1. 监听onTouchEvent事件,在Fragment中实现View时这里有些区别,下面会详细介绍到;
@Overridepublic 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中也能轻松实现缩放组件啦!希望所分享得能够帮到你们。

更多相关文章

  1. [置顶] android四大组件之intent
  2. Android中使用手势识别功能
  3. Android单张图片查看、单指移动、双指缩放、双击最大化或最小化
  4. Android 应用程序四大组件
  5. Android常用组件之四大天王
  6. LinearLayout组件右对齐
  7. Android 学习笔记 —— Android 四大组件 与 MVC 架构模式

随机推荐

  1. Android(安卓)SDK 与API版本对应关系
  2. Android的线程使用来更新UI----Thread、H
  3. Android核心分析(22)-----Android应用框架
  4. Android消息处理机制3——MessageQueue
  5. Android编译问题:Only 64-bit build envir
  6. gps架构分析
  7. Flutter工程中的Android风味使用
  8. android:configChanges属性总结
  9. Android(安卓)SDK无法更新问题解决
  10. Android开发EditText属性