android launcher3 home页简易分析
最近在修改一个问题:就是修改home页下,用户手动拖出来的APP图片下面的字体显示不全,思路比较明确,需要尽量加大整个APP控件的高度,或者缩小图片和文字之间的间隔.
跟代码发现APP整个控件的layout由一个被成为CellLayout的layout控制,而且高度是根据屏幕剩余高度等分的,所以,加大整个控件的高度变的不现实.那么只能采取缩小图片和文字之间的间隔的方法了.
下面给出跟到整个值的过程:
首先搞明白,整个launcher并没有套用layout.xml文件来构建布局,而是通过源码自定义了许多控件,这就涉及到整个自定义空间的流程,包括属性的定义,调用和获取,onMesure,onLayout,onDraw方法的复写,这里简单提下以上3种用途和场景,onMesure方法顾名思义,主要是用来重新测量自定义控件的高度和宽度,就是设置它的dimesion,一般所有自定义VIEW都需要复写这个方法,onLayout则主要是ViewGroup需要复写这个方法,其作用给这个ViewGroup下子View布局好显示的位置,onDraw则是需要真真正正画出内容的控件需要复写的方法,比如textview,或者其子类,其最终利用一个很重要的类Canvas的对象来实现一系列的画图,比如canvas.drawcircle,canvas.drawline.
然后再讲讲home界面一个布局情况:从LauncherRootView开始,-->DragLayer-->WorkSpace-->CellLayout-->ShortcutAndWidget-->BubbleTextView.而BubbleTextView继承于TextView,是真正需要画出来的内容,而中间几个类都是自动义Layout,进行层层嵌套,所以需要都复写自己的OnMeasure方法,你就会发现堆栈结构里就是循环的在调用OnMeasure方法,同理因为这些类都是ViewGroup,所以也都需要复写onLayout方法,堆栈里也就是循环调用onLayout.分析发现,我们关心的不是它怎么画出来,而是画的时候高,宽的数据是怎么得到,自然我们不要关心Ondraw方法,甚至不需要关心OnLayout方法,因为Onlayout方法只关心位置信息,而控件的高和宽是OnMesure方法决定的,所以我们只要跟OnMesure.
于是我找到ShortcutAndWidget下的measureChild方法,其就是在ShortcutAndWidget的OnMesure方法下,只不过是封装了下而已.这个是最底层的OnMesure复写方法了,因为BubbleTextView并没有复写这个方法,因为他继承于TextView,直接调用TextView的OnMesure方法就好.而在measureChild你会发现一个很重要的类,就是DeviceProfile,看相关代码:
public void measureChild(View child) {
final LauncherAppState app = LauncherAppState.getInstance();
final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
final int cellWidth = mCellWidth;
final int cellHeight = mCellHeight;
......
}
其中对象grid 故名思议, 就是格子的意思,其中包含许多属性,用来控制以上所有提到布局和控件的位置关系,就相当于上面的布局和控件都是一个个壳,至于这些壳怎么嵌套都需要这个类的数据来提供支持.下面给出这个类一部分域:
public class DeviceProfile {
public static interface DeviceProfileCallbacks {
public void onAvailableSizeChanged(DeviceProfile grid);
}
.....
.....
int iconSizePx;
int iconTextSizePx;
int iconDrawablePaddingPx;
int cellWidthPx;
int cellHeightPx;
int allAppsIconSizePx;
int allAppsIconTextSizePx;
int allAppsCellWidthPx;
int allAppsCellHeightPx;
int allAppsCellPaddingPx;
int folderBackgroundOffset;
int folderIconSizePx;
int folderCellWidthPx;
.....
.....
}
其中红色标注的就是我们需要找的域,再来看看它是怎么得到的,可以看到在updateIconSize方法下有这样一句代码:
allAppsCellHeightPx = allAppsIconSizePx + drawablePadding + iconTextSizePx;
现在开始就很明朗了,drawablePadding 就是我们需要改的值,看看这个值是怎么来的,它是通过int drawablePadding = iconDrawablePaddingOriginalPx;赋值的来,
而全局域iconDrawablePaddingOriginalPx则是通过iconDrawablePaddingOriginalPx=res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding); 得到
所以最后我们只要找到相关的xml文件修改dynamic_grid_icon_drawable_padding这个值就行了.
本篇完结,与大家共勉.
android launcher3 home页简易分析的更多相关文章
- Web Scraper 翻页——利用 Link 选择器翻页 | 简易数据分析 14
这是简易数据分析系列的第 14 篇文章. 今天我们还来聊聊 Web Scraper 翻页的技巧. 这次的更新是受一位读者启发的,他当时想用 Web scraper 爬取一个分页器分页的网页,却发现我之 ...
- 1.Android 视图及View绘制分析笔记之setContentView
自从1983年第一台图形用户界面的个人电脑问世以来,几乎所有的PC操作系统都支持可视化操作,Android也不例外.对于所有Android Developer来说,我们接触最多的控件就是View.通常 ...
- (转)Android 系统 root 破解原理分析
现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...
- [Android]Android系统启动流程源码分析
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...
- Android PopupWindow的使用和分析
Android PopupWindow的使用和分析 PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activi ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- Android Log日志文件的分析、查看
Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 什么时候会产生log文件呢 ?一般 ...
- 第四次作业——关于石墨文档(Android)客户端的案例分析
关于石墨文档(Android)客户端的案例分析 作业地址:[https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505] 第一部分调研,评测 1. ...
- 【Orleans开胃菜系列2】连接Connect源码简易分析
[Orleans开胃菜系列2]连接Connect源码简易分析 /** * prism.js Github theme based on GitHub's theme. * @author Sam Cl ...
随机推荐
- 辉哥用的这种方法实现ZABBIX的MYSQL批量监控
不错的.集中和分布式,总是一对要解决的问题.应该可以再想更好的策略~~ 一.方案需求及思路 因跑MySQL服务的服务器比较多,并且每台服务器可能会运行多个不同端口的数据库,如果单独手动一台一台去修改a ...
- 浅谈RDD
RDD(Resilient Distributed Datasets)弹性分布式数据集,是在集群应用中分享数据的一种高效,通用,容错的抽象,是Spark提供的最重要的抽象的概念, 它是一种有容错机制 ...
- 图解linux下top命令的使用
top命令经常用来监控linux的系统状况,比如cpu.内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解. 本文通过一个运行中的 ...
- 图论(2-sat):Priest John's Busiest Day
Priest John's Busiest Day Description John is the only priest in his town. September 1st is the Jo ...
- 动态规划(斜率优化):SPOJ Commando
Commando You are the commander of a troop of n soldiers, numbered from 1 to n. For the battle ahead, ...
- <离散数学>学习笔记1--逻辑和证明
今天开始离散数学的自学旅程. 主题:逻辑和证明 逻辑规则给出数学语句的准确含义.逻辑对计算机科学有着重要作用.为了理解数学,我么必须理解正确的数学论证是由什么组成的.只要证明一个数学语句是真的,我们就 ...
- UVa1453或La4728 凸包+枚举(或旋转卡壳)
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- I - Arbitrage
题目大意:套汇 套利是使用货币汇率的差异将一个单位的货币转换为多个相同的货币单位,例如1美元可以买0.5英镑,1英镑可以买10法郎,1法郎可以买0.21美元,然后聪明的人经过一些列兑换可以得到 1*0 ...
- redis学习心得之二【redis主从配置】
在前一节我们已经实践启动了一个redis服务,我们将其作为主机,现为其创建一个从机作备份使用 1.复制一份配置出来为从机所用 ~$ cp redis/etc/redis.conf ...