最近在修改一个问题:就是修改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页简易分析的更多相关文章

  1. Web Scraper 翻页——利用 Link 选择器翻页 | 简易数据分析 14

    这是简易数据分析系列的第 14 篇文章. 今天我们还来聊聊 Web Scraper 翻页的技巧. 这次的更新是受一位读者启发的,他当时想用 Web scraper 爬取一个分页器分页的网页,却发现我之 ...

  2. 1.Android 视图及View绘制分析笔记之setContentView

    自从1983年第一台图形用户界面的个人电脑问世以来,几乎所有的PC操作系统都支持可视化操作,Android也不例外.对于所有Android Developer来说,我们接触最多的控件就是View.通常 ...

  3. (转)Android 系统 root 破解原理分析

    现在Android系统的root破解基本上成为大家的必备技能!网上也有很多中一键破解的软件,使root破解越来越容易.但是你思考过root破解的 原理吗?root破解的本质是什么呢?难道是利用了Lin ...

  4. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  5. Android PopupWindow的使用和分析

    Android PopupWindow的使用和分析 PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activi ...

  6. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  7. Android Log日志文件的分析、查看

    Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 什么时候会产生log文件呢 ?一般 ...

  8. 第四次作业——关于石墨文档(Android)客户端的案例分析

    关于石墨文档(Android)客户端的案例分析 作业地址:[https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505] 第一部分调研,评测 1. ...

  9. 【Orleans开胃菜系列2】连接Connect源码简易分析

    [Orleans开胃菜系列2]连接Connect源码简易分析 /** * prism.js Github theme based on GitHub's theme. * @author Sam Cl ...

随机推荐

  1. Qt如何去掉按钮等控件的虚线框(焦点框)(三种办法)

    方法1:可以通过代码ui->pushButton->setFocusPolicy(Qt::NoFocus)或在Qt Creator的属性列表中设置. 方法2:如果在嵌入式设备中需要通过按键 ...

  2. html 商品展示框

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. MySql的大小写问题

    原来Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:1.用root登录,修改 /etc/my.cnf:2.在[mysqld]节点下,加入一行: lowe ...

  4. 用 SQL 脚本读取Excel 中的sheet数量及名称

    -- Get table (worksheet) or column (field) listings from an excel spreadsheet -- 设置变量 declare @linke ...

  5. c++实现委托

    #include "stdafx.h" #include <iostream> #include <string> using namespace std; ...

  6. bzoj2561

    对于新加入的边,必须要既可能在最小生成树上也可能在最大生成树上我们先对于最小生成树考虑根据kruskal的理论,不难发现,u--v 长度为L的边可能出现在最小生成树上就是说删边剩下的比L小的边一定不能 ...

  7. Codeforces 715B & 716D Complete The Graph 【最短路】 (Codeforces Round #372 (Div. 2))

    B. Complete The Graph time limit per test 4 seconds memory limit per test 256 megabytes input standa ...

  8. a为整型数组,&a+1的含义

    #include <stdio.h> int main() { int a[10]; printf("a的值为:\t%d\n",a); printf("&am ...

  9. 动态规划——树形dp

    动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...

  10. POJ 1861 Network

    题意:有n个点,部分点之间可以连接无向边,每条可以连接的边都有一个权值.求一种连接方法将这些点连接成一个连通图,且所有连接了的边中权值最大的边权值最小. 解法:水题,直接用Kruskal算法做一遍就行 ...