每天学一点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监听键盘显示和隐藏
  2. Android(安卓)DatePicker和TimePicker实践
  3. Android中使用手势识别功能
  4. 【安卓学习笔记】Android(安卓)Studio第9课——进度条ProgressBa
  5. 对android里布局文件当中的TextView对象设置事件监听,但是不响应
  6. 【Based Android】PreferenceActivity设置菜单介绍(续)
  7. android – 多屏幕适配相关
  8. 简述Android触摸屏手势识别
  9. Android单张图片查看、单指移动、双指缩放、双击最大化或最小化

随机推荐

  1. 深入理解Android(4)——理解Android中的JNI
  2. Android(安卓)Socket 聊天工具(一个服务端
  3. Android(安卓)音乐播放器的实现(一)自定义
  4. Android(安卓)Launcher研究(一)---------
  5. Android:让WebView支持元素,实现文件上传
  6. Android解决RecyclerView嵌套RecyclerVie
  7. Android(安卓)TV 焦点上下左右移动
  8. Android(安卓)为什么TextView文本有内容
  9. Android(安卓)Studio自带数据库SQLite的
  10. Android(安卓)仿qq聊天界面之一