Android之View绘制深度解析之Layout流程
[TOC]
文章参考:https://www.jianshu.com/p/95afeb7c8335
概述
Android之View绘制深度解析之Draw流程
[TOC]
文章参考:https://www.jianshu.com/p/95afeb7c8335
概述绘制View视图。类似measure过程、layout过程,draw过程根据View的类型分为2种情况:
单一View的draw过程
下面我将一个个方法进行详细分析:draw过程的入口 = draw()
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143/** * 源码分析:draw() ...
Android之View绘制深度解析之invalidate和postInvalidate
[TOC]
概述invalidate该方法的调用会引起View树的重绘,常用于内部调用(比如 setVisiblity())或者需要刷新界面的时候,需要在主线程(即UI线程)中调用该方法。那么我们来分析一下它的实现。
首先,一个子View调用该方法,那么我们直接看View#invalidate方法:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 /** * Invalidate the whole view. If the view is visible, * {@link #onDraw(android.graphics.Canvas)} will be called at some point in * the future. * <p> * This must be called from a UI thread. To ...
Android之View绘制深度解析之requestLayout
[TOC]
文章参考:https://juejin.im/post/6844903829113143303
文章参考:https://mp.weixin.qq.com/s/BeYCM6AUsJ9qzhb5_XAweQ
前言前几篇文章中,笔者对View的三大工作流程进行了详细分析,而这篇文章则详细讲述与三大工作流程密切相关的两个方法,分别是requestLayout和invalidate,如果对View的三个工作流程不熟悉的读者,可以先看看前几篇文章,以便能更容易理解这篇文章的内容。
requestLayout当我们动态移动一个View的位置,或者View的大小、形状发生了变化的时候,我们可以在view中调用这个方法,即:
1view.requestLayout();
那么该方法的作用是什么呢?
从方法名字可以知道,“请求布局”,那就是说,如果调用了这个方法,那么对于一个子View来说,应该会重新进行布局流程。但是,真实情况略有不同,如果子View调用了这个方法,其实会从View树重新进行一次测量、布局、绘制这三个流程,最终就会显示子View的最终情况。那么,这个方法是怎么实现的呢?我们 ...
Android之View绘制深度解析之mPrivateFlags字段
[TOC]
概述前面的深度解析中,我们在View执行requestlayout的布局逻辑中,有这样两行代码:
12mPrivateFlags |= PFLAG_FORCE_LAYOUT;mPrivateFlags |= PFLAG_INVALIDATED;
函数给当前View设置了两个flag:PFLAG_FORCE_LAYOUT和PFLAG_INVALIDATED
View中mPrivateFlags字段View内部有个int类型的mPrivateFlags字段,这个字段会View的整个显示流程进行控制,就相当于我们平时开发时,自定义的一系列的boolean值。
它的工作原理是位运算,这里拿PFLAG_FORCE_LAYOUT举例,通过调用mPrivateFlags |= PFLAG_FORCE_LAYOUT将mPrivateFlags的PFLAG_FORCE_LAYOUT位设置为1,不设置的情况下是0。当设置为1的时候,意味着当前View有个操作需要执行或者某项操作已经执行完了,然后设置成1标记状态。
除了PFLAG_FORCE_LAYOUT,View内部还有很多的Fl ...
面试题-为什么不能在子线程更新UI
[TOC]
概述在我们学习多线程的路上,都会听到这样一句话:
不能在子线程里更新UI,UI更新必须在UI线程中:
why?为什么不能在子线程中更新UI?如果在子线程中更新UI会怎样?
为了模拟在子线程中更新UI的场景,简单地写了几行代码:
123456789101112131415161718@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); saButton = (Button) findViewById(R.id.text); final Thread thread = new Thread(new Runnable() { @Override public void run() { ((TextView ...
Android之View的坐标系基础知识
[TOC]
文章参考:https://www.jianshu.com/p/071e04108f4d
概述
可以看出与传统的坐标系有所不同的是,屏幕的左上角作为坐标原点,X轴向右为正,Y轴向下为正。
上图分为四个层次,由内到外依次为:
第一层为触摸点MotionEvent
第二层为View,作为第三层的子布局
第三层为Window/RootView(根View的尺寸与Window尺寸一致),作为第二层的父布局,也是作为整个ViewTree的根布局
第四层为屏幕
基础概念讲解触摸点(MotionEvent)坐标
上图红色部分为触摸点坐标相关的。
getX()、getY()获取的坐标是相对于其所在的View,相对于View的左上角
getRawX()、getRawY()获取的坐标是相对于整个屏幕的,相对于屏幕的左上角
对于同一个坐标点(getRawX()/getRawY()相同),在不同的View里,getX()、getY()可能不同:
黑色箭头是触摸点在View1里的getX()/getY()。
蓝色箭头是触摸点在View2里的getX()/g ...
Android之Bitmap的基础知识学习
[TOC]
文章参考:https://www.jianshu.com/p/98c88f9ceafa
https://juejin.im/entry/59b6419d5188257e82675716
https://juejin.im/post/5b03b38af265da0b796535dd
App开发不可避免的要和图片打交道,由于其占用内存非常大,管理不当很容易导致内存不足,最后OOM,图片的背后其实是Bitmap。Bitmap在Android中指的是一张图片,可以是png,也可以是jpg等其他图片格式。它是Android中最能吃内存的对象之一,也是很多OOM的元凶。所以,用好Bitmap对Android开发者来说就显得比较重要了。也是我们应用性能优化的至关重要的一环。
例如:使用Pixel手机拍摄4048x3036像素(1200W)的照片,如果按ARGB_8888来显示的话,需要48MB的内存空间(404830364 bytes),这么大的内存消耗极易引发OOM。
Bitmap的基本使用Bitmap的加载离不开BitmapFactory类,关于Bitmap官方介绍Creates B ...
Android的View之ViewTreeObserver源码解析
[TOC]
文章参考:https://blog.csdn.net/whoami_I/article/details/102805969
概述先说ViewTreeObserver是什么?
ViewTreeObserver 是被用来注册监听视图树的观察者,在视图树发生全局改变时将收到通知。本文从 ViewTreeObserver 源码出发,带你剖析 ViewTreeObserver 的设计及使用,并间接体会观察者模式、Android消息传递机制在其中的使用。
我们怎么去理解ViewTreeObserver呢?
ViewTreeObserver,拆开来理解就是 ViewTree 和 Observer。
ViewTree 就是我们常说的视图树,在Android中,所有视图都是由View及View的子类构成,ViewGroup 也是View的子类,它可以装载View或者ViewGroup,这样,一层层嵌套,就有了视图树的概念。
Observer 即观察者的意思,其对应的观察者模式是软件设计模式的一种,在许多编程语言中被广泛运用。其核心在于:一个目标对象,我们称之为被观察者(Observable) ...
Android系统View之GLSurfaceVIew学习
[TOC]
文章参考:https://zhuanlan.zhihu.com/p/271270354
文章参考:https://zhuanlan.zhihu.com/p/145331514
概述Android对OpenGL这块封装是非常好的,也是非常隐蔽的,一般使用者直接使用GLSurfaceView即可达到需求。最近项目中将很多功能下层到c++层,这样必须对OpenGL 底层逻辑有所了解。Android虽然提供OpenGL 各个版本的So库,但是并没有对底层api做封装,所以如果是自己想用C++写OpenGL,最好的方式学习Android源码。
GLSurfaceView使用12345678910111213surfaceView = findViewById(R.id.triangle_api_surfaceView)surfaceView.setEGLContextClientVersion(3) surfaceView.setRenderer(object : GLSurfaceView.Renderer { override fun onSurfaceCreat ...