博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ViewDragHelper: ViewDragHelper的简单使用
阅读量:4099 次
发布时间:2019-05-25

本文共 4806 字,大约阅读时间需要 16 分钟。

两个布局:SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动。

ViewDragHelper解决了android中手势处理过于复杂的问题,主要可以用来拖拽和设置ViewGroup中子View的位置。

ViewDragHelper的简单例子:

package com.example.zxtext.diyUi;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Point;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.core.view.MotionEventCompat;import androidx.customview.widget.ViewDragHelper;/** 关于ViewDragHelper的使用:* 其实ViewDragHelper并不是第一个用于分析手势处理的类,gesturedetector也是,* 但是在和拖动相关的手势分析方面gesturedetector只能说是勉为其难。* ViewDragHelper 处理比较复杂的手势操作* */public class DragLayout extends LinearLayout {
/*ViewDragHelper一般用在一个自定义ViewGroup的内部, * 比如下面自定义了一个继承于LinearLayout的DragLayout, * DragLayout内部有一个子view mDragView作为成员变量:来展示它的一些手势操作* */ private final ViewDragHelper mDragHelper; private View mTextView;//简单的移动 private TextView mTextView;//简单的移动 private TextView mAutoView;//演示除了移动后,松手自动返回到原本的位置。(注意你拖动的越快,返回的越快) private TextView mEdgeTrackView;//边界移动时对View进行捕获。 private Point mAutoViewOriginPos = new Point();//记录mAutoView原来的位置 public DragLayout(Context context) {
this(context,null); } public DragLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0); } public DragLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); Log.e("defStyleAttr","defStyleAttr"); //1.0f是敏感度参数参数越大越敏感。第一个参数为this,表示该类生成的对象, // 他是ViewDragHelper的拖动处理对象,必须为ViewGroup。 mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {
//tryCaptureView如何返回ture则表示可以捕获该view, // 你可以根据传入的第一个view参数决定哪些view可以捕获 @Override public boolean tryCaptureView(@NonNull View child, int pointerId) {
//mTextView = (TextView) child; //mEdgeTrackView禁止直接移动 return child == mAutoView ||child == mTextView; } @Override public int clampViewPositionHorizontal(@NonNull View child, int left, int dx) {
//最小x的坐标不能小于leftBound /* final int leftBound = getPaddingLeft(); //最大x坐标不能大于rightBound final int rightBound = getWidth()- mTextView.getWidth()-getPaddingRight(); //x拖动后的坐标 final int newLeft = Math.min(Math.max(left,leftBound),rightBound);*/ return left; } @Override public int clampViewPositionVertical(@NonNull View child, int top, int dy) {
return top; } //手指释放的时候回调 @Override public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) {
//mAutoView 手指释放自动回去 if(releasedChild == mAutoView){
mDragHelper.settleCapturedViewAt(mAutoViewOriginPos.x,mAutoViewOriginPos.y); invalidate(); } } //在边界拖动时回调 //主动通过captureChildView对其进行捕获,该方法可以绕过tryCaptureView, @Override public void onEdgeDragStarted(int edgeFlags, int pointerId) {
mDragHelper.captureChildView(mEdgeTrackView,pointerId); } }); mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b); mAutoViewOriginPos.x = mAutoView.getLeft(); mAutoViewOriginPos.y = mAutoView.getTop(); } @Override public void computeScroll() {
if(mDragHelper.continueSettling(true)){
invalidate(); } } @Override protected void onFinishInflate() {
super.onFinishInflate(); mTextView = (TextView) getChildAt(0); mAutoView = (TextView) getChildAt(1); mEdgeTrackView = (TextView) getChildAt(2); } //onInterceptTouchEvent中通过使用mDragger.shouldInterceptTouchEvent(event) // 来决定我们是否应该拦截当前的事件。 //要让ViewDragHelper能够处理拖动,需要将触摸事件传递给ViewDragHelper, @Override public boolean onInterceptTouchEvent(MotionEvent ev) {
return mDragHelper.shouldInterceptTouchEvent(ev); } // onTouchEvent中通过mDragger.processTouchEvent(event)处理事件。 @Override public boolean onTouchEvent(MotionEvent event) {
mDragHelper.processTouchEvent(event); return true; }}

参考:https://www.jianshu.com/p/a9e0a98e4d42

转载地址:http://fhrii.baihongyu.com/

你可能感兴趣的文章
计算机网络-OSI各层概述
查看>>
Java--String/StringBuffer/StringBuilder区别
查看>>
mySQL--深入理解事务隔离级别
查看>>
分布式之redis复习精讲
查看>>
数据结构与算法7-栈
查看>>
Java并发编程 | 一不小心就死锁了,怎么办?
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ06:旋转数组的最小数字
查看>>
(python版)《剑指Offer》JZ13:调整数组顺序使奇数位于偶数前面
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ32:把数组排成最小的数
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>
Java 8新特性:Stream API
查看>>
管理用户状态——Cookie与Session
查看>>
最受欢迎的前端框架Bootstrap 入门
查看>>
JavaScript编程简介:DOM、AJAX与Chrome调试器
查看>>
通过Maven管理项目依赖
查看>>