view基础知识介绍(一)
2016-06-21 17:02
309 查看
view基础知识介绍
view是一种界面层的控件的一种抽象 分为view和viewGroup viewGroup继承自view 也就是说view本身可以是单个控件 也可以是一个控件组 例如:一个view中可以包含view和viewGroup viewGroup中又可以包括view和viewGroup 以此类推
view的位置参数
view的位置主要由四个参数决定 left right top bottom 其中left为view的左侧横坐标 right为view右侧横坐标 top为view上边纵坐标 bottom为view下边纵坐标 这些坐标的位置都是相对坐标 相对于view的父控件而言 那么 view的width=right-left height=bottom-top 同时 这四个参数android也提供了对应的get方法
此外 还有x y translateX translateY x和y表示view左上角的坐标 translateX和translateY表示view左上角相对于父控件的偏移量 默认值为0 其中x=left+translateX y=top+translateY view在平移过程中left和top是不会发生改变的 改变的是x y translateX和translateY这四个参数。
MotionEvent(动作事件)
指手指在解除屏幕之后的一系列事件 其中典型的事件类型有 ACTION_DOWN 手指刚接触屏幕 ACTION_MOVE 手指在屏幕上移动 ACTION_UP 手指从屏幕上松开的一瞬间 例如:单击事件有ACTION_DOWN和ACTION_UP组成 滑动事件由一个ACTION_DOWN 多个ACTION_MOVE 和一个ACTION_UP组成 通过MotionEvent对象我们还可以获取到该事件发生时的x和y坐标 系统提供了两组方法
前一组方法获取的是相对于该view的坐标 后一组方法获取的是相对于屏幕左上角的坐标
TouchSlop
指的是能够被系统识别的最小的滑动距离 也就是说 当手指在屏幕上滑动的距离小于这个距离时 系统不认为你是在进行滑动操作 这是一个常量 和设备有关 可以通过以下方法获得
我们可以利用这个常量做一些相对应的过滤操作
VelocityTracker 速度追踪
用于跟踪手指在滑动过程中的速度 包括水平和竖直方向的速度 使用方式如下
需要注意的是 在获取速度之前必须先指定计算时间 同时 获取的速度为指定时间内手指划过的像素值
GestrueDetector 手势检测
用于辅助检测用户的单击 滑动 长按 双击等行为 使用方法如下
具体例子如下:
参考资料:Android开发艺术探索
view是一种界面层的控件的一种抽象 分为view和viewGroup viewGroup继承自view 也就是说view本身可以是单个控件 也可以是一个控件组 例如:一个view中可以包含view和viewGroup viewGroup中又可以包括view和viewGroup 以此类推
view的位置参数
view的位置主要由四个参数决定 left right top bottom 其中left为view的左侧横坐标 right为view右侧横坐标 top为view上边纵坐标 bottom为view下边纵坐标 这些坐标的位置都是相对坐标 相对于view的父控件而言 那么 view的width=right-left height=bottom-top 同时 这四个参数android也提供了对应的get方法
此外 还有x y translateX translateY x和y表示view左上角的坐标 translateX和translateY表示view左上角相对于父控件的偏移量 默认值为0 其中x=left+translateX y=top+translateY view在平移过程中left和top是不会发生改变的 改变的是x y translateX和translateY这四个参数。
MotionEvent(动作事件)
指手指在解除屏幕之后的一系列事件 其中典型的事件类型有 ACTION_DOWN 手指刚接触屏幕 ACTION_MOVE 手指在屏幕上移动 ACTION_UP 手指从屏幕上松开的一瞬间 例如:单击事件有ACTION_DOWN和ACTION_UP组成 滑动事件由一个ACTION_DOWN 多个ACTION_MOVE 和一个ACTION_UP组成 通过MotionEvent对象我们还可以获取到该事件发生时的x和y坐标 系统提供了两组方法
getX/getY getRawX/getRawY
前一组方法获取的是相对于该view的坐标 后一组方法获取的是相对于屏幕左上角的坐标
TouchSlop
指的是能够被系统识别的最小的滑动距离 也就是说 当手指在屏幕上滑动的距离小于这个距离时 系统不认为你是在进行滑动操作 这是一个常量 和设备有关 可以通过以下方法获得
ViewConfiguration.get(getContext()).getScaledTouchSlop()
我们可以利用这个常量做一些相对应的过滤操作
VelocityTracker 速度追踪
用于跟踪手指在滑动过程中的速度 包括水平和竖直方向的速度 使用方式如下
VeloCityTracker velocityTracker = VeloCityTracker.obtain(); velocityTracker.addMotionEvent(event); velocityTracker.computeCurrentVelocity(1000); //参数值为测量的时间 int xVelocity = velocityTracker.getXVelocity(); int yVelocity = velocityTracker.getYVelocity(); velocityTracker.clear(); velocityTracker.recycle();//当不需要计算时 需要调用这两个方法来重置并回收内存
需要注意的是 在获取速度之前必须先指定计算时间 同时 获取的速度为指定时间内手指划过的像素值
GestrueDetector 手势检测
用于辅助检测用户的单击 滑动 长按 双击等行为 使用方法如下
GestrueDector mGestrueDetector = new GestrueDetector(this); //解决长按屏幕后无法滑动的现象 mGestrueDetector.setIsLongpressEnable(false); //接管view的onTouchEvent方法 在onTouchEvent中添加如下实现 boolean consume = mGestrueDetector.onTouchEvent(event); return consume;
具体例子如下:
/** * 用以说明GestrueDetector(手势检测)的详细用法的说明 */ public class GestrueDetectorView extends View implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{ //我们在该类中实现了onGesrueListener和onDoubleTopListener 并构建了GestrueDetector对象 private final GestureDetector mGestureDetector = new GestureDetector(this); public GestrueDetectorView(Context context) { super(context); } /** * 在veiw的onTouchEvent方法中 用GestrueDetector的onTouchEvent方法来接管view的事件处理 并返回对应结果 * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { boolean consume = mGestureDetector.onTouchEvent(event); return consume; } //以下三个方法的触发顺序:onDown->onShowPress->onLongPress /** * 属于onGestrueListener接口 该方法由一个ACTION_DOWN触发 * * 用户按下屏幕就会触发 * @param e * @return */ @Override public boolean onDown(MotionEvent e) { return false; } /** * 属于onGestrueListener接口 该方法由一个ACTION_DOWN触发 不同的是 该方法强调的是尚未松开或者拖动状态 * * 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行 * @param e */ @Override public void onShowPress(MotionEvent e) { } /** * 属于onGestrueListener接口 该方法由一个ACTION_UP触发 单击行为 * * 触发顺序: * 点击一下非常快的(不滑动)Touchup: * onDown->onSingleTapUp->onSingleTapConfirmed * 点击一下稍微慢点的(不滑动)Touchup: * onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed * * @param e * @return */ @Override public boolean onSingleTapUp(MotionEvent e) { return false; } /** * 属于onGestrueListener接口 该方法由一个ACTION_DOWN和多个ACTION_MOVE触发 指拖动行为 手指还没有离开屏幕 * * 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法 在ACTION_MOVE动作发生时就会触发 * 滑屏:手指触动屏幕后,稍微滑动后立即松开 * onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling * 拖动 * onDown------》onScroll----》onScroll------》onFiling * * @param e1 ACTION_DOWN的MotionEvent * @param e2 最后一次ACTION_MOVE的MotionEvent * @param distanceX 相对于上次调用该方法时所滑动的x坐标距离 * @param distanceY 相对于上次调用该方法时所滑动的y坐标距离 * @return */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } /** * 属于onGestrueListener接口 用户长按屏幕时触发该方法 * * 长按触摸屏,超过一定时长,就会触发这个事件 * @param e */ @Override public void onLongPress(MotionEvent e) { } /** * 属于onGestrueListener接口 该方法由一个ACTION_DOWN和多个ACTION_MOVE以及一个ACTION_UP调用 * 属于快速滑动操作 * * 滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发 * * @param e1 第1个ACTION_DOWN MotionEvent * @param e2 最后一个ACTION_MOVE MotionEvent * @param velocityX X轴上的移动速度,像素/秒 * @param velocityY Y轴上的移动速度,像素/秒 * @return */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } /** * 属于onDoubleTapListener接口 该方法区别于onSingleTapUp 该方法是一个严格的单击行为 如果触发了该方法 那么只能是一个单击 * 而不可能是双击中的一次单击 * 当用户执行单机操作时 系统会首先执行onDown onSingleTapUp 然后在等待一段时间之后 * 确定该次点击不是双击操作之后 执行该方法 * @param e * @return */ @Override public boolean onSingleTapConfirmed(MotionEvent e) { return false; } /** * 属于onDoubleTapListener接口 在触发onDown onSingleTapUp方法之后 再次点击会触发该方法 * * 在第二下点击时,先触发OnDoubleTap,然后再触发OnDown(第二次点击) * 其次在触发OnDoubleTap以后,就开始触发onDoubleTapEvent了 * * @param e * @return */ @Override public boolean onDoubleTap(MotionEvent e) { return false; } /** * 属于onDoubleTapListener接口 该方法会在onDoubleTap方法之后被触发 包括双击之间的按下 滑动和抬起等操作 * @param e * @return */ @Override public boolean onDoubleTapEvent(MotionEvent e) { return false; } }
参考资料:Android开发艺术探索
相关文章推荐
- C#取得站点跟目录
- android之对话、单复框的使用
- 关于循环的一个有趣的事情是!
- 【ICU】【2.3】如何在2.3中编译ICU资源
- 深入解析Python中的__builtins__内建对象
- Crash 解决(2)
- Dagger2 小结
- Linux常用命令汇总-cut
- 刨根问底:什么是yum源,yum的工作原理又是什么
- 《Spring实战》学习笔记-第七章:Spring MVC进阶
- pandoc文档书写
- ACM牛人集
- hadoop的一个坑
- mongoDB详细查询语句
- 解读支付宝接口实现步骤
- maven jar Plugin参数配置
- 服务Service的基本用法
- JdbcUtils小工具1.0
- mysq 单列索引 与 组合索引区别
- Unity-读取本地txt