View的滑动与弹性滑动(ScrollBy+Scroller)

Android View的scrollTo()、scrollBy() 和Scroller类总结 一、View的scrollTo()、scrollBy() 1.scrollTo、scrollBy方法是View中的,因此任何的View都可以通过这两种方法进行移动。首先要明白的是,scrollTo、scrollBy滑动的是View中的内容(而且还是整体滑动),而不是View本身。我们的滑动控件如SrollView可以限定宽、高大小,以及在布局中的位置,但是滑动控件中的内容(或者里面的childView)可以是无限长、宽的,我们调用View的scrollTo、scrollBy方法,相当于是移动滑动控件中的画布 阅读详情

这次做一个SwitchView1,与上文的效果是一样的,但是
1.跟随手滑动使用scrollBy,
2. 松手后的弹性滑动使用scroller
需要使用下面的几个知识点:

知识点

  1. 系统很多控件都是使用了scrollBy+scorller来实现滑动效果的,例如ViewPager就是如此

    如果你想控制ViewPager翻页的速度,可以通过反射给ViewPager设置一个自定义的Scroller,在这个自定义的Scroller里设置你想要的翻页时长(做轮播图你会用到的,Banner这是我做的一个轮播图的demo,封装的不太好)

  2. scrollBy(dx,dy)增量滑动,

  3. scrollTo(x,y)直接滑动到指定坐标处

  4. 在本例中,一个LinearLayout里有一个ImageView滑块,当你想让ImageView滑块向左侧移动时,必须想两件事,

    1. 谁来调用scrollBy方法
    2. dx,dy的正负

    结论是:每次调用scrollBy,让该子控件的父容器去调用scrollBy方法,然后方向取反即可

  5. scorller的使用也是固定的

第一步:初始化Scroller
mScroller = new Scroller(getContext());

第二步:调用scrollBy去让一个控件滑动
((View) mImageView.getParent()).scrollBy(-deltaX, 0);// ★这是一个普适的公式,谁要滑动,就找谁的父亲去调用scrollBy,然后方向取反

第三步:重写computeScroll方法,下面的写法也是固定的

   @Override
    public void computeScroll() {
        super.computeScroll();

        if (mScroller.computeScrollOffset()) {
            ((View) mImageView.getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            invalidate();
        }
    }

第四步:调用startScroll(int startX, int startY, int dx, int dy, int duration) 实现弹性滑动

startX、startY是当前的scrollX,scrollY,dx、dy是你要基于当前位置要移动多少(增量)

所以(dx=你目的地的scrollX-当前的scrollX),下面的代码里,目的地的scrollX是0,所以dx= 0 - ((View) mImageView.getParent()).getScrollX(),dy=0,因为这个例子不需要竖向滑动

 mScroller.startScroll(
      ((View) mImageView.getParent()).getScrollX(),
      ((View) mImageView.getParent()).getScrollY(),
      0 - ((View) mImageView.getParent()).getScrollX(),
      0,
      300);

应用:

直接上代码:

package com.view.custom.dosometest.view;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Scroller;

/**
 * 描述当前版本功能
 * scroller实现
 *
 * @Project: DoSomeTest
 * @author: cjx
 * @date: 2019-12-01 10:06  星期日
 */
public class SwitchView1 extends LinearLayout {


    private ImageView mImageView;
    private LayoutParams mLayoutParams;
    private int mSliderHeight;
    private int mSliderWidth;
    private int mWidth;
    private int mHeight;
    private Scroller mScroller;

    public SwitchView1(Context context) {
        super(context);
        init();
    }

    public SwitchView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

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


    private void init() {
        setBackgroundColor(Color.GRAY);
        mScroller = new Scroller(getContext());

        post(new Runnable() {
            @Override
            public void run() {
                addSlider();
            }
        });

    }

    private void addSlider() {
        mWidth = getMeasuredWidth();
        mHeight = getMeasuredHeight();

        mSliderWidth = mWidth / 2;
        mSliderHeight = mHeight;

        mLayoutParams = new LayoutParams(mSliderWidth, mSliderHeight);
        mImageView = new ImageView(getContext());
        mImageView.setBackgroundColor(Color.CYAN);
        mImageView.setLayoutParams(mLayoutParams);
        addView(mImageView);
    }


    float mLastX;

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float x = event.getX();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                mLastX = x;
                break;

            case MotionEvent.ACTION_MOVE:
                int deltaX = (int) (x - mLastX);

                // 防止滑块滑出边界,矫正deltaX,这给地方打印出getScrollX()、deltaX的日志仔细看,就写对了,小逻辑有点绕
                if (getScrollX() - deltaX <= -mWidth / 2) {
                    deltaX = getScrollX() + mWidth / 2;
                } else if (getScrollX() - deltaX > 0) {
                    deltaX = getScrollX();
                }

                // SwitchView1是个LinearLayout,他的子控件是滑块Slider,假设我们想让滑块往右侧移动
                // 那么我们应该先找到滑块的父容器,让他去调用scrollBy方法,正好父容器就是SwitchView1,所以this.scrollBy()即可,
                // ok,既然我们是让父容器SwitchView1去scrollBy,那么父容器往左侧移动,滑块才能看起来是往右侧移动,所以要在deltaX前面加负号
                // 总结:每次调用scrollBy,让该子控件的父容器去调用scrollBy方法,然后方向取反即可
                // (但是父容器scrollBy了,他的所有子View都会动,这是副作用,当你需要所有子View一起动,那就正好ok)

                ((View) mImageView.getParent()).scrollBy(-deltaX, 0);// ★这是一个普适的公式,谁要滑动,就找谁的父亲去调用scrollBy,然后方向取反
                //scrollBy(-deltaX, 0);//这句话在本例子里和上句话是等效的,因为滑块的父亲就是this


                Log.e("qwe", getScrollX() + "scroll");
                mLastX = x;
                break;


            case MotionEvent.ACTION_UP:

                if (getScrollX() > -mSliderWidth / 2) {
                    mScroller.startScroll(
                            ((View) mImageView.getParent()).getScrollX(),
                            ((View) mImageView.getParent()).getScrollY(),
                            0 - ((View) mImageView.getParent()).getScrollX(),
                            0,
                            300);
                    // 本例子下面的语句与上面的等效,因为((View) mImageView.getParent())就是this
//                    mScroller.startScroll(getScrollX(), getScrollY(), 0 - getScrollX(), 0, 300);

                } else {
                    mScroller.startScroll(
                            ((View) mImageView.getParent()).getScrollX(),
                            ((View) mImageView.getParent()).getScrollY(),
                            -mWidth / 2 - ((View) mImageView.getParent()).getScrollX(),
                            0,
                            300);
                    // 本例子下面的语句与上面的等效,因为((View) mImageView.getParent())就是this
//                    mScroller.startScroll(getScrollX(), getScrollY(), getScrollX(), 0, 300);
                }
                invalidate();
                break;
        }
        return true;
    }

    @Override
    public void computeScroll() {
        super.computeScroll();

        if (mScroller.computeScrollOffset()) {
            ((View) mImageView.getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            // 本例子下面的语句与上面的等效,因为((View) mImageView.getParent())就是this
//            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            invalidate();
        }
    }
}

Android View事件体系 scrollTo/scrollBy:操作简单,适合对View内容的滑动;动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果;改变布局参数:操作稍微复杂,适用于有交互的View。 阅读详情

相关推荐

Android View(一)——View的基础知识

目录一.View的基础知识1.什么是View2.View的位置参数3.MotionEvent4. TouchSlop5. VelocityTracker6. GestureDetector 一.View的基础知识 1.什么是View View是一种界面层的控件的一种抽象,它代表了一个控件,是Android中所有控件的基类。 2.View的位置参数 3.MotionEvent 在我们触摸屏幕的过程中,可以分为三种情况,分别是按下、滑动、弹起。Android中为我们封装好了一个MotionEvent类,使

haazzz的博客 7148

使用scrollTo、scrollBy、Scroller实现滚动动画

在上一节讲解了layout、offset、的使用,本节说明scrollTo、scrollBy、Scroller。

步行者 1万+

Android——View的事件体系(一)View的滑动

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

AkaiC的博客 3026

JS实现事件监听的几种方法

JS实现绑定事件监听的几种方法 一、行内绑定 行内绑定:在HTML的标签中通过onclick属性进行绑定,绑定方式:on+事件名,在将所触发的事件赋值给该属性,如下: <button onclick="alert('123');">点击</button> 二、使用element.onclick进行事件绑定 使用element.onclick进行事件绑定:通过操作...

朽木自雕的博客 1万+

View.scrollBy()与View.scrollTo()的使用

NULL 博文链接:https://ipjmc.iteye.com/blog/1307565

Jasypt 开源加密库使用教程

Jasypt 加密框架概述 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。 2、有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。 3、

蚩尤后裔-汪茂雄 3万+

关于 Scroller的

mScroller.startScroll(0,getScrollY(),0,-dScrollY); 在ViewGroup或者View中使用mScroller.startScroll方法的时候,他们的内容没有移动,还需要重写computeScroll方法,在方法里面调用View或GroupView自身的 scrollTo或scrollBy方法才能移动view,要记得刷新View impor

ai_te_xiao的博客 301

侧杆试验 - 高速撞击 - 显式动力学 - ANSYS Workbench

显式动力学是一种时间积分方法,用于在速度很重要时执行动态模拟。显式动力学考虑快速变化的条件或不连续事件,例如自由落体、高速撞击和施加的负载。由于这些“非线性动力学”已集成到模拟中,因此显式动力学是模拟高度瞬态物理现象的首选。有些侧面碰撞是指车辆侧向撞上路边的坚硬物体,如树木或电线杆。这通常是由于驾驶员失去控制、超速、误判拐角或在湿滑路面上打滑造成的。

jianqimingtian的博客 1289

Android中View的滑动机制分析

1、View基础知识1.1 View介绍 View是Android中所有控件的基类,是一种界面层控件的抽象,它代表了一个控件。ViewGroup,控件组,内部包含了多个控件,即一组View。ViewGroup继承View,意味着View可以是单个控件,也可以是由多个控件组成的一组控件,形成了View的树结构。 举例说明View和ViewGroup的关系。Button是个View,LinearLa

跨语言,跨平台,跨应用 867

Tube-based MPC完全指南:RCI集合构造与Matlab实现

模型预测控制(MPC)在实际工程中常因模型失配和外部扰动导致硬约束被突破,而鲁棒控制中的Tube-based MPC通过将单条预测轨迹扩展为“管道”集合,为不确定性提供了严格的安全边界。其核心在于利用鲁棒控制不变集(RCI)离线构造安全域,再结合在线标称MPC与反馈校正实现约束的硬保证。针对非线性系统,利普希茨条件为等效扰动的放大和RCI的构造提供了理论基础,使得算法既能保留非线性描述,又不牺牲在线计算效率。该方法适用于带扰动和参数漂移的机械系统、过程控制及嵌入式控制场景。本文以摩擦力非线性系统为例,从RC

weixin_32642109的博客 216

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 208

【Android】View滑动的实现

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

2401_87463988的博客 854

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

【Android】view的基础知识

的平移滑动效果,是一种较为灵活且常用的方式。这种方法不仅可以控制滑动的距离和方向,还能够调整滑动的速度、加速度等效果,让动画更流畅和自然。是 Android 中的 UI 组件的基类,代表了用户界面上的一个可视元素。LayoutParams用于保存一个view的布局参数,我们可以通过改变view的布局参数来改变位置。可以直接对 View 的属性进行动画操作,是另一种实现弹性滑动效果的方式。是 Android 提供的一个辅助类,用于实现 View 的平滑滑动。的初始位置的偏移量,单位是像素。

Patrick_yuxuan的博客 1323

检索增强生成(RAG)、微调(Fine-tuning)与知识蒸馏(Knowledge Distillation):核心差异与技术选型指南

在自然语言处理(NLP)领域,大型预训练语言模型(如GPT、BERT系列)的崛起彻底改变了技术生态。面对实际业务场景中模型效果优化与资源效率平衡的永恒命题,开发者主要依赖三大技术路径:检索增强生成(Retrieval-Augmented Generation, RAG)、模型微调(Fine-tuning)和知识蒸馏(Knowledge Distillation)。本文将通过技术原理拆解、典型应用场景对比和实战选型策略三个维度,深入解析这三种技术的本质差异。

fudaihb的博客 1829

英伟达 Jetson AGX Thor 官方入门教程(一)系统U盘安装

NVIDIA Jetson AGX Thor开发套件快速安装指南 本指南详细介绍了NVIDIA Jetson AGX Thor开发套件的安装流程。该套件搭载T5000 SoM,为物理AI和机器人应用提供强大支持。安装过程采用全新的JetPack 7.0方案,通过USB闪存盘即可完成BSP(Jetson Linux)安装,无需依赖Ubuntu主机。指南包含硬件开箱说明、两种配置模式(带显示器/无显示器)、详细的ISO镜像下载和USB制作步骤(推荐使用Balena Etcher工具),以及首次启动后的初始设置流

机器人控制与仿真应用 2872

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

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

2301_79977698的博客 1396

CATIA二次开发一一一计算 CATIA 零件模型在全局坐标系下的包围盒方法

本文介绍了一种在CATIA中计算零件模型全局坐标系下包围盒(BoundingBox)的方法。通过遍历零件几何体特征点,并应用坐标变换矩阵,最终返回精确的零件包围盒。核心步骤包括初始化与输入校验、坐标变换处理、几何体特征点遍历以及全局坐标变换。关键方法涉及CATMathBox操作和坐标变换接口。该方法适用于碰撞检测、可视化优化和装配分析等场景,能够快速判断零件间的空间干涉,提升渲染性能,并计算零件在装配体中的全局位置范围。

工业软件开发 895

Android 开发艺术探索笔记(9)

愿你有一天,真爱自己,善待自己。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!待自己。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_83703797的博客 1059

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

View的事件体系

View的事件体系View的滑动ScrollTo/ScrollBy动画改变布局参数弹性滑动Scroller动画延时策略View事件分发事件分发流程Activity事件分发Window事件分发DecorView事件分发ViewGroup的事件分发View对事件分发ACTION_CANCELView的滑动冲突种类外部和内部滑动方向不一致外部和内部滑动方向一致解决方法外部拦截法内部拦截法 View的滑动 ScrollTo/ScrollBy 动画 改变布局参数 ScrollTo和ScrollBy还有View动画滑

qq_43775976的博客 126

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

View的滑动之瞬间滑动与弹性滑动

View的滑动之瞬间滑动与弹性滑动

wjconn的博客 3265

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android View 的scroll相关方法属性 以及Scroller弹性滑动原理

最近在修改fragmentation 的bug时,其中SwipeBackLayout 的实现使用是ViewDragHelper ,而ViewDragHelper 使用的是OverScroller,OverScroller 在大部分时候是可以取代Scroller的。所以先从Scroller来分析,这些知识用到好几次,经常忘记,也算做个笔记。 Android开发中,但在这些api的实际使用过程中,开发...

薛瑄的博客 1556

Android弹性滑动在自定义View中的高级应用

本文出自门心叼龙的博客,属于原创类容,转载请注明出处。 好久没有更新博客了,特意的看了博客最后的更新时间为2019年7月21日,今天是10月24日掐指一算已经有三个月时间了,自从上篇《开发杂谈:说说数据结构和算法那点事儿》以后就一直没有更新了,确实有些尴尬,而今天又是一年一度的1024程序员节,我想在这个特殊的日子里,很有必要写一篇文章来写纪念这个属于程序员的节日。 我们知道,在功能机时代我们...

门心叼龙的专栏 7479

第三章 view的事件体系 ----- view滑动/拖动

Android view的滑动先看下view完整代码如下:public class DemoView extends View { private int lastX; private int lastY; private Scroller mScroller; public DemoView(Context context, AttributeSet attrs, i

xj531的博客 328

View的事件体系(二)view的弹性滑动

上节主要总结了view的滑动和view的基础概念,这里就补充view的弹性滑动实现方式 弹性滑动方式 使用Scroller操作scrollTo/ScrollBy 使用动画 使用延时策略 一、Scroller的使用 1、使用步骤(固定): 1、 创建Scroller对象 Scroller mScroller = new Scroller(context); //2、 调用方法 ...

dev晴天的博客 332

浅谈Android View滑动和弹性滑动

引言   View的滑动这一块在实际开发中是非常重要的,无论是优秀的用户体验还是自定义控件都是需要对这一块了解的,我们今天来谈一下View的滑动。 View的滑动   View滑动功能主要可以使用3种方式来实现;第一种是通过View的scrollTo/scrollBy方法来实现滑动。第二种是通过动画给View添加平移效果来实现滑动。第三种就是通过修改View的LayoutParam...

diezhi2505的博客 190
上一篇: View的滑动与弹性滑动(改变View的参数+属性动画)
下一篇: 触摸事件分发机制
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值