Android应用开发之自定义View触摸相关工具类全解

public static int getPressedStateDuration() {}

//按住状态转变为长按状态需要的时间

public static int getLongPressTimeout() {}

//重新按键判断时间

public static int getKeyRepeatTimeout() {}

//重复按键延迟的时间

public static int getKeyRepeatDelay() {}

//判断是单击还是滚动的时间,在这个时间内没有移动则是单击,否则是滚动

public static int getTapTimeout() {}

//在这个时间内没有完成这个点击,那么就认为是一个点击事件

public static int getJumpTapTimeout() {}

//得到双击间隔时间,在这个时间内是双击,否则是单击

public static int getDoubleTapTimeout() {}

//不推荐使用,推荐getScaledEdgeSlop()代替;判断是否滑动事件

public static int getEdgeSlop() {}

public int getScaledEdgeSlop() {}

//不推荐使用,推荐getScaledTouchSlop()代替;滑动的时候,手的移动要大于这个距离才算移动

public static int getTouchSlop() {}

public int getScaledTouchSlop() {}

//触摸边沿padding区域的判断

public int getScaledPagingTouchSlop() {}

//不推荐使用,推荐getScaledDoubleTapSlop()代替;判断是否双击的阈值

public static int getDoubleTapSlop() {}

public int getScaledDoubleTapSlop() {}

//不推荐使用,推荐getScaledWindowTouchSlop()代替;触摸窗体边沿区域判断

public static int getWindowTouchSlop() {}

public int getScaledWindowTouchSlop() {}

//不推荐使用,推荐getScaledMinimumFlingVelocity()代替;得到滑动的最小速度, 以像素/每秒来进行计算

public static int getMinimumFlingVelocity() {}

public int getScaledMinimumFlingVelocity() {}

//不推荐使用,推荐getScaledMaximumFlingVelocity()代替;得到滑动的最大速度, 以像素/每秒来进行计算

public static int getMaximumFlingVelocity() {}

public int getScaledMaximumFlingVelocity() {}

//不推荐使用,推荐getScaledMaximumDrawingCacheSize()代替;获取最大的图形可缓存大小,单位bytes

public static int getMaximumDrawingCacheSize() {}

public int getScaledMaximumDrawingCacheSize() {}

}

有了上面这个工具类,我们在自定义控件处理滑动手势等判断时就可以很方便的判断出临界值等问题,不用我们再去自己测试定义一个近似的值来代替。

特别注意: ViewConfiguration还有一个在support包中的兼容类ViewConfigurationCompat,使用时请注意一下。

【工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果。私信联系我

Scroller加强版OverScroller回弹工具类

================================

之前有篇博客说到了Scroller的源码浅析,其实Scroller在API 1就出现了,而这里要说的Scroller加强版OverScroller在API 9才出现,所以功能指定比之前的Scroller强大,支持了回弹效果(关于不同的回弹效果我们可以自定义不同的动画插值器即可),不过原理基本和之前分析的Scroller源码一样,所以这里我们不会再对OverScroller源码分析,只对他和Scroller的差异进行说明,下面我们来看看。

OverScroller在Scroller类基础上多出来的方法:

| 方法 | 含义 |

| — | — |

| isOverScrolled() | 返回当前的位置是否有效或者是否超出滚动边界。 |

| springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) | 当你想回滚的时候调用这个方法,回滚的范围在有效的坐标范围内。 |

| fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY, int overX, int overY) | 同Scroller的,只是最后两个参数含义为fling滚动超过有效值的范围。 |

| notifyHorizontalEdgeReached(int startX, int finalX, int overX) | 通知水平滚动是否到达边界。 |

| notifyVerticalEdgeReached(int startY, int finalY, int overY) | 同上。 |

关于Scroller的基本使用流程可以参见我之前博客Scroller源码浅析和ViewDragHelper源码浅析两篇文章,如果需要深入理解可以看看官方ScrollView的实现,其就完全使用了OverScroller。

特别注意: Scroller(OverScroller)这货也有一个在support兼容包的兼容类ScrollerCompat,使用时请留意一下。

【工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果。私信联系我

VelocityTracker手势速率工具类

==========================

VelocityTracker主要用跟踪触摸屏事件(Flinging及其他Gestures手势事件等)的速率。我们在拿到实例后可以通过computeCurrentVelocity(int)来初始化速率的单位,然后接着通过addMovement(MotionEvent)方法将MotionEvent加入VelocityTracker实例中,然后在需要的地方通过getXVelocity() 或getXVelocity()获得横向和竖向的速率即可。

下面给出相关的API说明(VelocityTracker许多方法都是native实现的):

public final class VelocityTracker {

//获取VelocityTracker实例

static public VelocityTracker obtain() {}

public static VelocityTracker obtain(String strategy) {}

//回收后代表你不需要使用了,系统将此对象在此分配到其他请求者

public void recycle() {}

//清空回到初始状态,computeCurrentVelocity都被reset了

public void clear() {}

//将事件加入到VelocityTracker类实例中

public void addMovement(MotionEvent event) {}

//unitis表示速率的基本时间单位,1表示一毫秒时间单位内运动了多少个像素

public void computeCurrentVelocity(int units) {}

//同上,floatVelocity表示速率的最大值,超过最大值的都返回最大值

public void computeCurrentVelocity(int units, float maxVelocity) {}

//获取xy方向速率

public float getXVelocity() {}

public float getYVelocity() {}

//获取xy速率,id为event的pointid

public float getXVelocity(int id) {}

public float getYVelocity(int id) {}

}

有了上面这些手势速率的检测工具类,下面我们来看下他的一些通用模板:

VelocityTracker mVelocityTracker = null;

@Override

public boolean onTouchEvent(MotionEvent event){

int action = event.getAction();

switch(action){

case MotionEvent.ACTION_DOWN:

if(mVelocityTracker == null){

mVelocityTracker = VelocityTracker.obtain();

}else{

mVelocityTracker.clear();

}

mVelocityTracker.addMovement(event);

break;

case MotionEvent.ACTION_MOVE:

mVelocityTracker.addMovement(event);

mVelocityTracker.computeCurrentVelocity(1000);

Log.i("X = "+mVelocityTracker.getXVelocity());

Log.i("Y = "+mVelocityTracker.getYVelocity());

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

mVelocityTracker.recycle();

break;

}

return true;

}

关于速率检测类的知识就介绍到这里,没啥新鲜的。

【工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果。私信联系我

GestureDetector手势工具类

========================

除了我们通过onTouchEvent()自己处理一堆复杂的手势以外,其实Android给我们提供了现成的便捷方式,那就是GestureDetector手势监听类,如下:

public class GestureDetector {

public interface OnGestureListener {

//ACTION_DOWN时触发

boolean onDown(MotionEvent e);

//ACTION_DOWN了过一会还没有滑动时触发,onDown->onShowPress->onLongPress

void onShowPress(MotionEvent e);

//ACTION_DOWN后没有滑动(onScroll)且没有长按(onLongPress)接着ACTION_UP时触发

boolean onSingleTapUp(MotionEvent e);

//滑动时实时触发

boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);

//ACTION_DOWN长按时触发

void onLongPress(MotionEvent e);

//触摸滑动一定距离后松手ACTION_UP时触发,后参数为速率

boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);

}

public interface OnDoubleTapListener {

//ACTION_DOWN后没有滑动(onScroll)且没有长按(onLongPress)接着ACTION_UP时触发

boolean onSingleTapConfirmed(MotionEvent e);

//双击的第二下ACTION_DOWN时触发

boolean onDoubleTap(MotionEvent e);

//双击的第二下ACTION_DOWN和ACTION_UP都会触发,e.getAction()区别

boolean onDoubleTapEvent(MotionEvent e);

}

public interface OnContextClickListener {

//context点击触发,与View#onGenericMotionEvent(MotionEvent)相关,不常用

boolean onContextClick(MotionEvent e);

}

public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener,

OnContextClickListener {

//OnGestureListener、OnDoubleTapListener、OnContextClickListener所有接口的默认实现

}

//各种推荐的不推荐的构造方法

@Deprecated

public GestureDetector(OnGestureListener listener, Handler handler) {}

@Deprecated

public GestureDetector(OnGestureListener listener) {}

public GestureDetector(Context context, OnGestureListener listener) {}

public GestureDetector(Context context, OnGestureListener listener, Handler handler) {}

public GestureDetector(Context context, OnGestureListener listener, Handler handler,

boolean unused) {}

//其他两类回调接口的设置,OnGestureListener必须在构造中就处理掉

public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) {}

public void setContextClickListener(OnContextClickListener onContextClickListener) {}

//一些处理判断方法

public void setIsLongpressEnabled(boolean isLongpressEnabled) {}

public boolean isLongpressEnabled() {}

public boolean onTouchEvent(MotionEvent ev) {}

public boolean onGenericMotionEvent(MotionEvent ev) {}

}

有了上面这些GestureDetector手势工具类的基本API介绍之后我们就可以各种使用了,没啥特殊的介绍。

特别注意: 其实手势相关的东西还有Gesture类等GestureOverlayView手势创建识别类的,这里不作介绍,作为拓展。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末

面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

文末

面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责!

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值