有了界面Activity,那就要在它上面显示各种View(视图)了。接下来我们将简单的了解View(视图)
视图分类:
(1) 单一视图 (View):一个View eg: TextView, Button , CheckBox ....
(2) 视图组(ViewGroup): 多个View组成的ViewGroup eg: LinearLayout中包裹TextView , EditText
简单了解一下View
一. View类是Android中各种组件的基类 eg:
public abstract class ViewGroup extends View implements ViewParent, ViewManager{........}
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {........}
public class LinearLayou 和 FrameLayout 和 RelatvieLayout 等 extends ViewGroup {........}
二. View的4个构造函数, 自定义View必须重写至少一个构造函数
public View(Context context) {//如果View是在java代码里面new的,调用这个构造函数}
public View(Context context, @Nullable AttributeSet attrs){//如果View在.xml里声明的,调用这个函数, 自定义属性是从AttributeSet参数传进来的}
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {this(context, attrs, defStyleAttr, 0);//不会自动调用,一般是在第二个构造函数里主动调用,如View有style属性}
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {//API21之后才使用,不会自动调用,一般是在第二个构造函数里主动调用,如View有style属性}
三. 多个View视图的 树形结构

四. View位置(坐标)描述【View的位置是相对于父控件而言的】

五. View的位置获取方式
int getTop(), getLeft(), getBottom(), getReight()
拓展: 区分与MotionEvent中 get() 和 getRaw()【MotionEvent的如下图】

简单了解跟View有联系的几个对象 MotionEvent, TouchSlop,VelocityTracker, GestureDetector , Scroller
- MotionEvent 【手指点击View , 接触屏幕后就产生了一系列点击事件】
ACTION_DOWN : 手指接触屏幕
ACTION_MOVE : 手指在屏幕上移动
ACTION_UP : 手指从屏幕上松开的瞬间
eg: 手指点击屏幕再松开》》 down-->up
点击屏幕滑动一会在松开》》 down->move.......->up - TouchSlop 【系统识别出滑动的最小距离, 它是个常量】
解释:当你的手指在屏幕上滑动时,如果两次滑动的之间的距离(ab)小于这个常量T,系统就会认为,你没滑动。
获取:ViewConfiguration.get(getContext()).getScaledTouchSlop()
作用:当我们在处理滑动时,可以利用这个常量来做一些过滤。 - VelocityTracker 【速度追踪 】
解释:追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。这里的速度指的是一段时间内手指画过的像素数,它的值正负都可以。
获取:VelocityTracker velocity = VelocityTracker.obtain()
velocity.addMovement(event)
velocity.computerCurrentVelocity(1000);//设置时间间隔
int xv = (int)velocity.getXVelocity();
int yv = (int)velocity.getYVelocity();
最后不使用它的时候要 velocity.clear() / velocity.recycle()
四. GestureDetector 【手势检测】
解释:辅助检测用户的 单击,滑动,长按,双击等行为。
获取:
GestureDetector gesture = new GestureDetector(SecondeActivity.this, new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
//手指轻轻触摸屏幕的一瞬间,由一个ACTION_DOWN触发
return false;
}
@Override
public void onShowPress(MotionEvent e) {
//手指轻轻触摸屏幕,尚未松开或拖动,由一个ACTION_DOWN触发
//注意和onDown区别,他强调的是没有松开或拖动状态
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
//手指(轻轻触摸屏幕后)松开,伴随着1个MotionEvent ACTION_UP而触发--》单击
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//手指按下屏幕并拖动,由1个ACTION_DOWN, 多个ACTION_MOVE触发---》拖动行为
return false;
}
@Override
public void onLongPress(MotionEvent e) {
//用户长时间的按着屏幕不放----》长按
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//快速滑动
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seconde);
gesture.setIsLongpressEnabled(false);//解决长安屏幕后无法拖动现象
gesture.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
//严格的单击行为
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
//由2次连续的点击组成, 它不可能和onSingleTapConfirmed共存---》双击
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
//表示发生了双击行为, 在双击的期间 ACTION_DOWN ACTION_MOVE ACTION_UP都会触发回调
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean consume = gesture.onTouchEvent(event);
return consume;
}
- Scroller 【弹性滑动】
解释:有过度效果的滑动,其过程不是瞬间完成的,而是在一定的时间间隔内完成, 它需要和View的computeScroll() 方法配合使用才能共同完成这个效果。
获取:
public class MyView extends View {
private Context mContext;
Scroller scroller;
public MyView(Context context) {
super(context);
this.mContext = context;
scroller = new Scroller(context);
}
private void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int delta = destX - scrollX;
//1000ms内滑向destX, 效果就是慢慢滑动
scroller.startScroll(scrollX, 0, delta, 0, 10000);
invalidate();
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
}
}
}
网友评论