用动画演示Android坐标系:ScrollY+TranslationX到底改变了什么?

百度贴吧爬虫实战:完整实现与使用指南 使用 csv 模块创建写入器,首先写入表头("标题" 和 "链接"),然后遍历帖子字典,将每个标题和链接作为一行写入文件。首先检查内容是否为空,然后通过查找 JSON 结构的起始({)和结束(})位置,提取有效的 JSON 片段。接着遍历帖子列表中的每个条目,提取标题文本和对应的链接,对于相对路径的链接会自动补全为完整的 URL。从 JSON 提取标题和链接此方法专门用于从解析后的 JSON 数据中提取帖子标题和对应的链接。提取到的标题和链接以字典形式返回,键为标题,值为对应的完整链接。 阅读详情

Android坐标系可视化:用动画拆解ScrollY与TranslationX的底层逻辑

当你在Android屏幕上滑动一个View时,背后究竟发生了什么?为什么getScrollY()和getTranslationX()会返回不同的值?本文将用动画演示和源码分析的方式,带你穿透抽象概念,建立立体坐标思维模型。

1. 四大坐标系:理解View定位的基石

在Android系统中,每个View都存在于四种不同的坐标系中:

坐标系类型原点定义典型应用场景
屏幕坐标系屏幕左上角(0,0)跨窗口定位、全局手势判断
窗口坐标系应用窗口左上角(0,0)Dialog弹窗位置计算
父视图坐标系直接父容器左上角(0,0)ViewGroup布局测量
自身坐标系View自身左上角(0,0)绘制内容、触摸事件处理

关键代码示例:获取不同坐标系的定位

// 获取屏幕绝对坐标
val screenPos = IntArray(2)
view.getLocationOnScreen(screenPos)

// 获取窗口相对坐标  
val windowPos = IntArray(2)
view.getLocationInWindow(windowPos)

// 获取父视图相对坐标
val parentLeft = view.left
val parentTop = view.top

2. ScrollY的动画演示:内容移动vs视图移动

通过Lottie动画可以清晰展示scrollTo()的实际效果:

  1. 初始状态:View内容完全显示,scrollY=0
  2. 向下滑动:内容向上移动,scrollY变为正数
  3. 边界检测:当scrollY超过内容高度时触发overscroll
// 典型滑动处理代码
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            int deltaY = (int)(event.getRawY() - lastY);
            scrollBy(0, -deltaY); // 注意负号!
            lastY = event.getRawY();
            break;
    }
    return true;
}

重要提示:scrollTo()改变的是View内容的显示位置,而非View本身在布局中的位置。这就是为什么滚动列表时getTop()值不变,而getScrollY()会变化。

3. TranslationX的运作机制:视觉位移的魔法

与scroll不同,translation改变的是View的绘制矩阵:

  1. 布局位置不变:getLeft()等值保持不变
  2. 绘制位置偏移:实际渲染时应用变换矩阵
  3. 点击区域跟随移动:触摸事件坐标会自动转换

属性动画示例:

<objectAnimator
    android:propertyName="translationX"
    android:duration="500"
    android:valueTo="200dp"
    android:interpolator="@android:interpolator/accelerate_decelerate"/>

下表对比两种移动方式的差异:

特性scrollTo/BytranslationX/Y
影响对象View内容View整体
布局参数不改变getLeft()等不改变getLeft()等
事件坐标需要手动处理偏移自动转换
性能消耗较低需要矩阵运算
典型应用场景滚动内容视图动画/拖拽

4. 实战:SlidingPaneLayout的坐标处理艺术

通过分析SlidingPaneLayout源码,我们可以学习到专业级坐标处理技巧:

  1. 双重坐标计算:

    // 计算滑动范围
    final int width = getWidth();
    final int slideRange = width - mPanelWidth;
    
    // 根据滑动比例应用两种位移
    if (mIsSlidingUp) {
        mSlideOffset = (float) (newTop - mPanelTop) / slideRange;
        offsetTopAndBottom(newTop - mPanelTop); // 改变布局位置
    } else {
        mSlideOffset = (float) (newLeft - mPanelLeft) / slideRange;
        setTranslationX(newLeft - mPanelLeft); // 使用视觉位移
    }
    
  2. 触摸事件分发逻辑:

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final float x = ev.getX();
        final float y = ev.getY();
        
        // 判断触摸点是否在可滑动区域
        if (isTouchInSlidableArea(x, y)) {
            return true; // 拦截事件
        }
        return super.onInterceptTouchEvent(ev);
    }
    
  3. 平滑滑动效果实现:

    private void smoothSlideTo(float slideOffset) {
        int startLeft = getLeft();
        int finalLeft = (int)(mInitialOffset * (1 - slideOffset));
        
        mScroller.startScroll(
            startLeft, 0, 
            finalLeft - startLeft, 0,
            ANIMATION_DURATION);
        postInvalidate();
    }
    

5. 高级技巧:坐标系转换与手势处理

开发复杂交互时经常需要处理坐标转换:

  1. 屏幕坐标转View本地坐标:

    fun screenToLocal(view: View, screenX: Float, screenY: Float): PointF {
        val screenPos = IntArray(2)
        view.getLocationOnScreen(screenPos)
        return PointF(
            screenX - screenPos[0] - view.translationX,
            screenY - screenPos[1] - view.translationY
        )
    }
    
  2. 处理多点触控的基准点计算:

    // 计算两指中心点
    float midX = (event.getX(0) + event.getX(1)) / 2;
    float midY = (event.getY(0) + event.getY(1)) / 2;
    
    // 计算两指距离
    float dx = event.getX(0) - event.getX(1);
    float dy = event.getY(0) - event.getY(1);
    float distance = (float) Math.sqrt(dx * dx + dy * dy);
    
  3. VelocityTracker的速度计算:

    VelocityTracker velocityTracker = VelocityTracker.obtain();
    velocityTracker.addMovement(event);
    
    if (event.getAction() == MotionEvent.ACTION_UP) {
        velocityTracker.computeCurrentVelocity(1000); // 像素/秒
        float yVelocity = velocityTracker.getYVelocity();
        if (Math.abs(yVelocity) > MIN_FLING_VELOCITY) {
            fling(-yVelocity); // 处理快速滑动
        }
    }
    

在实现抽屉效果时,我发现同时使用translationX和边缘触摸检测能获得最佳用户体验。当手指从屏幕左边缘开始滑动时立即响应,而内部滑动则需要超过阈值才触发,这种细节处理让应用显得更加专业。

汽车OBD接口实战:如何用STM32读取CAN总线数据(附完整代码) 本文详细介绍了如何利用STM32微控制器通过汽车OBD接口读取CAN总线数据的完整实战方案。内容涵盖硬件连接(如OBD引脚定义与TJA1050收发器接线)、STM32的CAN外设初始化与滤波器配置,并深入解析OBD-II诊断协议,演示了如何请求和解析发动机转速、车速等关键数据。文末提供了构建稳定数据读取系统的代码框架与错误处理建议,为嵌入式开发者和汽车电子爱好者提供了从零到一的实践指南。 阅读详情

相关推荐

在带有Intel Arc GPU的Windows上安装IPEX-LLM

本文将介绍在 Intel Arc GPU 环境下安装 IPEX-LLM。

wux_labs的博客 1637

Android View 中的scrollBy() scrollTo() getScrollY() getScrollX()

android系统以手机屏幕左上角为坐标原点建立直角坐标系,x轴方向与笛卡尔坐标系相同,y轴方向与笛卡尔坐标系相反, 获取控件在parent中的相对位置可以使用getLeft(),getRight(),getTop(),getBottom()这四个方法,此处不详解, 查看View中源码,在这个类中有mScrollX和mScrollY两个变量用于存储控件移动的位移,而getScrollY和get

qq_18070249的博客 615

用树莓派搭建全功能NAS服务器(01):树莓派基础操作&OMV搭建

写在前面 对于文件互传来说,局域网和云盘的操作总是独立的,而且很难将两者的优势合为一体。如果想要集多种优势为一体,那么NAS应该就是较为完美的解决方案了。 在这个系列中我们尽量跳过一些枯燥的理论知识,专注于说明两件事:   1.NAS是什么&能做什么 2.搭建思路&怎么做   这中间也会涉及到一些方案的选择,同类方案我也会列出来和大家分享我已知的优缺点,有兴趣可以多种尝试。(侧重于软件) 虽然是用树莓派搭建的,但是对于debian linux系统下的NAS搭建有着很好的参

斯塔克家的真维斯的工作间 2万+

android scrollby,Android Scroll详解(一):基础知识

在前边的文章中,我们已经对Android触摸事件处理有了大致的了解,并且详细探讨了MotionEvent的相关用法。对之前文章中的知识还不是很了解的同学,请阅读《Android MotionEvent详解》。今天,我们就来探讨一下Android中界面滚动效果的相关机制,本篇文章主要讲解一下滚动相关的知识点,之后的文章会涉及实际的代码和原理。希望大家阅读完这篇文章之后,能够了解或者掌握一下知识:An...

weixin_42378289的博客 824

【ESP32】SPI SRAM memory test fail。External RAM failed memory test!

log日志报错如下:这两条报错信息表明外部 SPI SRAM(静态随机存取存储器)的内存测试失败。

weixin_56217406的博客 1025

深入排查127.0.0.1拒绝连接:从端口占用到Tomcat服务启动的完整解决方案

本文针对开发者访问127.0.0.1时遭遇“拒绝连接”的常见问题,提供了一套完整的排查与解决方案。文章从端口占用检查入手,详细讲解了使用netstat命令识别进程,并深入分析了服务监听地址、IPv6配置、防火墙以及Tomcat服务安装与启动等核心环节。通过实战演练,指导读者系统性地解决从网络层到应用层的各类连接问题,最终确保本地服务成功运行并可通过本地回环地址正常访问。

weixin_29279047的博客 3205

Android——Scroll分析

一:滑动的产生原因滑动一个View原理:就是通过不断的改变View的坐标。 实现View的滑动,必须监听用户触摸的事件,根据触摸传入的坐标,动态的改变View的坐标,从而实现滑动 Android的坐标系:Android中屏幕的最左上端的点就是原点,向右就是X坐标轴的正方向,向下就是Y坐标轴的正方向 系统提供的getLocationOnScreen(intlocation[])方法获取Andro

LCY天上殿的博客 424

数仓 - 促销敏感度、评论敏感度

1. 促销敏感度 步骤1. 首先按照最后一次下单时间及有无复购情况将用户分为四大群体: 近一年有购物行为且复购的用户 -- L1 (今年复购用户) 近一年有购物行为但无复购的用户 --L2 (今年一单购用户) 最后一次下单时间在1年之前且有复购的用户 --L3 (今年无购且只有一单用户) 最后一次下单时间在1年之前但无复购的用户 -- L4 (今年无购多单用户) 步骤2. 每一类用户群再根据优惠订单占比、每单优惠金额占比的平均值、优惠金额这三个指标进行k-means聚类,分为: 非常敏感 -

weixin_41332009的博客 1900

Android Scroll详解(一):基础知识

原作者: ztelur 译文仅供个人学习,不用于任何形式商业目的,转载请注明原作者、文章来源、翻译作者及简书链接,版权归原文作者所有。  在前边的文章中,我们已经对Android触摸事件处理有了大致的了解,并且详细探讨了MotionEvent的相关用法。对之前文章中的知识还不是很了解的同学,请阅读《Android MotionEvent详解》  今天,我们就来探讨一下Android中界面滚动效

taylor的专栏 2901

Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较

C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载

二进制君 5834

Open3D(C++) 点云构建三维Delaunay三角剖分

C++版本的Open3D实现从点云构建三维Delaunay,可视化效果。

点云侠的博客 2247

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系统手机屏幕的左上角为坐标系,同时y轴方向与笛卡尔坐标系的y轴方向想反。通过提供的api如getLeft , getTop, getBottom, getRight可以获得控件在parent中的相对位置。同时,也可以获得控件在屏幕中的绝对位置,详细用法可参考android应用程序中获取view的位置 当我们编写一些自定义的滑动控件时,会用到一些api如scrollTo(),scro

bigconvience的专栏 8万+

攻克反光难题!YOLOv9工业缺陷检测实战:高反光件、微小划痕精准识别(附抗反光代码+产线数据)

文章摘要:本文针对不锈钢、铝合金等高反光工业件的缺陷检测难题,提出了一套“硬件抗反光+YOLOv9小目标增强”的解决方案。通过分析反光干扰(镜面/漫反射)和微小划痕(0.1mm级)两大核心问题,详细介绍了500万像素工业相机+偏振光源的硬件配置方案,以及基于偏振图像融合和超分辨率放大的预处理方法。最终实现误检率1.2%、微小划痕检出率99.3%的工业级检测效果,并提供了可落地的代码实现和车间实测数据。(148字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1043

View的坐标系

1. left,right,top,bottom 这四个属性决定了一个view的位置。view总是要摆放在一个容器中,因此这四个属性的值是相对于其父容器的左上角而言的。即,view的left为100px,意味着距离父容器的左上角横坐标为100个像素,view的top为100px,意味着距离父容器左上角纵坐标为100个像素。而view的rigth为left+view的width,bottom为vi

piglite的专栏 893

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android View基础

theme: channing-cyan 1 View的基础属性 int mLeft: View左边距,即View的左边 距离 父View左边 的距离 int mTop: View上边距,即View的上边 距离 父View上边 的距离 int mRight: View右边距,即View的右边 距离 父View右边 的距离 int mBottom: View下边距,即View的下边 距...

lloydfinch's trip 123

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android中getScrollX,getScrollY,getTop,getLeft的数值含义

在android的View类中,可以看到标题中的方法,scroll的坐标的含义是内容相对于组件的位置,坐标是相对于组件自己的,而getTop,getRight都是相对于父组件的坐标位置,是layout的位置,也就是当我们使用scroller来动画改变View的ScrollX,ScrollY的时候,组件相对于父组件的位置其实是不变的,改变的是组建内部内容相对于View的位置,对于TextView来说

3601

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android View的ScrollBy ScrollTo getScrollX getScrollY

代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。所以,长征路还长,大家还是好好地做个务实的程序员吧。最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!好好地做个务实的程序员吧。

2401_84009300的博客 963

Android Scroll 详解

今天,我们就来探讨一下Android中界面滚动效果的相关机制,本篇文章主要讲解一下滚动相关的知识点,之后的文章会涉及实际的代码和原理。希望大家阅读完这篇文章之后,能够了解或者掌握一下知识: Android 视图的组成部分mScrollX和mScrollY对视图显示的影响scrollTo和scrollBy的使用invalidate和postInvalidate的区别 View的mScro

乐不思书的专栏 1997

Android Scroller大揭秘

本文内容有:(1)scrollTo()、scrollBy()的讲解;(2)Scroller类的讲解。 在学习使用Scroller之前,需要明白scrollTo()、scrollBy()方法。 一、View的scrollTo()、scrollBy() scrollTo、scrollBy方法是View中的,因此任何的View都可以通过这两种方法进行移动。首先要明白的是,scrollTo、scrollBy滑动的是View中的内容(而且还是整体滑动),而不是View本身。我们的滑动控件如SrollVi

开心阳 1万+

android View的scrollTo,scrollBy方法详解

android View的scrollTo,scrollBy

zhouguizhi 5718

android View的ScrollBy ScrollTo getScrollX getScrollY,安卓高级面试题及答案

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!Android前沿技术大纲全套体系化高级架构视频Android高级架构资料、源码、笔记、视频。

2401_84149916的博客 636

Android中位置相关几个值 left right top bottom scrollX scrollY等

left top right bottom 我们知道android中的view会有四个api,分别对应着上、下、左、右四个位置,很多人都搞不清,这几个值是什么。这里简单说下 getLeft 这个view的左侧相对于父view左边的距离 getTop 这个view的上侧相对于父view上边的距离 getRight 这个view右侧相对于父view左边的距离 getBottom 这个view的底侧...

Alex Zhang的专栏 442

Android 各种坐标彻底明了

前言 本篇文章的重点是分析由Layout摆放位置引起的坐标相关知识分析。 通过本篇文章,你将了解到: 1、View坐标基础 2、常用的View获取坐标方法 1 View坐标基础 可以看出与传统的坐标系有所不同的是,屏幕的左上角作为坐标原点,X轴向右为正,Y轴向下为正。 上图分为四个层次,由内到外依次为: 第一层为触摸点MotionEvent。 第二层为View,作为第三层的子布局。 第三层为Window/RootView(根Vi...

chuyouyinghe的专栏 541

android 中view 的scroll系列方法的理解

android的view中有一系列scroll的方法。

JavaLive09的专栏 1900

scrollTo、scrollBy、getScrollX、getScrollY这4个方法的含义

推荐一款app应用——"印度爱经",木蚂蚁下载点击打开链接 源码下载地址 结合程序和图作出说明: 1、关于自定义视图继承ViewGroup中的onMeasure和onLayout是怎么实现我就不多说了,此博文主要是说明scrollTo、scrollBy、getScrollX、getScrollY这4个方法的含义。 2、整个坐标系是以手机屏幕左上角为原点,子视图的高度应该

三少爷的剑 3万+

Android中View中的scrollTo(),scrollBy(),getScrollX(), getScrollY()详解

最近在写自定义View中,被scrollTo(),scrollBy(),getScrollerX()和getScrollY()这几个值给搞晕了,经常产生混淆,因此我就花点时间写一篇博客来详细解释这几个函数的含义。   在安卓的手机的屏幕中的坐标系是这样的,左上角为坐标系,向下为y轴,向右为x轴。 srollTo(int x,int y)srollTo(int x,int y)是将View中的内容偏

NewOrin 1403
上一篇: 造作AI vs 讯飞智作:哪个更适合你的跨境内容本地化需求?
下一篇: MRtrix3实战:从DWI数据到纤维追踪的完整预处理流程(附代码)
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值