浅析Android View(一)

Android开发艺术探索(任玉刚)PDF 《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然可以从《Android开发艺术探索》的知识体系中获益。 作译者 任玉刚,百度公司Android高级工程师,硕士毕业于中国科学技术大学,在优快云发表多篇高质量的技术文章并广获好评,并多次在GitHub上提交开源项目,先后在腾讯、创新工场和百度从事Android开发,目前在百度公司参与百度手机卫士的开发工作。(仅供学习参考使用) 立即下载

Android中的View是Android开发中一个非常重要的知识点,系统提供的基础控件TextView,Button,ListView,ViewGroup等都是基于View。但是很多时候的UI效果,利用系统的提供的基本组件无法满足我们的需求,这时候就需要我们自己自定义组件,然而想要随心所遇的写出满足我们需求的组件,却不是那么容易,但也没大家想象的那么难,只要我们掌握的View的基本原理和相关知识,我们就能随心所欲的写出自己的想要的控件效果。
一、View的位置信息
View就像我们app的衣服(这个比喻或许有些不太恰当,View的作用远不与此),我们首先要搞清楚View的相关位置信息,超人的内裤外穿可不是所有人都能hold住的。我先来看View的四个基本位置信息left、right、top、bottom
这里写图片描述
View提供了分别提供了getLeft()、getRight、getRight()、getBottom()四个方法获取对于的信息。除此之外3.0之后View还提供了四个比较重要的位置参数信息,X、Y、translationX、translationY,和基本位置信息一样,也提供了get/set方法。接下来我们就详细分析一下几个参数的作用。
先来说下left、top、bottom、right,在任玉刚《Android开发艺术探索中》是这样描述的:View的位置信息主要由它的四个顶点来决定(这句话有待分析,下面会再讲到),分别对应于View的四个属性:top、left、right、bottom,其中top和left是View的左上角坐标,right和bottom是右下角坐标。这些坐标都是相对于父容器来说的,因此说它是一种相对坐标。这里图上也标注出来了,应该不难理解。
X、Y也比较好理解,是View左上角在父容器中的坐标(在View没有平移的情况下X=left,Y=top)。
translationX,translationY则是View当前位置相对于初始化位置的偏移量,也就是说,如果你的View创建之后,没有进行过相关平移操作,translationX和translationY的值是始终为0的。
我们说回上面提到的那个问题,“View的位置信息主要由它的四个顶点来决定left、top、bottom、right”,为什么说这句话有问题呢?我们来看一段代码

    private void initViews() {
        tvTest = (TextView) findViewById(R.id.tv_test);
        tvTest.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        print();
        tvTest.setX(100);
        System.out.println("==============");
        print();

    }
    private void print() {
        int width = tvTest.getWidth();
        int height = tvTest.getHeight();
        float translationX = tvTest.getTranslationX();
        float translationY = tvTest.getTranslationY();
        float x = tvTest.getX();
        float y = tvTest.getY();
        int left = tvTest.getLeft();
        int top = tvTest.getTop();
        int bottom = tvTest.getBottom();
        int right = tvTest.getRight();

        System.out.println("width" + width);
        System.out.println("height" + height);
        System.out.println("translationX" + translationX);
        System.out.println("translationY" + translationY);
        System.out.println("x" + x);
        System.out.println("y" + y);
        System.out.println("left" + left);
        System.out.println("top" + top);
        System.out.println("bottom" + bottom);
        System.out.println("right" + right);
    }

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/tv_test"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_marginLeft="100dp"
        android:layout_marginTop="100dp"
        android:background="#00ff00"
        android:text="@string/hello_world" />

</RelativeLayout>

代码很简单,实例化一个View控件,添加一个点击事件,打印出初始化时的位置坐标信息,修改View的X值,再次打印View的位置信息,打印结果如下:
这里写图片描述
运行结果View位置发生了改变,然而top、left、right、bottom的值并未发生改变,仅仅只是translationX和X的值发生了变化。
总结:对于初学者个人建议,可以简单理解这几个参数,top、left、right、bottom主要负责View大小的控制,通过源码可以看到

     public final int getWidth() {
        return mRight - mLeft;
    }
     public final int getHeight() {
        return mBottom - mTop;
    }

View的宽高是有top、left、right、bottom参数决定的
而X,Y和translationX,和translationY则负责View位置的改变。

Android开发艺术探索.任玉刚(带详细书签).pdf 本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 1.2.2 Activity的Flags 27 1.3 IntentFilter的匹配规则 28 第2章 IPC机制 35 2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC方式 61 2.4.1 使用Bundle 61 2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 4.3.3 draw过程 197 4.4 自定义View 199 4.4.1 自定义View的分类 200 4.4.2 自定义View须知 201 4.4.3 自定义View示例 202 4.4.4 自定义View的思想 217 第5章 理解RemoteViews 218 5.1 RemoteViews的应用 218 5.1.1 RemoteViews在通知栏上的应用 219 5.1.2 RemoteViews在桌面小部件上的应用 221 5.1.3 PendingIntent概述 228 5.2 RemoteViews的内部机制 230 5.3 RemoteViews的意义 239 第6章 Android的Drawable 243 6.1 Drawable简介 243 6.2 Drawable的分类 244 6.2.1 BitmapDrawable 244 6.2.2 ShapeDrawable 247 6.2.3 LayerDrawable 251 6.2.4 StateListDrawable 253 6.2.5 LevelListDrawable 255 6.2.6 TransitionDrawable 256 6.2.7 Ins 立即下载

相关推荐

无人机飞控传感器全解析:从IMU到光流传感器的实战应用

本文深入解析了无人机飞控系统的核心传感器,从IMU、气压计、磁力计到光流传感器,详细阐述了其工作原理、数据融合策略及常见挑战。结合ICF5、Pixhawk 6C等主流飞控硬件,提供了从传感器校准、滤波器调优到应对室内光流定位、强磁干扰等实战场景的系统性优化指南,帮助开发者突破飞控“黑箱”,实现更稳定、可靠的飞行控制。

weixin_28396629的博客 170

Android View绘制流程

前言     在学习安卓的时候免不了和布局文件打交道,一直都想弄清楚内部究竟是个什么原理,于是有了这篇文章。     这篇文章形成与多个大神的文章集和,算是帮大家简单过滤一下关键信息,相信看完后能够基本上了解绘制流程是个什么样子。(无安卓基础的话可能有点难懂hhh) View绘制流程     View 的绘制流程分为三步:在自定义View的时候一般需要重写父类的onMeasure()、onLayout()、onDraw()三个方法,来完成视图的展示过程。当然,这三个暴露给开发者重写的方法只不过是整个绘制流程

weixin_41607932的博客 1万+

KEIL MDK实战:如何用fromelf工具解析STM32的ELF文件结构(附完整命令行)

本文详细介绍了如何使用KEIL MDK中的fromelf工具解析STM32的ELF文件结构,包括内存段分析、符号表追踪和反汇编关键函数等实战技巧。通过完整的命令行示例,帮助嵌入式开发者优化内存占用、排查运行时问题,并提升STM32项目的开发效率。

weixin_42631411的博客 188

Android :安卓学习笔记之 Android View绘制 的简单理解和使用

Android View的简单理解和使用Android View参考 Android View 参考 1、Android View详解 2、教你搞定Android自定义View 3、每日一问(十九)请描述一下View的绘制流程

JMW1407的博客 2632

采用离散模型搭建永磁同步电机控制系统

永磁同步电机发电系统分为控制器和发电机,通过simulink仿真软件进行发电系统的离散系统仿真。离散搭建仿真,可以更方便的自动代码生成。通过实践经验离散模块搭建,更能加深对整个控制系统的理解。离散系统在矢量控制中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,可以通过离散系统进行仿真,大大缩短开发周期。

f1072239934的博客 2863

手把手教你理解瑞萨RH850芯片的HSM:从硬件隔离到软件中断通信

本文深入解析瑞萨RH850芯片的HSM架构,从硬件隔离到软件中断通信的完整实现。通过详细讲解HSM的硬件组件、启动流程、核间通信机制及安全服务实现,帮助开发者掌握芯片级安全技术,提升汽车电子和工业控制领域的安全防护能力。

weixin_33925615的博客 381

Android应用开发(4)视图布局基本属性

本章介绍视图(View)的基本概念及其用法,包括:如何设置视图的宽度和高度,如何设置视图的外部间距和内部间距,如何设置视图的外部对齐方式和内部对齐方式等。

zsyf33078的专栏 3658

STM32使用HAL库实现ModbusRTU主站核心要点

深入解析STM32如何利用HAL库高效实现ModbusRTU主站通信,重点讲解串口配置、定时控制与modbusrtu协议帧的构建方法,提升嵌入式通信稳定性与实时性。

weixin_42668301的博客 374

Android 中view的解释

view是所有控件的父类,他的位置主要由他的四个顶点来决定。分别对应view的四个基本属性:left,top,right,bottom。其中top是左上角纵坐标,left是左上角的横坐标,right右下角的横坐标,bottom右下角的纵坐标。这些坐标都是相对于view的父控件来说的,因此它是一种相对坐标。在Android系统中,x轴和y轴的方向分别是向右和向下的          。

qq_28273051的博客 1161

画个板子玩一玩STM32F030F4P6,也许是最便宜的32bit MCU

前言,什么是STM32F030F4P6 STM32目前最便宜的芯片之一应该就是这一块,STM32F030F4P6,这一个芯片没有USB,但是其他都有,引脚少,价格低廉,如果找不到原厂,可以买替代的国产芯片,性能也一样。 不管怎么样也是Cortex-M0,比8bit和16bit的性能都强,总的来说就是低价,引脚少,体积小的同时,还容易开发,有很多模拟输入可玩,还有SPI,硬件I2C等等 所以,这一款MCU真的是从理论来说又便宜又好用,非常适合把玩。 画个板,最小系统 STM32F030其..

arenascat的博客 2万+

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

【Android】自定义View的位置参数

1.引言View是Android中所有控件的基类,不管是简单的Button和TextView,还是复杂的RelativeLayout和ListView,其基类都是View类;ViewGroup也继承了View类,这意味着View本身就可以代表简单的和复杂的所有控件和布局,通过这种关系,就形成了View树的结构。  在操作View的时候,尤其是在处理自定义View的一些事件的时候,我们往往需要获取到...

博学之,审问之,慎思之,明辨之,笃行之... 1673

D16: OpenClaw + Notion API:知识管理新玩法

本文介绍了如何利用OpenClaw连接Notion API构建自动化知识管理系统。文章首先分析了传统知识管理的痛点,包括信息分散、更新不及时等问题,并对比了Notion与其他工具在API完整性、结构化程度等方面的优势。接着详细说明了Notion API的获取和授权流程,并设计了包含项目知识库、技术决策库和会议纪要库的三层架构系统。最后通过会议纪要自动归档的实战案例,展示了如何通过YAML配置实现从飞书会议到Notion的自动化知识沉淀流程。该方案能有效解决团队知识管理中的信息碎片化问题,提升协作效率。

刘一说的IT专栏 276

Android高级进阶之路【一】Android中View绘制流程浅析

前言 一个View,从无到有会走三个流程,也就是老生常谈的measure,layout,draw三流程; 我们都知道Android视图是由一层一层构成的层级结构,直白点说,就是父View包含子View而子View又可以包含子View。所以绘制流程是由最外层的View开始,一步一步向内传递执行。而整个过程又是递归等待的,最外层的View需要等内层所有的View执行完绘制流程才结束,所以便有了”减少布局层级,可以有效提升App性能”这一经典总结。 正文 什么时候开始绘制? 而万物有始才有终,你不惹他,他也不会动

大模型训练 496

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

浅析Android动画(一) View动画高级实例探究

作者:布鲁克林一棵树 转载地址:http://www.cnblogs.com/wondertwo/p/5295976.html 视图动画的基本用法 提起 Android 动画很多初学者就会一脸懵逼二阶茫然,当初翻遍图书馆的一大堆入门书籍都找不到一本书在讲 Android 动画机制,好在一颗痴迷技术的心让我自备燃料有始有终,最后总算弄明白了 Android 动画到底是个

Dior_DNA的博客 1162

WINCC7.3破解文件

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

【转】浅析Android动画(一),View动画高级实例探究

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34044273的博客 635

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

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

浅析Android动画(一),View动画高级实例探究

转载请注明出处!http://www.cnblogs.com/wondertwo/p/5295976.html 视图动画的基本用法 提起 Android 动画很多初学者就会一脸懵逼二阶茫然,当初翻遍图书馆的一大堆入门书籍都找不到一本书在讲 Android 动画机制,好在一颗痴迷技术的心让我自备燃料有始有终,最后总算弄明白了 Android 动画到底是个什么鬼。其实我们有木有经常用手机拍了很多漂亮...

weixin_30613727的博客 77

浅析Android View(二)

深入理解Android View(一) View的位置参数信息 二、View的绘制过程 View的绘制过程一共分为三个部分: - measure(测量View的大小) - layout(确定View的位置) - draw(画出View) 通常我们的View都是以这样的树结构呈现的,如下图 当然我们这里ViewGroup其实上面其实是放在DecorView中的

源码有毒的专栏 3115

Android View原理浅析——View的工作原理

Android View原理浅析——View的工作原理 下图是Android的UI管理系统的层级关系。 PhoneWindow是Android系统中最基本的窗口系统,继承自Windows类,负责管理界面显示以及事件响应。它是Activity与View系统交互的接口 DecorView是PhoneWindow中的起始节点View,继承于View类,作为整个视图容器来使用。用于设置窗口属性。它本质...

N0tExpecterr0r的博客 1万+

浅析Android View的测量布局流程

从测量流程的分析中,总结出自定义View需要注意的事项:自定义View的从上面的源码分析中可以得知,onMeasure的默认实现是将等同于进行处理,因此自定义View时需要注意对这种情况的处理。解决办法是通过对onMeasure方法进行重写,实现对模式的特殊处理,即判断布局参数是否为,是的话则调用方法并传入具体数值。自定义View的padding参数通过上面源码的分析可以知道,容器类型的View比如都会通过ViewGroup的方法将自身的padding和子View的margin。

boker_han的博客 1355

【Android】浅析View.post()

View.post()能够获取视图宽高的核心原理在于任务执行的时机控制。当View尚未附着到窗口时(mAttachInfo为null),任务会被暂存在HandlerActionQueue中;一旦View完成附着(dispatchAttachedToWindow被调用),这些任务会通过主线程Handler执行,此时视图已完成测量布局流程,因此能够获取准确宽高。

2301_79344902的博客 1486

浅析Android View的软件绘制流程

前言 在《浅析Android中View的测量布局流程》中分析到,VSYNC信号到达App进程之后开启了View布局过程,经过对整个View树遍历完成测量和布局,最终确定所有View的大小以及在屏幕中所处的位置。但是View的内容想要在屏幕上可见,还需要经过绘制渲染来生成图形数据并交由硬件来刷新屏幕才可以。 在《浅析Android View绘制过程中的Surface》中分析到,View绘制渲染生成的图形数据需要在进程间传输,最终才能完成合成上屏。基于跨进程的数据传输,生产者(通常是App进程)生产图形数据并交

boker_han的博客 1525

浅析Android中View的硬件绘制流程

硬件绘制在主线程主要负责记录绘制命令并同步绘制命令,而软件绘制则是在主线程完成绘制命令的处理,生成最终的数据;硬件绘制通过RenderNode记录当前View是否需要重新构建来减少不必要的绘制处理,而软件绘制则会对所有View重新进行绘制;硬件绘制引入渲染线程降低主线程的压力,软件绘制则是在主线程完成所有的绘制命令处理;下面给出了梳理后的硬件绘制的主要结构图,用于帮助整体上理解和掌握硬件绘制流程。

boker_han的博客 1589

Android View原理浅析——View的事件体系

Android View原理浅析——View的事件体系 View是什么 首先我们需要理解什么是View。View是安卓中所有控件的基类,无论是简单的TextView、Button,还是复杂的LinearLayout、ListView,它们的共同基类都是View,ViewGroup其实也是继承了View。Button是一个View,而LinearLayout是View的同时也是ViewGroup,V...

N0tExpecterr0r的博客 413

浅析Android View绘制过程中的Surface

首先,当App进程的View的测量数据发生变化时,会导致窗体大小发生变化,此时会调用请求进程的更新窗体的大小,进程通过创建Java层的对象,对应App进程中Java层的对象;进程创建的Java层的对象是一个壳,其内部会通过JNI调用到native层,创建native层的对象,并将native层的对象的句柄值拷贝到App进程的对象;在native层的对象创建的过程中会通过请求到进程,调用创建Layer对象,并将Layer对象的关键信息返回给进程,并用于构造native层的对象;接着,当App。

boker_han的博客 1577

【Android】浅析View的事件分发机制

《Android 进阶之光》学习笔记

LiuYaoheng的博客 1189
上一篇: Android获取View宽高的几种方式
下一篇: Google的Java编程风格指南(Java编码规范)
coley-wu
博客等级 码龄12年 859粉丝 112原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值