View总结-基础知识总结

View的位置参数

View的位置主要是由他的四个顶点来决定的,分别对应View的四个属性:top,left,right,bottom:这些坐标是对于当前View的父View来说的;

mLeft = getLeft();
mRight = getRight();
mTop = getTop();
mBottom = getBottom();

3.0之后新增加的位置参数X,Y是View的左上角的坐标,translastionX,translationY是View的左上角坐标相对于父容器的偏移量,这四个参数也是相对于父容器的坐标的;
这几个参数的计算关系就是:X = left+translationX;也就是说translationX的初始值的0的说;

在View平移的过程中top和left表示的是原始的左上角的位置信息,值并不会发生变化,此时发生变化的X,Y以及translationX和translationY这四个参数的值;

MotionEvent

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

  • ACTION_DOWN——手指刚接触屏幕
  • ACTION_MOVE——手指在屏幕上移动
  • ACTION_UP——手指从屏幕上松开的一瞬间

    正常情况下一次手指触摸屏幕的行为会触发一系列的点击事件:
    ①DOWN->UP
    ②DOWN->MOVE->…>MOVE->UP
    等等
    那么在事件发生的过程中我们可以通过MotionEvent对象来获取得到点击事件发生的x和y坐标;
    为此系统提供了两套方法供我们使用

  • getX/getY ——获取的就是View的左上角的坐标相对于父容器

  • getRawX/getRawY——获取就是相对于手机屏幕的左上角的x和y坐标

TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离;
这是一个常量;
获取的方法也很简单:ViewConfiguration.get(getContext()).getScaledTouchSlop();
这个常量就是用在我们判断滑动的时候的过滤值;

VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和数值方向的速度;
使用方法

VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);//event就是一个MotionEvent

//当我们想要知道当前的滑动速度的时候
//获取速度之前必须先计算速度,速度值是一段时间内就是你设置的那个时间所滑过的像素数;速度的值是有正负值的  和XY轴的方向一致
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();

最后在我们不需要使用速度追踪的时候需要释放

velocityTracker.clear();
velocityTracker.recycler();

GestureDetector

手势的检测,用于辅助检测用户的单击、滑动、长按、双击等行为。

//创建一个GestureDetector对象并实践OnGestureListener接口
//或者我们可以实现OnDoubleTabListener监听双击行为
  GestureDetector mGestureDetector = new GestureDetector(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) {
            //手指(轻轻触摸屏幕后)松开,伴随着一个ACTION_UP而触发,这是单击行为
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            //手指按下屏幕并拖动,由一个ACTION_DOWN和多个ACTION_MOVE触发,这是拖动行为
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            //用户长久按着屏幕不放就是长按
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            //用户按下触摸屏,快速滑动后松开,由一个ACTION_DOWN,多个ACTION_MOVE和一个ACTION_UP触发,这是快速滑动的行为
            return false;
        }
    });
        mGestureDetector.setIsLongpressEnabled(false);//解决长按屏幕无法拖动的现象

//最后让GestureDetector接管View的onTouchEvent方法
boolean consume = mGestureDetector.onTouchEnent(event);
return consume;


//最后的补充就是在开发中我们也不是一定要使用GestureDetector来代替onTouchEvent中的事件的监听的我们完全可以在onTouchEvent中通过事件的类型以及速度以及坐标来进行自己需要的处理

//如果需要双击这种行为的话那么GestureDetector实现OnDoubleTabListener就再方便不过了

Scroller

弹性滑动对象,用于实现View的弹性滑动。

使用View的scrollTo/scrollBy方法的滑动是瞬间完成的,这种用户体验是不好的,那么我们就可以使用Scroller来实现弹性滑动的效果

Scroller mScroller = new Scroller(getContext());

/**
     * 缓慢滚动到指定的位置
     * @param destX X坐标要滑动的距离
     * @param destY Y坐标要互动的距离
     */
    private void smoothScrollTo(int destX,int destY){
        int scrollX = getScrollX();//简单理解就是getScrollX获取的值是View的左边距-View的内容的左边距的值 所以是负值是右移
        int scrollY  = getScrollY();
        //1000ms内滑滑动destX和destY坐标的距离,效果就是慢慢滑动
        mScroller.startScroll(scrollX,scrollY,destX,destY,1000);
        invalidate();//刷新View 很关键 会调用Draw方法
        //Draw方法有会调用computeScroll方法
    }

    @Override
    public void computeScroll() {
        if(mScroller.computeScrollOffset()){//判断滑动是否结束了
            scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
            postInvalidate();//重新绘制 重复调用Draw方法
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值