Android View 的滑动

Android View 实现View滑动的六种方法 一 View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。 实现View滑动有很多种方法,这篇文章主要讲解六种滑动的方法,分别是:layout()、offsetLeftAndRight()与offsetTopAndBottom()、LayoutParams、动画、sc 阅读详情

一、View 的简介

View是所有可视化控件的基类,我们平时接触的所有的控件,比如说TextView,Button 等等都继承于View。View是Android 在视觉上的呈现,是界面层控件的一种抽象,可以是单个控件也可以是一组控件。

二、坐标系

1、Android 坐标系

在Android中,屏幕的左上角定点被视为Android坐标系的原点,原点向右是X轴正方向,原点向下是Y轴正方向。在触控事件中使用 getRawX()、getRawY() 来获取Android 坐标系的坐标,也可以称之为绝对坐标。
Android 坐标系

2、视图(View)坐标系

视图坐标系是用来描述当前View 和父视图的位置关系的。这里是以父视图的左上角定点为视图坐标系的原点,原点向右是X轴正方向,原点向下是Y轴正方向。在触控事件中使用getX()、getY() 来获取视图坐标系的坐标,也可以称之为相对坐标.
视图(View)坐标系

三、View滑动的实现

View 的滑动实现逻辑:当触摸事件传到View 时,记录下触摸点的坐标,手指在移动的时候记下移动后的触摸坐标并算出偏移量,然后通过偏移量来修改View 的坐标。

MotionEvent

我们要实现View的滑动要在 onTouchEvent(MotionEvent event)中进行触摸事件的监听,MotionEvent 是触控事件的封装,简短的介绍下MotionEvent中封装的事件常量:

public static final int ACTION_DOWN = 0; //单点触摸按下动作
public static final int ACTION_UP = 1; //单点触摸离开动作
public static final int ACTION_MOVE = 2; //单点触摸移动动作
public static final int ACTION_CANCEL = 3; //触摸动作取消
public staiic final int ACTION_OUTSIDE = 4; //触摸动作超出边界
public static final int ACTION_POINTER_DOWN = 5; //多点触摸按下动作
public static final int ACTION_POINTER_UP = 6; 多点离开动作

1、layout()方法

view进行绘制的时候会调用onLayout()方法来设置显示的位置,因此我们同样也可以通过修改View的left、top、right、bottom这四种属性来控制View的坐标:

@Override
    public boolean onTouchEvent(MotionEvent event) {
        // 获取触摸点的x,y
        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 moveX = x - lastX;
                int moveY = y - lastY;
                //  更改位置
                layout(getLeft() + moveX, getTop() + moveY,
                        getRight() + moveX, getBottom() + moveY);
                break;
        }
        return true;
    }

2、offsetLeftAndRight()和offsetTopAndBottom

传入偏移量后,这两个方法就是对View左右、上下移动的操作。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        // 获取触摸点的x,y
        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 moveX = x - lastX;
                int moveY = y - lastY;
                //  更改位置
                offsetLeftAndRight(moveX);
                offsetTopAndBottom(moveY);
                break;
        }
        return true;
    }

3、LayoutParams

LayoutParams保存了View的布局参数,所以我们可以改变LayoutParams来动态的改变布局的位置来达到滑动的效果。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        // 获取触摸点的x,y
        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 moveX = x - lastX;
                int moveY = y - lastY;
                //  更改位置
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();
                params.leftMargin = getLeft() + moveX;
                params.topMargin = getTop() + moveY;
                setLayoutParams(params);
                break;
        }
        return true;
    }

其实LayoutParams 完全可以配合 xml 中的layout_width、layout_marginLeft 等等这些前面带layout_ 的属性去理解,设置LayoutParams 各个参数的过程就是动态设置xml中带layout_ 各个属性的过程。关于LayoutParams 的详细分析,可以参照这位大神写的博客 自定义控件知识储备-LayoutParams的那些事,写的很透彻,完全被圈粉。

4、ScrollTo 和 scrollBy

scollTo(x,y)表示移动到一个具体的坐标点,而scollBy(dx,dy)则表示移动的增量为dx、dy。查看scollBy()源码最终也是要调用scollTo的,举个例子说明下scollBy()是怎样移动的:
这里写图片描述
这里写图片描述

我们都知道画布的大小是无限大的,而坐标系是基于屏幕的左上角为原点的,所以屏幕中的控件的Android 坐标是(40,50),当我们执行scrollBy(30,30) 的时候,按照字面意思,这个控件的位置应该会出现在当前红色屏幕的右下方,可是事实上却出现在了屏幕的左上方。这是因为当执行scrollBy()方法的时候,我们的屏幕会沿着X轴正方向平移30,向Y轴正方向平移30,也就是屏幕向右下方平移了,此时红色的位置就是当前屏幕的位置。当执行完ScrollBy 以后,坐标系就会继续基于屏幕的左上角为原点,所以此时的屏幕中的控件的Android坐标为(10,20)。所以当我们调用scrollBy 方法的时候,要设置值为负数才能得到自己想要的移动效果。
scollTo、scollBy移动的是View的内容,如果在ViewGroup中使用则是移动他所有的子View,这点要特别注意。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        // 获取触摸点的x,y
        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 moveX = x - lastX;
                int moveY = y - lastY;
                //  更改位置
                ((View) getParent()).scrollBy(-moveX, -moveY);
                break;
        }
        return true;
    }

5、Scroller

我们用scollTo/scollBy方法来进行滑动时,这个过程是瞬间完成的,所以用户体验不大好。这里我们可以使用Scroller来实现有过度效果的滑动,这个过程不是瞬间完成的,而是在一定的时间间隔完成的。Scroller本身是不能实现View的滑动的,它需要配合View的computeScroll()方法才能弹性滑动的效果。Scroller的基本用法其实还是比较简单的,主要可以分为以下几个步骤:
1. 创建Scroller的实例
2. 调用startScroll()方法来初始化滚动数据并刷新界面
3. 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑

public class ScrollerView extends View {
    private Scroller mScroller;

    public ScrollerView(Context context) {
        super(context);
    }

    public ScrollerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 初始化Scroller
        mScroller = new Scroller(context);
    }

    public ScrollerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 系统会在绘制View的时候在draw()方法中调用该方法,这个方法中我们调用父类的scrollTo()方法并通过Scroller
     * 来不断获取当前的滚动值,每滑动一小段距离我们就调用invalidate()方法不断的进行重绘,重绘就会调用
     * computeScroll()方法,这样我们就通过不断的移动一个小的距离并连贯起来就实现了平滑移动的效果
     */
    @Override
    public void computeScroll() {
        super.computeScroll();
        if (mScroller.computeScrollOffset()) {
            ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            //通过不断的重绘不断的调用computeScroll方法
            invalidate();
        }
    }

    /**
     * 提供2秒内平滑的滑动方法
     * @param destX
     * @param destY
     */
    public void smoothScrollTo(int destX, int destY) {
        int scrollX = getScrollX();
        int scrollY = getScrollY();
        int deltaX = destX - scrollX;
        int deltaY = destY - scrollY;
        // 在2秒内滑到destX destY
        mScroller.startScroll(scrollX, scrollY, deltaX, deltaY, 2000);
        invalidate();
    }
}

结尾:以上就是关于View 滑动的相关内容了,当然还有属性动画也能控制View 的滑动,我准备放到动画篇讲解。下面附上源码:https://github.com/smile-sxl/CustomView

Android——View的事件体系(一)View的滑动 主要介绍内容: View的基础知识 View的位置参数 MotionEvent 和 TouchSlope VelocityTracker、GestureDetector 和 Scroller View的滑动 使用scrollTo/scrollBy 使用动画 改变布局参数 各种滑动方式的对比 弹性滑动 使用Scroller 通过动画 使用延时策略 View的事件分发机制 点击事件的传递规则 事 阅读详情

相关推荐

Android View体系(二)实现View滑动的六种方法

View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。

Android进阶三部曲 - 刘望舒 2万+

[Android] 滑动 View 的原理及处理

转自:http://blog.qiji.tech/archives/6758 [Android] 滑动 View 的原理及处理,滑动效果的产生 滑动一个 View ,其实就是移动一个 View,本质上是对 View 的坐标位置进行不停的改变。那么要实现这个效果,就必须要监听用户的触摸事件,根据传入的事件类型和坐标,动态且不断的改变 View 的坐标。 以下Demo 在 githu

你好邱林和的专栏 2609

Android 自定义View:实现View的滑动效果

讲解了View的触摸事件,已经实现View滑动的7种方式

MR_D_j的专栏 8285

Scroller实现View的平滑滑动

在之前介绍的关于View滑动的内容时,关于使用使用Scroller进行View的平滑滑动没有介绍,今天在这里补充一下。关于为什么使用Scroller滑动,这里就不多介绍,主要是因为使用scrollTo()或者scrollBy()都是瞬间完成,用户体验不是太好,当然滑动最终的实现都是通过scrollTo()实现,所以,你也可以通过不断移动一小段距离再加上一个Timer进行控制,也可以...

hfut_why的博客 2409

Android View的滑动效果

View的滑动效果可分为两类: 1.View本身的位置不变,View内部的内容滑动; 2. View的位置发生变化,View作为一个整体滑动; ##.View内部内容的滑动 1.通过以下View的以下两个API方法可实现滑动: scrollTo(int x, int y);//滑动到坐标值x、y的位置,初始时x=0,y=0。 //从右向左滑动x增大,从下向上滑动y增大。反之减小。 s...

u013914309的博客 1168

Android自定义view-打造酷炫的字体滑动高亮控件

前言: 相信很多时候开发会遇到类似于音乐歌词同步,播放到哪句歌词的哪个词时会逐渐高亮,这样的描述还是不够准确,iPhone的滑动解锁的那种效果,相信很多人都会熟悉吧。今天,我们的首要任务就是开发一个类似于这种效果的安卓控件,以便在以后的项目中直接使用,看起来高大上有木有。其实也不用害怕,需要我们分析和撰写的内容并不多,废话不多说,开始我们今天的教程吧。 正文: 在开始讲解之前,需要准

SmartIceberg的博客 2403

View 平滑移动

实现View滑动有多种方式,比如使用动画,动态改变margin值等,本文暂时只讨论使用scrollTo/scrollBy方式,结合Scroller类,实现view的平滑移动。View内部实现了定义了scrollTo,scrollBy方法 /** * Set the scrolled position of your view. This will cause a call to

xiaomingdbaba的专栏 2428

养龙虾经验:OpenClaw用户必看的3个“省token”救命配置

本文分享了3个优化OpenClaw使用成本的配置方案:1)启用上下文压缩功能,可选择全局或单个代理设置,支持safeguard/adaptive两种压缩模式;2)修改SOUL.md提示词,要求模型回答简洁直接;3)限制对话历史长度。方案一效果最佳,可减少长对话的token消耗,但可能影响连贯性。三种方案可单独或组合使用,需根据实际场景调整参数。文章最后邀请读者分享使用痛点,将针对高频问题撰写解决方案。

wpplvhq的专栏 1416

android view 上下左右滑动 事件

import android.app.Activity; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.V

yhqbsand 1万+

Boost变换电路在新能源车充电系统中的创新应用与挑战

本文探讨了Boost变换电路在新能源车充电系统中的创新应用与挑战,重点分析了其在高压快充、能量回收等场景中的技术突破。通过电力电子仿真和新型器件应用,如SiC MOSFET,显著提升了功率密度和转换效率。同时,文章还深入讨论了电磁兼容性(EMC)挑战及智能控制算法的实际应用,为新能源车充电系统的优化提供了实用解决方案。

7z8x2c4v6b9的博客 217

继电保护整定值计算软件_「全套69份」整定值计算与设计方案

【全套69份】整定值计算与设计方案,输电线路、变压器、发电机、电容器、母线保护等下载方式见文末内容预览:10kV高压电机保护原理及整定计算35kV环网运行线路继电保护整定计算方案分析35KV以下继电保护及三段式电流保护整定计算110 kv电网计算机整定计算新方案220kV两相式电铁牵引站供电线路的短路故障计算及其保护整定原则分析220kV周潮线接地距离保护整定计算特殊方案750 kV变压器保护配置...

weixin_30825953的博客 5013

【Android开发】 View的滑动

View的滑动 View 的滑动式 Android 实现自定义控件的基础。可以通过以下几种方式实现 View 的滑动。 layout() View 在进行绘制的时候会调用 onLayout() 方法来设置显示的位置。通过修改 View 的 left、 top、 right、 bottom 这4个属性来控制 View 的坐标。 @Override public boolean performClick() { return super.performClick(); }

HelloWorled的博客 242

基于ANSYS的电磁兼容仿真教程

最近,在做某系统的EMC仿真,使用ANSYS套件,对仿真学习做简要记录。本书简介与目录如下:本书配套有:视频教程+工程源文件+彩色仿真图片,下载链接如下:(审核中)第1章 基础知识1.1 电磁兼容基础​​​MS2、EMC三要素:3、 国际无线电干扰特别委员会标准:CISPR标准4、电磁兼容测试认证:传导发射(CE)、传导敏感度(CS)、辐射发射(RE)和辐射敏感度(RS)测试。

weixin_42508010的博客 2051

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础,同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式,其基本思想都是类似的:当点击事件传到 View 时,系统记下触摸点的坐标,手指移动时系统记下移动后触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。

Creativity + Efficiency = Success 1878

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1123

AI大模型助力现金流精准预测案例详解

因为它的“注意力机制”能像“人一样思考”——比如,当预测“下周现金流”时,模型会重点关注“最近7天的销售数据”“未来7天的天气”“竞品是否有促销”这些关键因素,而忽略“去年同期的无关数据”。AI大模型不是“取代”财务人员,而是“赋能”他们——把财务人员从“重复的Excel操作”中解放出来,专注于“战略决策”(比如如何优化资金结构、如何提升资金利用率)。比如,“促销力度”这个特征,不是简单的“折扣率”,而是“折扣率×促销天数×覆盖SKU数量”,这样能更准确反映促销对现金流的影响。这些问题的核心,其实是。

AIGC应用创新大全的博客 1258

【Android】View滑动的实现

我们在computeScroll()内部调用 scrollTo实现滑动,之后调用postInvalidate()再次重绘,又会调用computeScroll()方法,如此反复,直到滑动结束。由上我们发现,scrollBy实际是通过调用scrollTo实现的,scrollTo是基于所传递参数的绝对滑动,而scrollBy是基于当前位置的相对滑动。Scroller是弹性滑动对象,用于实现View的弹性滑动,即有过渡效果的滑动,需要和View的computeScroll方法配合使用。

2401_87463988的博客 851

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 43

【Android】View的解析—滑动篇

Android系统当中有两种坐标系,分别为Android坐标与View坐标在Android当中我们将左上角的顶点作为Android坐标系的原点,向右为X轴正方向,向下为Y轴正方向,在方法和方法获得的也是Android坐标系的坐标View获取自身的宽和高View自身就有和方法,方法本质是什么: View自身的坐标通过如下方法可以获得View到其父控件ViewGroup的距离: getTop():获取View自身顶边到其父布局顶边的距离getLeft():获取View自身左边到其父布局左边的距离getRight

2301_79828182的博客 1498

2026年瑞芯微数字IC设计笔试试卷带答案

本文主要考察数字集成电路设计相关知识,包括低功耗设计、时序分析、跨时钟域处理、总线协议等内容。试题分为单选题、多选题、代码设计题和简答题四部分。 单选题涉及门控时钟降低动态功耗、静态时序分析的限制、跨时钟域同步方案、时序违例修复方法、AHB总线信号、异步FIFO设计、半导体工艺电阻特性、二进制数转换、同步/异步复位比较以及分频电路设计等知识点。 多选题重点考查动态功耗优化技术、亚稳态特性、异步FIFO设计规范、Verilog可综合代码编写要求以及AXI总线协议特点等。 代码设计题要求实现一个同步FIFO和3

Open 215

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Android】View—基础知识,滑动,弹性滑动

在 Android 中,View是用户界面(UI)中的基本组件,用于绘制图形和处理用户交互。所有的 UI 组件(如按钮、文本框、图片等)都是View的子类。可以说,View是构建 Android 应用界面的基础。View是一种界面层的控件的一种抽象,它代表了一个控件。除了View还有ViewGroup,里面包含了许多个控件,即一组View。在Android设计中,ViewGroup也继承了View,也就意味着View本身可以是单个控件也可以是由多个控件组成的一组控件。

2301_79977698的博客 1395

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

安卓开发之View滑动与滑动冲突

在View工作流程中自定义View的一些注意事项里面,我们提到过要避免View的滑动冲突,那么这次就来看下View的滑动与滑动冲突。安卓中我们常见的下拉刷新等操作的基础就是滑动,有些时候由于Android手机屏幕比较小,为了给用户呈现更多的内容,也会需要使用滑动来隐藏或显示一些内容。 View 滑动 View的滑动本质上来说是移动 View,也就是改变其当前所处的位置。它的原理与动画效果的实现非常相似,都是通过不断地改变坐标来实现这一效果。 所以要实现View的滑动,就必须监听用户触摸的事件,并根据事件传入

iris的博客 607

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android群英传 自定义滑动view,Android 自定义滑动的view

安卓开发中经常会涉及到一些滑动的view 只需要使用scroller 就可以实现代码如下 以ImageView 为列 其他的 view 代码都是一样的public classScrollerImageViewextendsSinaImageView {privateScrollermScroller;publicScrollerImageView(Context context) {this(co...

weixin_42504230的博客 164

android view滑动动画,Android实现View滑动的6种方式

本文实例为大家分享了Android实现View滑动的具体方法,供大家参考,具体内容如下1.View的滑动简介View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。实现View滑...

weixin_29503627的博客 885
上一篇: Android 自定义Behavior
下一篇: Android动画总结
谦行
博客等级 码龄11年 182粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值