android -view基础
2016-06-02 11:45
507 查看
3.1.2.view 的位置
view的位置主要由它的四个顶点来决定,分别对应于view的四个属性:top、left、right、bottom,top:左上角纵坐标
left: 左上角横坐标
right:右下角横坐标
bottom:右下角纵坐标
这些坐标都是相对于view的父容器来说的:如图:
通过坐标很容易得出view的宽和高
width = right - left
height = bottom-top
关于view的一些属性的获取与含义
left = getLeft();
right = getRight();
top = getTop();
bottom = getBottom();
android 3.0后额外的属性x,y ,translationX,translationY
x,y:是view左上角的坐标
translationX,translationY:是View左上角相对于父容器的偏移量,默认值是0
注意:这几个参数都是相对于父容器的
参数间的关系:
x = left + translationX
y = top + translationY
注意:在View平移的过程中,top, left 是view距离父控件的原始坐标,是不会改变的
3.1.3 MotionEvent 和 TouchSlop
1. MotionEvent:是手指接触屏幕后所产生的一系列事件
ACTION_DOWN — 手指刚接触屏幕ACTION_MOVE — 手指在屏幕上移动
ACTION_UP — 手指从屏幕上松开的一瞬间
通过MotionEvent 对象可以得到点击事件过程中发生的x,y 坐标
getX();getY(); : 返回的是相对于当前自身View 左上角的x,y 坐标
getRawX(); getRawY(); : 返回的是相对于手机屏幕左上角的x,y坐标
2.TouchSlop
TouchSlop是系统所能识别出的被认为是滑动的最小距离,意思是:当滑动的距离小于这个常量值,那么系统就不认为是在进行滑动操作,这个常量和设备有关,不同设备上这个值不同获取方式:ViewConfiguration.get(getContext()).getScaledTouchSlop();
3.1.4 VelocityTracker GestureDetector 和 Scroller
1.VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的的速度使用:在View 的onTouchEvent方法中追踪当前点击事件的速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
获取当前的速度:
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
需要注意:
获取速度之前必须先计算速度,即getXVelocity 和 getYVelocity这两个方法的前面必须使用computeCurrentVelocity()方法
这里的速度是指在一段时间内手指所滑过的像素数,比如将时间间隔设为1000ms,在1s内,手指在水平方向从左向右滑动100像素,那么水平速度是100,如果手指由右向左滑动,那么水平速度就为负数
速度 = (终点位置 - 起点位置)/ 时间段
如果我们通过velocityTracker.computeCurrentVelocity(100);来获取速度,那么得到的速度就是手指在100ms内所滑过的像素数,因此水平速度就成了10像素/每100ms,即水平速度为10,(这里假设滑动过程为匀速)
最后当不需要使用时,需要调用clear方法来重置并回收内存
velocityTracker.clear();
velocityTracker.recycle();
2.GestureDetector
手势检测,用于辅助检测用户的点击,滑动,长按,双击等行为3.Scroller
弹性滑动对象,用于实现View的弹性滑动,当使用View的scrollTo/scrollBy方法来进行滑动时,其过程是瞬间完成的,没有过度效果,用户体验不好,这个时候就可以使用Scroller来实现Scroller scroller = new Scroller(getContext()); //缓慢滑动到指定位置 private void smoothScrollTo(int destX,int dextY){ int scrollX = getScrollX(); int delta = destX - scrollX; //1000ms内滑向destX ,效果就是缓慢滑动 mScroller.startScroll(scrollX,0,delta,0,1000); invalidate(); } @Override public void computeScroll() { if(mScroller.computeScrollOffset){ scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); postInvalidate(); } }
Scroller 本身并不能实现View的滑动,他需要配合computeScroll()方法才能实现弹性滑动的效果
3.2 View 的滑动
通过三种方式可以实现View的滑动通过View自身提供的scrollTo/scrollBy方法
通过动画给View施加平移效果来实现滑动
通过改变View的LayoutParams使的View重新布局从而实现滑动
3.2.1 使用scrollTo/scrollBy
View的两个属性mScrollX ,mScrollY ,这两个属性可以通过getScrollX(),getScrollY()得到,mScrollX,mScrollY的单位为像素,是移动的距离scrollTo/scrollBy实现view的滑动,只能将view 的内容进行移动,并不能将View本身进行滑动,
3.3 弹性滑动
三种方式实现弹性滑动Scroller
通过动画
使用延时策略
3.4 View的事件分发机制
3.4.1 点击事件的传递规则
事件的分发过程由三个很重要的方法来共同完成dispatchTouchEvent 、onInterceptTouchEvent 、 onTouchEventpublic boolean dispatchTouchEvent(MotionEvent ev)
用来进行事件的分发
public boolean onInterceptTouchEvent(MotionEvent event)
在上述方法内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件
public boolean onTouchEvent(MotionEvent ev)
在dispatchTouchEvent 方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件
以上三个方法的关系用以下伪代码表示
public boolean dispatchTouchEvent(MotionEvent ev){ boolean consume = false; if(onInterceptTouchEvent(ev)){ consumen = onTouchEvent(ev); }else{ consumen = child.dispatchTouchEvent(ev); } return consume; }
注意:
1. viewGroup 默认是不拦截任何事件的,android源码中viewGroup的onInterceptTouchEvent方法默认返回false
2. view没有onInterceptTouchEvent方法,一旦有点击事件传递给他,那么它的onTouchEvent方法就会被调用
3. view的onTouchEvent默认都会消耗事件(返回true),除非它是不可点击的(clickable 和longClickable 同时为false).View 的longClickable属性默认都为false,clickable 属性默认为false
相关文章推荐
- 配置View桌面时找不到域的解决方法
- 完全克隆的虚拟桌面部署问题
- 实例讲解JavaScript的Backbone.js框架中的View视图
- Android中View自定义组合控件的基本编写方法
- Android重写View实现全新的控件
- Android自定义View过程解析
- Android自定义View软键盘实现搜索
- thinkphp3.x自定义Action、Model及View的简单实现方法
- codeigniter中view通过循环显示数组数据的方法
- MVVM模式中ViewModel和View、Model有什么区别?
- Android使用WindowManager构造悬浮view
- Android App开发中自定义View和ViewGroup的实例教程
- Android应用开发中View绘制的一些优化点解析
- 自定义滑动按钮为例图文剖析Android自定义View绘制
- Android自定义View实现带数字的进度条实例代码
- Android重写View并自定义属性实例分析
- android开发教程之view组件添加边框示例
- Android动态添加View的问题解决方法
- Android viewpager中动态添加view并实现伪无限循环的方法
- Android自定义View之酷炫圆环(二)