Android中View的基础知识

时间:2023-03-09 04:40:50
Android中View的基础知识

View的界限

View就是我们看到的界面,有四个界限范围分别是, Top/Left, Bottom/Right,坐标系从左上到右下。这四个值可以通过任何View的子类调用getTop()/get...得到。

但是坑爹的是这些不能在生命周期函数里调用,否则都返回0,因为绘制还没完成呢,可以放在button的onclicklistener中。

事件的种类

分为MotionEvent和TouchSlop,分为ACTION_DOWN, ACTION_MOVE, ACTION_UP。

MotionEvent是点击之后的event可以通过getX()/getY()/getRawX()/getRawY()来得到点击的位置,区别是一个是相对当前View的,一个是相对手机屏幕左上角的。

TouchSlop是系统能识别出的最小滑动距离。可以通过

VelocityTracker用开跟踪划动过程中的速度

GestureDetector用来检测用户的单击、滑动、长按、双击行为。

Scroller用来弹性滑动对象。

划动的方式

划动的方式主要有3中,分别是通过View本身提供的scrollTo/scrollBy方法。第二种是通过动画给View施加平移效果。第三种是通过改变view的LayoutParams使得View重新布局从而实现滑动。

第一种,scrollTo/scrollBy只是改变View的内容而不是View本身的位置,View本身的位置是不变的(getScrollX是改变的,但是getTop/getLeft/getBottom/getRight不变)。

有点是操作简单,适合对View的内容进行滑动。

第二种是动画,优点是操作简单,适用于没有交互的view和实现复杂的动画效果。

第三种是改变布局参数,优点是适用于有交互的View,缺点是操作稍微复杂。

事件分发机制

点击事件的分发就是对MotionEvent事件的分发过程,由三个主要的方法共同完成:dispatchTouchEvent(), onInterceptTouchEvent(), onTouchEvent()

只要点击事件传递到了当前view,dispatchTouchEvent方法一定会被调用他们之间的关系可以用下图表示:

    @Override
public boolean dispatchTouchEvent(MotionEvent event) {
boolean consume = false;
if (onInterceptTouchEvent(event)){
consume = onTouchEvent(event);
} else {
consume = child.dispatchTouchEvent(event);
}
return consume;
}

对于ViewLayout来说,处理的顺序是:

MainActivity-dispatchTouchEvent-ACTION_DOWN
CustomLayout-dispatchTouchEvent-ACTION_DOWN
CustomLayout-onInterceptTouchEvent-ACTION_DOWN
CustomButton-dispatchTouchEvent-ACTION_DOWN
CustomButton-onTouch-ACTION_DOWN
CustomButton-onTouchEvent-ACTION_DOWN
MainActivity-dispatchTouchEvent-ACTION_UP
CustomLayout-dispatchTouchEvent-ACTION_UP
CustomLayout-onInterceptTouchEvent-ACTION_UP
CustomButton-dispatchTouchEvent-ACTION_UP
CustomButton-onTouch-ACTION_UP
CustomButton-onTouchEvent-ACTION_UP
CustomButton--onClick

对View来说,处理的顺序是:

MainActivity-dispatchTouchEvent-ACTION_DOWN
CustomButton-dispatchTouchEvent-ACTION_DOWN
CustomButton-onTouch-ACTION_DOWN
CustomButton-onTouchEvent-ACTION_DOWN
MainActivity-dispatchTouchEvent-ACTION_UP
CustomButton-dispatchTouchEvent-ACTION_UP
CustomButton-onTouch-ACTION_UP
CustomButton-onTouchEvent-ACTION_UP
CustomButton--onClick

详情请参考:http://blog.csdn.net/lanhuzi9999/article/details/26515421