11月更文挑战|Android基础-View基础介绍

436 阅读3分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

基础视图组件介绍

View是Android视图控件基类,日常开发中常用视图组件都继承自View,例如TextViewButtonListView等。因此View是作为Android开发当中最原始最基础的视图组件类存在,在其基础之上构建各种各样其他视图组件。其中还有一个视图基础组件类ViewGrop,它同样也继承自View。有所不同的点在于ViewGroup可以是多个子View组成(这里的子View也可以是ViewGrop)由此可形成一个View树的概念。这样就知道了Android视图组件中Button肯定是View属性视图组件,LinearLayoutRelativeLayout则是ViewGroup属性视图组件。

classDiagram
View  <|-- ViewGroup
View  <|-- TextView
View  <|-- Button
View  <|-- ImageView

TextView  <|-- EditText

ViewGroup <|-- LinearLayout
ViewGroup <|-- RelativeLayout
ViewGroup <|-- FrameLayout


视图坐标

View位置参数有四个属性值:lefttoprightbottom,分别表示左上角横坐标,左上角纵坐标,右下角横坐标,右下角纵坐标,因为在Android的视图坐标系的原点位置在左上角,也就是说x轴和y轴的正向方向是向右和向下的。另外View的坐标系是相对的,它作用于它的父类视图,但若当前View是作用于根视图那么可以说它的坐标系是相对来说是绝对了。

触摸属性

手势事件

手机都是点触屏,View视图组件肯定也就离不开触摸事件。当用户点击手机屏幕时在View视图上就会触发一系列的触摸事件:

  1. ACTION_DOWN 从视图按下
  2. ACTION_MOVE 在视图上移动
  3. ACTION_UP 从视图上抬起 一般情况下触发手势事件主要就是以上三种情况,这三种情况也是必然会发生的,ACTION_DOWNACTION_UP一般情况是一一对应关系(除非意外情况发生ACTION_UP不执行,可能会执行ACTION_CANCEL)

最小滑动距离判定

那么系统是如何区分本次操作是滑动还是点击呢?在Android系统中有一个叫TouchSlop,它表示滑动的最小距离,通过它来衡量当前在屏幕上滑动距离是否是小于滑动闸值。若小于滑动闸值系统就判定当前操作不是滑动操作。当然TouchSlop也可以提供给开发者使用在做一些手势操作判定中使用,通过ViewConfiguration.get(contenxt).getScaledTouchSlop()就能获取闸值。

速度追踪

Android还提供了可以追踪滑动过程中速度方法类VelocityTracker,通过它就能计算出手指在水平和竖着方向上滑动速度了。

基本方法调用方式如下:

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);// event事件可以从onTouchEvent中获取
velocityTracker.computeCurrentVelocity(100); // 100ms内的速度值 滑动速度像素/100ms
float x = velocityTracker.getXVelocity();
float y = velocityTracker.getYVelocity();
// 使用结束后记得回收释放资源
velocityTracker.clear();
velocityTracker.recycle(); //

手势检测

另外Android还提供了能够辅助开发者检测View视图单击、滑动、长按、双击等动作的方法类GestureDetector,在实际开发中可能不常用(旧版API中GestureDetector是支持双击事件但在高版本中好像移除了)。通常开发者检测View动作事件时是添加手势方法,常用的手势操作方法有setOnClickListenersetOnLongClickListener等,当然双击功能对于开发者也能自行设计实现。

View view = new View(this);
view.setOnClickListener(this); //点击
view.setOnLongClickListener(this);//长按

// GestureDetector的实现,拦截View的onTouch事件
GestureDetector gestureDetector = new GestureDetector(this,new GestureDetector.OnGestureListener() {
    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return false;
    }
});
view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
});