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 ...
随机推荐
- Unity3d 与IOS 相互调用
Unity3d 与IOS 相互调用 @灰太龙 群63438968 我用的Unity3d 4.2版本,这一节说一下IOS与U3D的交互! 首先在U3D中写个方法:这个时候导出为ios代码必须是真机,模拟 ...
- Tengine简单安装
跟NGINX一样,没有深入研究配置,因为暂时用不到..:) 下载2.10,基于NGINX1.6.2的. 我的配置参数如下: ./configure --with-openssl=/root/tengi ...
- ORACLE WIN7安装过程截图
尽管 有点不正规,但还可以.
- Git批量修改提交历史
有些时候我们可能需要批量修改提交历史,当然了,最近一次的提交历史很简单我们可以利用 git commit --amend 来进行最近一次提交的修改,如果你此时想要更新作者提交时间等也可以在amend之 ...
- 数学(逆元):BZOJ 2186: [Sdoi2008]沙拉公主的困惑
2186: [Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞 ...
- 【模拟】Codeforces 671B Robin Hood
题目链接: http://codeforces.com/problemset/problem/671/B 题目大意: N个人,每个人有Ci钱,现在有一个人劫富济贫,从最富的人之一拿走1元,再给最穷的人 ...
- socket(TCP)发送文件
一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.Componen ...
- 【解决办法】糟糕,我的电脑只有IE64位浏览器能上网,其他软件都上不了网
最近两周在三班四班有5位同学电脑7次出现网络故障,表现为能连上锐捷.DNS正常却不能上网,其中在我自己的计算机上就发生了2次.上网搜集并整理了以下资料,供大家参考.请直接参见[解决办法]. [网上 ...
- CodeForces 592B
题目链接: http://codeforces.com/problemset/problem/592/B 这个题目没啥说的,画图找规律吧,哈哈哈 程序代码: #include <cstdio&g ...
- 暴力求解——Equivalent Strings
Submit Status Description Today on a lecture about strings Gerald learned a new definition of string ...