我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 实现滑动的六种方式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 实现滑动的六种方式

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 实现滑动的方式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 实现滑动的六种方式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android实现View滑动的几种方式

什么是View?实现View滑动的方式有哪些? 1. 关于View我们需要知道的(1)什么是View? Android中的View类是所有UI控件的基类(Base class),也就是说我们平时所有到的各种UI控件,比如Button
2022-06-06

Android实现View滑动的6种方式

本文实例为大家分享了Android实现View滑动的具体方法,供大家参考,具体内容如下1.View的滑动简介View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思
2023-05-31

Android实现实时滑动ViewPager的2种方式

先看看效果图:activity_main.xml 2022-06-06

Android中实现滑动的七种方式总结

在Android中想要实现实现滑动有很多方法,这篇博客将提供一些实现滑动的思路,希望可以帮助到有需要的人。一、Android坐标体系 在讲解滑动之前,我们有必要简单提一下Android的坐标体系,因为滑动的实质就是坐标的不断改变,所以我们先
2022-06-06

Android中实现可滑动的Tab的3种方式

1. 第一种,使用 TabHost + ViewPager 实现该方法会有一个Bug,当设置tabHost.setCurrentTab()为0时,ViewPager不显示(准确的说是加载),只有点击其他任意一个tab后才会加载。 有解的同学
2022-06-06

Android实现图片压缩(bitmap的六种压缩方式)

Android中图片是以bitmap形式存在的,那么bitmap所占内存,直接影响到了应用所占内存大小,首先要知道bitmap所占内存大小计算方式: 图片长度 x 图片宽度 x 一个像素点占用的字节数 以下是图片的压缩格式:其中,A代表透明
2022-06-06

Android中AlertDialog的六种创建方式

创建AlertDialog的步骤:1、创建AlertDialog.Builder对象2、调用Builder对象的setTitle方法设置标题,setIcon方法设置图标3、调用Builder相关方法如setMessage方法、setIte
2022-06-06

Android View移动的六种方法小结

在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。 layout()如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重
2022-06-06

Android如何实现滑动方法

小编给大家分享一下Android如何实现滑动方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Android 实现滑动方法总结 本文对A
2023-05-31

Android滑动动态分页实现方法

本文实例讲述了Android滑动动态分页实现方法。分享给大家供大家参考,具体如下: 实现 Android.widget.AbsListView.OnScrollListener 主要代码:private int lastItemIndex;
2022-06-06

Android实现滑动加载数据的方法

本文实例讲述了Android实现滑动加载数据的方法。分享给大家供大家参考。具体实现方法如下: EndLessActivity.java如下:package com.ScrollListView; import Android.app.Lis
2022-06-06

android多种滑动冲突的解决方案

一、前言 Android 中解决滑动的方案有2种:外部拦截法 和内部拦截法。 滑动冲突也存在2种场景: 横竖滑动冲突、同向滑动冲突。 所以我就写了4个例子来学习如何解决滑动冲突的,这四个例子分别为: 外部拦截法解决横竖冲突、外部拦截法解决同
2022-06-06

Qt界面中滑动条的实现方式

这篇文章主要介绍了Qt界面中滑动条的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录