View详解【一】

来源:互联网 发布:网络舆情管理系统 编辑:程序博客网 时间:2024/06/15 03:25

View详解【一】

View是界面层的一种抽象,是Android中所有控件的基类

View的位置参数:

View 的位置由四个顶点坐标来决定,即:top,left,right,bottomtop:View的左上角纵坐标left:View的左上角横坐标right:View的右下角横坐标bottom:View的右下角纵坐标

如图所示:

View位置参数图

需要注意的是View的这些坐标都是相对于父布局而定的

很容易的就能得到View的宽高:

width = right - left;htight = bottom - top;

而通过View的getTop()、getLeft()、getBottom()、getRight()方法可以得到View的坐标属性

从Android3.0开始View又加入了几个属性参数:

x,y:View左上角的坐标translationX,translationY:View左上角相对于父布局的偏移量

即:

x = left + translationX;y = top + translationY;

需要注意的是在View移动的时候left与top是不会发生改变的,改变的是translationX和translationY的值;

MotionEvent 和TouchSlop

MotionEvent:手指接触屏幕后所产生的一系列事件

ACTION_DOWN----手指刚接触屏幕ACTION_MOVE----手指在屏幕上移动ACTION_UP------手指从屏幕上松开的一瞬间getRawX()/getRawY():返回相对于屏幕左上角的x和y坐标

TouchSlop:系统所能识别的被认为是滑动的最小距离,不同的设备此值可能不同

touchSlop = ViewConfiguration.get(getContext)).getScaledTouchSlop();

VelocityTracker

VelocityTracker:用于追踪手指在滑动过程中的速度

使用前要先追踪当前事件:

VelocityTracker vt = VelocityTracker.obtain();vt.addMovement(event);

然后通过getXVelocity()或getYVelocity()方法获取x,y方向的速度:

vt.computeCurrentVelocity(1000);//表示1000ms时间间隔内滑动的速度int velocityX = (int) vt.getXVelocity();int velocityY = (int) vt.getYVelocity();

不用的时候注意回收:

vt.clear();vt.recycle();

GestureDelector:手势检测,用于检测用户的单击、滑动、长按、单击等行为

GestureDelector需要创建一个对象并实现OnGestureListener接口

GestureDelector gd = new GestureDelector(this);//解决长按屏幕后无法拖动的现象gd.setIsLongpressEnabled(false);

接着需要接管View的onTouchEvent()方法:

boolean consume = gd.onTouchEvent(event);return consume;

接下来就可以有选择的实现OnGestureListener 和 OnDoubleTapLinener中的方法了

Scroller

Scroller 用于实现View的弹性滑动,是用来对View的内容滑动

当使用View的scrollTo/scrollBy来滑动时,滑动过程是瞬间完成的

getScrollX()/getScrollY()得到该视图内容相当于视图起始坐标的偏移量

mScroller.getCurrX() //获取mScroller当前水平滚动的位置
mScroller.getCurrY() //获取mScroller当前竖直滚动的位置
mScroller.getFinalX() //获取mScroller最终停止的水平位置
mScroller.getFinalY() //获取mScroller最终停止的竖直位置

View的滑动

View的滑动有三种方式
1. view本身提供的scrollTo/scrollBy方法
2. 通过动画给View施加平移效果
3. 改变View的layoutParams使View重新布局

使用scrollTo/scrollBy

scrollBy实际上调用了scrollTo的方法,它实现了基于当前View的相对滑动,是让View相对于当前的位置滚动某段距离scrollTo实现了基于所传参数的绝对滑动,让View相对于初始的位置滚动某段距离

在滑动过程中,mScrollX的值总是等于View左边缘和View内容左边缘在水平方向上的距离,mScrollY同理

view边缘是指VIew的位置,View内容边缘是View中内容的边缘

scrollTo和scrollBy只能改变View内容的位置,而不能改变View在布局中的位置

如果从左往右滑动或者从上往下滑动时,ScorllX和ScrollY为负值,否则为正值

使用动画

主要操作View的translationX和translationY属性,如果采用属性动画的话,为了兼容3.0以下的版本,需要采用开源动画库nineoldandroids

下面两个动画都是讲View向右平移100px
//普通动画

改变布局参数:

改变layoutParams属性来导致view的移动

MarginLayoutParams params = (MarginLayoutParams)button.getLayoutParams();params.width += 100;params.leftMargin += 100;button.requestLayout();//或者button.setLayoutParams(params);

onInterceptTouchEvent是在ViewGroup里面定义的。Android中的layout布局类一般都是继承此类的。onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent。

onTouchEvent同样也是在view中定义的一个方法。处理传递到view 的手势事件。手势事件类型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL等事件。

原创粉丝点击