《 Android 开发艺术探索》 View 的位置参数与使用 scrollTo/scrollBy 进行滑动

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

在《Android开发艺术探索》中有提到过,View 的位置主要由其四个顶点来决定,分别对应 View 的四个属性:top、left、right、bottom,且这四个点是相对于 View 的父容器来说的,是一种相对坐标。

另外,在 Android 3.0 以后,View 还增加了几个参数:x、y、translationX、translationY。x、y是 View 左上角相对于父容器的坐标,而 translationX、translationY 是 View 左上角相对于父容器的偏移量。

x = left + translationX
y = top + translationY

View 在平移的过程中,top 和 left 表示的是原始左上角的位置信息,其值是不会改变的,此时发生改变的是 x、y、translationX、translationY。

这里需要突出的是平移,因为下面需要说到 View 使用 scrollTo/scrollBy进行滑动。


首先,需要强调的一点 ,scrollTo/scrollBy 只能滑动 View 的内容,而不能滑动 View 本身 (即滑动的是下面所说的绘图层,而不能滑动 layout 层)。同时,还需要先了解清楚接下来说明的一些概念,有些名词不一定准确,主要是为来辅助概念的讲解。

比如 TextView 的话滑动的就是里面的文本内容,ViewGroup 的话就是滑动内部的子 View。

在 View 的scrollTo 和scrollBy 一文中,有如下的图:
这里写图片描述
红色框框代表 TextView 的空间视图(即图中的 View 视图,也就是绘画层、绘画视图),该层是没有边界的,可以无限延伸(用红色框框只是为了凸显出来)。

但是在实际中,TextView 在使用的时候都会依附于一个父 View,此时就存在 TextView 的 layout 视图,即图中的黑色框框(框框的左上角坐标即 TextView 的 (left,top)),是具有具体的边界的(如下代码中 TextView 设置的 layout_XXX 属性,就是用来框定 TextView 的 layout 视图的,此视图即代表在父布局中实际的边界),在绘画层中的内容只有同时处于 layout 视图中才会被显示出来。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="50dp"
        android:layout_height="100dp"
        android:text="X"/>

</LinearLayout>

对于 Layout 来说(如 LinearLayout),因为内部排放的是子 View,所以,子 View 是在 Layout 的绘图层进行绘画的,但是只有当绘画的子 View 处于 Layout 的 layout 视图范围内时,子 View 才会被显示出来(更进一步的说,此时显示的就是子 View 的 layout 视图处于父 Layout 的 layout 视图中)。

像下面这种情况:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootView"
    android:layout_width="800dp"
    android:orientation="horizontal"
    android:id="@+id/parent"
    android:layout_height="800dp">
    ......

</LinearLayout>

此时,因为 LinearLayout 设置的 android:layout_width与android:layout_height过大,并不能在手机屏幕上完全显示出来,这里需要注意,该布局文件对应的只是 ContentView(即通过 setContentView 设置的),在该 View 外层还有包裹一层系统的 Layout 的,而此时即使 rootView 设置了 800 * 800dp,但是因为有一部分是不在系统Layout 中的 layout 视图中的,所以才没有在手机屏幕上完全显示出来。


使用scrollTo 、scrollBy方法滑动时,涉及到 View 内部的两个属性 mScrollX 和 mScrollY (两者的单位为像素,可通过 getScrollX() 和 getScrollY()获得)的改变。

当 View 没有经过 scroll 方法滑动内部内容时,处于原始状态时,此时,View 的绘画层与 layout 层左上角重叠的点为参考点(如图中着重标记的黑点),有 mScrollX = 0 && mScrollY = 0,当滑动之后,该参考点与 layout 层左上角点的距离即为 mScrollX、mScrollY 的值。(因为 layout 层是固定不动,滑动的只是绘图层)。

  • scrollTo 实现基于所传递参数的绝对滑动,即把上面所说的参考点滑动到指定的位置。
  • scrollBy 实际上也是调用 scrollTo,实现基于当前位置的相对滑动,即把上面所说的参考点根据原有位置滑动相应的距离。

如果绘图层向左滑,mScrollX 为正,如果绘图层向上滑,mScrollY 为正。如下图演示:
这里写图片描述


此外,还需要注意,当一个 Layout 在使用 scroll 滑动时,并不会改变其内部子 View 的 x、left、translationX等属性。

例如有如下布局:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#feb4b4"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:id="@+id/parent"
    android:layout_height="wrap_content">
    <Button
        android:id="@+id/bt"
        android:onClick="test"
        android:layout_marginLeft="100dp"
        android:layout_width="50dp"
        android:layout_height="100dp"
        android:text="X"/>
</LinearLayout>

且为 Button 实现点击事件:

public class MainActivity extends AppCompatActivity {

    private LinearLayout layout;
    private Button testBt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        layout = findViewById(R.id.parent);
        testBt = findViewById(R.id.bt);
    }

    public void test(View view) {
        Log.d("test", "getX() = "+testBt.getX());
        Log.d("test", "getLeft() = "+testBt.getLeft());
        Log.d("test", "getTranslationX() = "+testBt.getTranslationX());
        layout.scrollBy(50,50);
        Log.d("test", "getX() = "+testBt.getX());
        Log.d("test", "getLeft() = "+testBt.getLeft());
        Log.d("test", "getTranslationX() = "+testBt.getTranslationX());
    }
}

scrollBy() 前后,打印的值相等。
这里写图片描述
(需要注意第一次打印不能在 Activity 的 onCrate 方法中,因为此时可能控件还没有完全初始化,导致 getX() 和 getLeft() 为 0)。

【View基础知识】View的滑动之scrollTo、scrollBy 本系列文章部分摘自《Android开发艺术探索》,目的是提取精干知识点加上自己部分理解作为备忘笔记,如有侵权请及时联系我,再次感谢作者,如喜欢请支持购买作者正版书籍 目录 目录 View的滑动方式 scrollTo/scrollBy实现的滑动 scrollTo/scrollBy滑动的原理 View的滑动方式 View 的滑动主要通过三种方式实现: 通过View本... 阅读详情

相关推荐

安卓基础知识之View篇(一):View 必须要知道的基础知识

安卓基础知识系列旨在简明扼要地提供面试或工作中常用的基础知识,让对安卓还不太熟悉的小伙伴更快地入门。同时自己在工作中,也没法完全记住所有的基础细节,写这样的系列文章,可以让自己形成一个更完备的知识体系,同时给自己日后留个知识参考。 开始的开始 View 是除了安卓四大组件以外用的最多的控件,我们需要利用 Android 内置的 View 控件(TextView、LinearLayout等)完成业务需求,有时甚至需要自定义控件来满足特殊的业务需求。View 还负责与用户的交互(点击、滑动、长按等操作),掌.

qq_40987010的博客 4056

View滑动之scrollTo/scrollBy

Android设备上组件的滑动是所有应用的标配,不管是向上滑动加载更多数据,还是下拉刷新数据等等操作,他们的基础都是滑动。在原声组件的滑动中,scrollTo/scrollBy是其中一种比较重要的,也是比较典型的一种滑动方式。即便是用到Scroller编写自定义的滑动效果时,也是以scrollTo/scrollBy为基础的。  本文主要介绍下scrollTo/scrollBy两个方法的基本操作和

wangzunkuan的博客 670

【多媒体交互】Unity+普通摄像头实现UI事件分析

利用摄像头捕捉用户的手势或动作,结合坐标映射与事件系统触发UI交互

qq_38350004的博客 1327

android scrollto参数,Android scrollTo和scrollBy方法使用解析

在一个View中,系统提供了scrollTo、scrollBy两种方式来改变一个View的位置。这两个方法的区别非常好理解,与英文中To与By的区别类似,scrollTo(x, y)标识移动到一个具体的坐标点(x, y),而scrollBy(dx, dy)表示移动的增量为dx、dy。在获取偏移量后使用scrollBy来移动View,代码如下所示:int offsetX = x - lastX;in...

weixin_32042959的博客 641

MD01和MD01N比较

摘要:MD01(传统MRP)与MD01N(MRP Live)是SAP系统不同版本的物料需求计划事务码。核心差异包括:MD01N取消MRP列表、简化计划规则、合并MPS/MRP操作、采用BAdI技术等,体现S/4HANA平台简化、标准化和智能化的演进方向。MD01N通过优化参数配置、增强筛选功能、利用HANA实时计算能力,实现了更高效的物料计划流程,代表了新一代计划引擎的技术革新。

SAP_LES_COM的博客 893

tft_espi 中文字体及自定义字体制作(tft.eSPI模块)

tft.eSPI库自定义字体方法 先下载 processing 然后安装到mixly安装目录下找到tft_eSPI文件夹。

琢磨侠的博客 2764

View的滑动之ScrollTo和ScrollBy

目前View滑动的实现方式主要有三种: 1.通过View自身提供的ScrollTo和ScrollBy。 2.通过动画来使View平移来实滑动。 3.第三种是通过改变View的LayoutParams,使View重新布局实现滑动。 这几天在看View的滑动,虽然ScrollTo和ScrollBy在实际的开发过程中用到的很少,特别是属性动画的广泛运用后,但是这玩意到了Android 7.0也还

XuZhenhao 690

ROST_CM6软件之词频分析、社会网络和语义网络分析、情感分析

简介 ROST CM 6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。 社会网络和语义网络分析(S) 数据 注意,保存时编码要为ANSI 所以这里需要转换一下 准备自定义表与停词表 例如 同时,点击快速分析后,将会弹出网络图 对网络图进行设置 对布局进行设置 对节点、边进行设置 最终效果图 修改 情感分析

积一时之步,臻千里之遥程 9万+

Android 滑动scrollBy()和scrollTo()两个方法的简单认识

涉及到滑动,就涉及到VIEW,大家都知道,Android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI。以下是android UI的结构示示意图: 查看源码 [java] view plain copy

m0_37165318的博客 1215

BMS | 从一串到几百串硬件架构简介

锂电池在生活中越来越多的方面扮演能源的角色,除了大家熟知的电动汽车行业,在一些消费类,工业类电子产品比如手机,电动自行车,电动工具中都有应用,追本溯源今天我们一起来学习下最基础的BMS架构。 1~4串架构 以S8241为代表的无通信/无固件/模拟器件 可实现过充保护、过放保护、过流/短路,参数由器件后缀代码决定;通信类手持设备供电系统;1~4节电池保护板架构 如图使用S-8241系列保护IC,一对充放电MOS管控制充放电的回路的切断和接通,系统供电来自于电芯电压,VM引脚用于检测过...

ningvay的博客 9920

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2291

Android ScrollBy与ScrollTo区别

先说结论,结论来自《Android开发艺术探索》 ScrollBy实际上也是调用了ScrollTo方法,它实现了基于当前位置的相对滑动,而ScrollTo实现了基于所传递参数的绝对滑动。 所谓的移动是当前控件,里面内容View的移动,比如一个LinearLayout里面包含了一个Button,应该调用LinearLayout的ScrollBy或者ScrollTo方法。 从左向右滑动,那么mSc...

谢耀眼 4138

PID参数自整定实战解析:从继电反馈到智能调节的完整实现

本文深入解析PID参数自整定的实战应用,从继电反馈原理到智能调节算法的完整实现。通过详细讲解振荡波形特征提取、参数计算的工程化改进及工业场景调试技巧,帮助工程师快速掌握PID自整定技术,提升控制系统性能。特别针对嵌入式系统优化和噪声环境下的稳定策略提供了实用解决方案。

weixin_28731223的博客 462

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

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

2401_83703797的博客 1059

YOLOv8【第一章:基础入门篇·第2节】一文搞定,数据集制作与标注完全指南!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 1509

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

wjconn的博客 3265

蓝牙模块HM-10手册

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

《Android 开发艺术探索》笔记3--View事件体系

View事件体系思维导图View的事件体系View的基础知识View的位置参数MotionEvent和TouchSlopVelocityTracker GestureDetectorView的滑动scrollTo/scrollBy使用动画改变布局参数"弹性滑动使用Scroller小结Scroller的工作原理:通过动画使用延时策略参看文章 View事件体系思维导图 View的事件体系 View的基础知识 View的位置参数 一个View的位置主要由四个顶点构成, 或者可以就是两个点就可以确定. 分别为左.

行动者&&职业化 2117

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android开发艺术探索学习-View的滑动

滑动是View的一个很重要的特性,Android也提供了很多支持滑动的控件,可以说滑动无处不在。因此掌握View的滑动是相当重要的。常见的滑动三种方法有:使用scrollTo和scrollBy、使用动画、改变布局参数。 使用scrollTo和scrollBy     在View中提供了scrollTo和scrollBy方法来实现View的滑动,按惯例看下这两个方法的实现: /**

chan1116的专栏 845

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

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

iris的博客 607

Android开发艺术探索知识回顾——第3章 View的事件体系:2、View的滑动、弹性滑动

3.2 View的滑动 3.1节介绍了 View的一些基础知识和概念,本节开始介绍很重要的一个内容:View的滑动。在Android设备上,滑动几乎是应用的标配,不管是下拉刷新还是SlidingMenu,它们的基础都是滑动。从另外一方面来说,Android手机由于屏幕比较小,为了给用户呈现更多的内容,就需要使用滑动来隐藏和显示一些内容。 基于上述两点,可以知道,滑动在 Android开发中具有很重要的作用,不管一些滑动效果多么绚丽,归根结底,它们都是由不同的滑动外加一些特效所组成的。因此,掌握...

鲁迷那的专栏—坚持实践后再写出来! 309

Android开发艺术探索笔记—— View(一)

Android开发艺术探索笔记 ——View(一) View的基础知识 什么是View View是Android中所有控件的基类。是一种界面层控件的抽象。 View的位置参数 参数名 获取方式 含义 top getTop() View左上角纵坐标 left getLeft() View左上角横坐标 bottom getBottom() View右下角纵坐标 ...

didingyun4257的博客 236

【Android开发艺术探索】View的事件体系

1、View基础知识 1.1、什么是View View是Android中所有控件的基类。View是一种界面层的控件的一种抽象,代表了一个控件。除了View,还有ViewGroup,内部包含了许多个控件,即一组View。 1.2、View的位置参数 View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top、left、right、bottom,其中top是左上角纵坐标,left是左...

milovetingting的专栏 248

Android 开发艺术探索笔记之三 -- View 的事件体系

学习内容 View 基础 滑动 事件分发机制 滑动冲突 1. View 基础知识 View 定义 View 是 Android 种所有控件的基类,是一种界面层的控件的一种抽象,代表了一个控件 ViewGroup 继承 View,其内部包含了许多个控件,即一组 View ViewGroup 内部是可以有子 View 的,而这个子 View 同样还可以是 ViewGroup View...

whdAlive 's blog 559

Android艺术开发探索——3.View基础

3.1 什么是View View是Android中所有控件的基类,是一种界面层的控件的一种抽象,本身可以是单个控件也可以是由多个控件组成的一组控件。 3.2 View的位置参数 这些坐标都是相对于view的父容器来说的,是一种相对坐标 后来增加了x,y,translationX,translationY,x,y是view左上角的坐标,translationX,translationY是view左上角相对于父容器的偏移量,默认值为0, x = left + translationX y = top + tr

xuan的博客 202

Android 开发艺术探索笔记(9),Android开发教程入门

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149256的博客 916

AnAndroid开发艺术探索读后感—View的滑动

View的滑动常用的有三种方式:第一种是通过View本身提供的scrollTo/scrollBy方法来实现滑动;第二种是通过动画给View施加平移效果来实现滑动;第三种是通过改变View的LayoutParams使得View重新布局从而实现滑动。 1.使用scrollTo/scrollBy 先看看这两个方法的源码: /** *Set the scrolled position of you

luck_136的博客 425
上一篇: Android 实现获取原生相册图片和裁剪
下一篇: 自定义实现横向圆角进度条——简易版
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值