View的事件体系基础知识
来源:互联网 发布:sql中update set用法 编辑:程序博客网 时间:2024/06/05 04:28
1.View的位置参数
View的四个位置主要有思安个顶点决定,分别对应四个属性,top、left、right、bottom.
top:表示View的原始左上角的纵坐标,
left:表示View的原始左上角的横坐标,
bottom:表示View的原始右下角的纵坐标,
right:表示View的原始右下角的横坐标,
这些坐标都是相对于View的父容器来说的,都是相对坐标
从Android3.0开始增加了几个参数:
x:表示View左上角的横坐标
y:表示View左上角的纵坐标
translationX:表示View左上角相对于父容器的横坐标的偏移量,默认值是0
translationY:表示View左上角相对于父容器的纵坐标的偏移量,默认值是0
换算关系是:
x=left+translationX;
y=top+translationY;
在View平移过程中(比如属性动画的时候,会有效果,其他情况不是平移,translationX,translationY会一直为0),left和top不会变化,变化的是x、y、translationX、translationY.
2.MotionEvent的位置坐标信息
MotionEvent提供的方法:
getX():点击位置到View的左边的距离
getY():点击位置到View的上边的距离
getRawX():点击位置到手机屏幕左边的距离
getRawY();点击位置到手机屏幕上边的距离
3.TouchSlop是系统所能识别出的最小的滑动距离
ViewConfiguration.get(getContext()).getScaledTouchSlop()可获取,在处理滑动时,可以利用它来过滤
4.速度追踪
VelocityTracker,用于追踪手机在滑动过程中的速度,包括水平和竖直方向的速度
使用过程如下:
首先初始化VelocityTracker对象 VelocityTracker mVelocityTracker = VelocityTracker.obtain();
在View的onTouchEvent方法中追踪当前点击事件的速度 @Override
public boolean onTouchEvent(MotionEvent event) {
mVelocityTracker.addMovement(event);
}
通过如下方式来获取速度
mVelocityTracker.computeCurrentVelocity(1000);//计算速度 float xVelocity = mVelocityTracker.getXVelocity();//获取x方向的速度 float yVelocity = mVelocityTracker.getYVelocity();//获取y方向的速度
computeCurrentVelocity这个方法的参数表示的是一个时间单元或者时间间隔,单位毫秒,在这时间间隔内手指在水平或竖直方向所划过的像素数。
不使用了的时候,重置并回收
mVelocityTracker.clear();//重置 mVelocityTracker.recycle();//回收
5.手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为。
1.创建一个GestureDetector对象并实现OnGestureListener接口,还可以实现OnDoubleTapListener监听双击的行为~~~
mGestureDetector = new GestureDetector(new MyOnGestureListener());//MyOnGestureListener是OnGestureListener接口实现类//下面这一步是对双击的监听mGestureDetector.setOnDoubleTapListener(new MyOnDoubleTapListener());//MyOnDoubleTapListener是OnDoubleTapListener接口实现类
2.接管View的onTouchEvent方法,onTouchEvent或者OnTouchListener中添加如下:
imgView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { boolean consume = mGestureDetector.onTouchEvent(event);//这里添加了 return consume; } }); //或者 public boolean onTouchEvent(MotionEvent event) { boolean consume = mGestureDetector.onTouchEvent(event);//这里添加了 return consume;}
做完上面两步,我们就可以实现对手势检测了。
查看Android源码发现SimpleOnGestureListener,实现了onGestureListener和OnDoubleTapListener
public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener, OnContextClickListener {
其实实现这个两个接口要实现好多方法,以后我们使用SimpleOnGestureListener可以有选择的实现某些常用的方法,减少代码量。
6.View的滑动
6.1 View的scrollTo和scrollBy是瞬间完成滑动。
这里滑动的是View的内容,View的本身并没有移动。
两个方法的源码。
public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); } public void scrollTo(int x, int y) { if (mScrollX != x || mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; invalidateParentCaches(); onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { postInvalidateOnAnimation(); } } }
scrollBy是相对于上次的滑动。scrollTo是滑动到某个位置。
6.2使用动画比如属性动画 Android属性动画
6.3改变布局参数,
MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();lp.leftMargin = lp.leftMargin + moveX - mStartX;lp.topMargin = lp.topMargin + moveY - mStartY;// setLayoutParams(lp); requestLayout();
7,弹性滑动
7.1使用Scroller
// 开启平滑移动mScroller.startScroll(viewParent.getScrollX(), viewParent.getScrollY(), -viewParent.getScrollX(), -viewParent.getScrollY()); postInvalidate();//刷新会调用onDraw--->调用computeScroll @Override public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset()) { ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate();//刷新会调用onDraw--->调用computeScroll } }
- View的事件体系基础知识
- View的事件体系-基础知识
- View的事件体系---View 基础知识
- View的事件体系(1)-View基础知识
- View的事件体系之一基础知识
- View的事件体系(上)(View基础知识,滑动,弹性滑动)
- View的事件体系---V3.1 View基础知识
- Android-View事件体系之View的基础知识
- 《View的事件体系》(一)View基础知识
- View的事件体系
- View 的事件体系
- View的事件体系
- View的事件体系
- View的事件体系
- View的事件体系
- View的事件体系
- View的事件体系
- View的事件体系
- 使用NSURLSession,NSURLSessionUploadTask上传文件
- Python BDD 学习资源
- 纯虚函数的使用汇总
- 如何移除Joomla自带的js和link文件
- TCP 可靠性
- View的事件体系基础知识
- Oracle PRM-DUL使用经验
- 绘图工具
- vc获取程序本身的版本号
- iOS中根据网络环境显示不同图片
- OSG学习笔记0——解决OSG读obj模型问题
- Android 使用SimpleCursorAdapter为listview的item添加按钮
- 线性表之链式存储结构
- 魔方阵