目录
  • 1、效果视频
  • 2、剖析Android坐标系
  • 3、实现方式
    • 3.1 layout
    • 3.2 scrollBy
    • 3.3 offsetLeftAndRight offsetTopAndButton
    • 3.4 LayoutParams
    • 3.5 Scroller
    • 3.6 平移动画

1、效果视频

2、剖析Android坐标系

滑动的本质是移动,滑动的原理就是通过不断的改变View的坐标而实现。

Android系统提供了很多方法获取坐标值,可以将其分为两种类别,具体如下:

View 提供的获取坐标的方法:

  • getTop():获取到的是View自身的顶边到其父布局顶边的距离
  • getLeft():获取到的是View自身的左边到其父布局左边的距离
  • getRight():获取到的是View自身的右边到其父布局左边的距离
  • getBottom():获取到的是View自身的底边到其父布局顶边的距离

MotionEvent 提供的方法:

  • getX():获取点击事件距离控件左边的距离,即视图坐标
  • getY():获取点击事件距离控件顶边的距离,即视图坐标
  • getRawX():获取点击事件距离整个屏幕左边的距离,即绝对坐标
  • getRawY():获取点击事件距离整个屏幕顶边的距离,即绝对坐标

3、实现方式

3.1 layout

使用绝对坐标系,每次执行移动逻辑后需要重新设置初始化坐标

 @Override    public boolean onTouchEvent(MotionEvent event) {        int rawX = (int) (event.getRawX());        int rawY = (int) (event.getRawY());                switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                lastX = rawX;                lastY = rawY;                break;            case MotionEvent.ACTION_MOVE:                int offsetX = rawX - lastX;                int offsetY = rawY - lastY;               layout( getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY );               lastX = rawX;               lastY = rawY;                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }

3.2 scrollBy

    @Override    public boolean onTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {            case MotionEvent.ACTION_DOWN:                lastX = x;                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int offsetX = x - lastX;                int offsetY = y - lastY;                ((View) getParent()).scrollBy( -offsetX, -offsetY );                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }

3.3 offsetLeftAndRight offsetTopAndButton

 @Override    public boolean onTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                lastX = x;                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int offsetX = x - lastX;                int offsetY = y - lastY;               offsetLeftAndRight( offsetX );               offsetTopAndBottom( offsetY );                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }

3.4 LayoutParams

通过getLayoutParams()获取LayoutParams时,需要根据不同的父类型使用设置不同的类型,比如父布局为LinearLayout则设置类型为 LinearLayout.LayoutParams

    @Override    public boolean onTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                lastX = x;                lastY = y;                break;            case MotionEvent.ACTION_MOVE:                int offsetX = x - lastX;                int offsetY = y - lastY;                LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)getLayoutParams();                layoutParams.leftMargin = getLeft()+offsetX;                layoutParams.topMargin = getTop()+offsetY;                setLayoutParams( layoutParams );                break;            case MotionEvent.ACTION_UP:                break;        }        return true;    }

更方便的是直接使用ViewGroup,不需要判断父布局类型

  ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();                layoutParams.leftMargin = getLeft()+offsetX;                layoutParams.topMargin = getTop()+offsetY;                setLayoutParams( layoutParams );

3.5 Scroller

初始化Scroller:

 scroller = new Scroller( context );

重写computeScroll()方法

使用computeScrollOffset()判定是否完成了整个滑动:

   @Override    public void computeScroll() {        if (scroller.computeScrollOffset()) {            ((View) getParent()).scrollTo( scroller.getCurrX(), scroller.getCurrY() );            invalidate();        }    super.computeScroll();    }  @Override    public boolean onTouchEvent(MotionEvent mv) {        View parent = (View) getParent();        switch (mv.getAction()) {            case MotionEvent.ACTION_DOWN:                lastX = (int) mv.getX();                lastY = (int) mv.getY();                break;            case MotionEvent.ACTION_MOVE:                int upX = (int) (mv.getX() - lastX);                int upY = (int) (mv.getY() - lastY);                parent.scrollBy( -upX, -upY );                break;            case MotionEvent.ACTION_UP:                scroller.startScroll( parent.getScrollX(), parent.getScrollY(), -parent.getScrollX(), -parent.getScrollY(), 1000 );                invalidate();                break;        }        return super.onTouchEvent( mv );    }

3.6 平移动画

效果视频:

private void InitAnimation(){        animation = new TranslateAnimation( 0,200,0,200 );        animation.setDuration( 1000 );    }
 moveButton.startAnimation( animation );

到此这篇关于Android 实现滑动的六种方式的文章就介绍到这了,更多相关Android 实现滑动的方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

更多相关文章

  1. 关于android中的Context
  2. Android短信拦截
  3. Android录音时,根据PCM数据获取音量值(单位分贝)
  4. Android应用开发提高系列(5)——Android动态加载(下)——加载已安装A
  5. Android下获取开机时间
  6. Android(安卓)数据存储之SP存储,内部存储,外部存储
  7. Android(安卓)获取联系人
  8. android 已知资源名称获取资源ID
  9. Android获取网速和下载速度

随机推荐

  1. MTK平台修改Bootloader源代码,让Android设
  2. android NDK开发在本地C/C++源代码中设置
  3. php数据类型转换及变量与常量的差别
  4. [置顶] Android客户端与服务端(jsp)之间jso
  5. Android(安卓)应用开发 之使用LruCache和
  6. eBook 功能模块二之设置模块
  7. Android(安卓)使用Vitamio打造自己的万能
  8. android 7.1 apk的systemuid和系统应用Se
  9. 关于Android调用单目摄像头以及双目摄像
  10. Android(安卓)Socket连接(模拟心跳包,断线