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 ...
随机推荐
- 【转】JQUERY相关的几个网站
作者:Terry li - GBin1.com 1. John Resig - http://ejohn.org 毫无疑问,jQuery 的缔造者的博客是你首先必须关注的. 2. Filmament ...
- Dll方式的线程,需要引用这个
{== D6DLLSynchronizer =================================================} {: This unit handles the D6 ...
- JAVA循环结合标签使用,控制跳转
public static void main(String[] args) { outer: for (int i = 0; true; i++) { inner: for (int j = 0; ...
- HDU 4283 You Are the One
题意:给定n(n<=100)个人,每个人有个固定的屌丝值D. 起初这些人是站成一行,当第i个人第j个去面试的时候他的值是 Di*j. 要求所有人面试之后 这些值加起来是最小的. 队伍站成一行(其 ...
- MFC UpdateData(true) 失败原因
关于MFC UpdateData的介绍SurpassLi博主在http://www.cnblogs.com/lidabo/archive/2012/07/17/2595464.html 已经介绍的很 ...
- 蘑菇街 App 的组件化之路
在组件化之前,蘑菇街 App 的代码都是在一个工程里开发的,在人比较少,业务发展不是很快的时候,这样是比较合适的,能一定程度地保证开发效率. 慢慢地代码量多了起来,开发人员也多了起来,业务发展也快了起 ...
- @protocol 和 category 中如何使用 @property
出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙(子循),目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 在 protocol 中使用 prop ...
- CentOS虚拟机不能联网状况下yum方式从本地安装软件包(转载的)
大家都知道yum是linux下一个非常好用的软件安装/卸载软件,它方便操作,而且最厉害的是可以解决令人头疼的包依赖关系.但是若是你的linux不能联网,若想使用yum安装软件,可以依照下面的方法. 1 ...
- SunTlsRsaPremasterSecret KeyGenerator not available问题解决
本地Idea测试可以,部署到开发环境遇到下面的问题: javax.net.ssl.SSLKeyException: RSA premaster secret error at com.sun.net. ...
- mybatis logback打印sql
<?xml version="1.0" encoding="UTF-8" ?><configuration> <contextNa ...