美文网首页
初识:View【一】

初识:View【一】

作者: Antonylr | 来源:发表于2019-12-26 15:15 被阅读0次

有了界面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视图的 树形结构

1577344088.jpg

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

1577344168.jpg

五. View的位置获取方式

int getTop(), getLeft(), getBottom(), getReight()
拓展: 区分与MotionEvent中 get() 和 getRaw()【MotionEvent的如下图】


1577344236.jpg

简单了解跟View有联系的几个对象 MotionEvent, TouchSlop,VelocityTracker, GestureDetector , Scroller

  1. MotionEvent 【手指点击View , 接触屏幕后就产生了一系列点击事件】
    ACTION_DOWN : 手指接触屏幕
    ACTION_MOVE : 手指在屏幕上移动
    ACTION_UP : 手指从屏幕上松开的瞬间
    eg: 手指点击屏幕再松开》》 down-->up
    点击屏幕滑动一会在松开》》 down->move.......->up
  2. TouchSlop 【系统识别出滑动的最小距离, 它是个常量】
    解释:当你的手指在屏幕上滑动时,如果两次滑动的之间的距离(ab)小于这个常量T,系统就会认为,你没滑动。
    获取:ViewConfiguration.get(getContext()).getScaledTouchSlop()
    作用:当我们在处理滑动时,可以利用这个常量来做一些过滤。
  3. 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;
}
  1. 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();
        }
    }
}

相关文章

网友评论

      本文标题:初识:View【一】

      本文链接:https://www.haomeiwen.com/subject/jezkoctx.html