美文网首页
第三章 view的事件体系

第三章 view的事件体系

作者: mjylfz | 来源:发表于2017-08-13 16:05 被阅读8次
    1.View的结构
    Paste_Image.png
    2.View的位置参数
    Paste_Image.png

    left,top,right,bottom是相对父view的位置参数,获得参数的方法是getLeft()
    getX()和getY()返回的是相对于当前view左上角的位置,getRawX和getRawY是相对于屏幕的。

    Paste_Image.png
    MotionEvent

    对于View,可以使用setOnTouchListener()方法来监听touch events而不需要继承现有的View

           View myView = findViewById(R.id.my_view); 
           myView.setOnTouchListener(new OnTouchListener() { 
              public boolean onTouch(View v, MotionEvent event) { 
              return true; 
          } 
    
    TouchSlop

    最小的滑动距离,获得方法

    ViewConfiguration.get(getContext()).getScaledTouchSlop();
    
    VelocityTracker

    计算滑动速度

     //在View的onTouchEvent方法中 
     VelocityTracker velocityTracker = VelocityTracker.obtain(); 
     velocityTracker.addMoveMent(event); 
     //时间间隔设为100ms 
     tracker.computeCurrentVelocity(100); 
     int Vx = (int)velocityTracker.getXVelocity(); 
     int Vy = (int)VelocityTracker.getYVelocity(); 
     //不再使用的时候,需要清除并回收 
     velocityTracker.clear(); 
     velocityTracker.recycle(); 
    
    GestureDetector

    手势检测,包含单机,双击,长按滑动等

    使用方法:
    1. 实例化 GestureDetectorCompat 类
    2. 如需监测所有的手势,则实现 GestureDetector.OnGestureListener 接口和 GestureDetector.OnDoubleTapListener 接口。
    3. 若只需监测部分手势,则继承 GestureDetector.SimpleOnGestureListener 类。
    GestureDetectorCompat detector = new GestureDetectorCompat(getContext(),new listener());
    
    /**实现**/
    class listener extends GestureDetector.SimpleOnGestureListener{
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return super.onSingleTapUp(e);
            }
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        }
    
    Scroller

    实现view的弹性滑动,使用方法

    Scroller scroller = new Scroller(getContext());
    
        /**
         * 滑动到指定地方
         * @param destX
         * @param destY
         */
        private void smoothScrollTo(int destX,int destY){
            int scrollX  = getScrollX();
            int dx = destX - scrollX;
            //startX,startY,dx,dy,duration
            scroller.startScroll(scrollX,0,dx,0,100);
            invalidate();
        }
    
        @Override
        public void computeScroll() {
            if(scroller.computeScrollOffset()){
                //smoothScrollTo
                scrollTo(scroller.getCurrX(),scroller.getCurrY());
                postInvalidate();
            }
        }
    

    学习资料:

    1. Android Scroller完全解析,关于Scroller你所需知道的一切
    2. Animating a Scroll Gesture
    View的滑动
    1. 通过view的scrollTo和scrollBy方法来实现滑动
    2. 通过动画实现滑动
    3. 通过改变view的LayoutParams实现滑动

    SrollTo/ScrollBy

    ScrollTo(x,y)是相对于初始位置,ScrollBy(x,y)是相对于当前位置。
    getScrollX和getScrollY获得的值,x左滑动为正,y上滑动为正。

    动画

    使用View动画或者属性动画,View动画只能移动影响不能移动view,所以最好使用属性动画。

    //view动画
    <?xml version=  "1.0"   encoding=  "utf-8"  ?>
        <set xmlns:android=  "http://schemas.android.com/apk/res/android"
            android:fillAfter=  "true"
            >
            <translate 
                android:fromXDelta=  "0"
                android:fromYDelta=  "0"
                android:toXDelta=  "500"
                android:toYDelta=  "1000"
                android:duration=  "10000"
                android:interpolator=  "@android:anim/linear_interpolator"
                />
        </set>
    
     Animation animation = AnimationUtils.loadAnimation(this ,R.anim.translate); 
     layout.setAnimation(animation); 
    animation.start(); 
     //使用属性动画实现移动 
     ObjectAnimator.ofFloat(layout,"translationX", 0,100).setDuration(1000).start(); 
    

    最后一种

     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) layout.getLayoutParams(); 
    params.width+= 1000 ; 
    params.leftMargin+=1000; 
    layout.requestLayout(); 
    

    优缺点:

    Paste_Image.png

    相关文章

      网友评论

          本文标题:第三章 view的事件体系

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