前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数。今天主要是讲解一下如何在Hotseat里面的Item显示名称。这个小问题昨天折腾了半天,最后幸亏我亲爱的女朋友大人提醒了我,才想到原因。在此十分感谢我女朋友大人的提醒,幸好她不是做程序员,不然我就要失业了O(∩_∩)O哈哈~

(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)

默认Hotseat里面的元素都没有标题

1、Hotseat隐藏文件夹标题

刚开始想解决这个问题的想法是找到按钮对象生成的地方,修改一下就好了。因为我上次分析Hotseat的时候,记得有一个地方把Hotseat的按钮文字屏蔽了,我想只要打开就好。

if (container ==LauncherSettings.Favorites.CONTAINER_HOTSEAT)

{if(OWLLauncherDebug.HotSeat) Log.d(mythou, "addInScreen------->CONTAINER_HOTSEAT");

layout=mLauncher.getHotseat().getLayout();

child.setOnKeyListener(null);//隐藏Hotseat里面文件夹的名称

if(child instanceof FolderIcon)

{((FolderIcon) child).setTextVisible(false);

}//.........

}

上面这段代码是在Workspace里面addInScreen()的部分代码,是绑定workspace元素的时候调用的方法,里面的确有一个判断是否隐藏文件夹的名称,但是没看到隐藏普通快捷方式的代码。我先把文件夹标题隐藏的功能去掉,但是hotseat里面的文件夹还是没有名称。没办法,只能从头看看Hotseat上面那些快捷方式如何添加和加载。

2、Hotseat上Item如何生成

Hotseat上面的快捷方式可以分为两种,一种是普通快捷方式,可以在default_workspace里面配置。另外一个是全部应用列表的按钮,这个实在Hotseat.java里面动态生成的。我们先看看普通的快捷方式如何生成,一般的快捷方式,通过加载default_workspace,这个过程跟workspace上面的按钮一样,前面已经有详细分析,这里不多说。我们主要看看如何生成快捷方式的对象,其实这个跟workspace也是一样,我们看看下面代码:

public void bindItems(ArrayList shortcuts, int start, intend)

{

//.........for (int i=start; i

{

//.........if(OWLLauncherDebug.HotSeat) Log.d("OWL_Launcher", "bindItems------->item="+item);switch(item.itemType)

{caseLauncherSettings.Favorites.ITEM_TYPE_APPLICATION:caseLauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:

//生成Item的View对象

View shortcut=createShortcut((ShortcutInfo)item);

//添加到对应的screen里面

workspace.addInScreen(shortcut, item.container, item.screen, item.cellX,

item.cellY,1, 1, false);break;}

}

}

上面是Launcher里面的bindItems()方法的部分代码,bindItems()这个方法,看过我前面分析Launcher数据加载的朋友应该不会陌生,这是绑定Launcher数据时候Launcher回调的一个方法,Hotseat的Item对象就在这里生成。调用了createShortcut()方法,下面我们看看createShortcut()是如何生成Item对象。

View createShortcut(intlayoutResId, ViewGroup parent, ShortcutInfo info)

{if(OWLLauncherDebug.HotSeat) Log.d("OWL_Lancher", "addInScreen------->info="+info);

//生成Item的快捷方式,Hotseat里面的按钮也是BubbleTextView

BubbleTextView favorite= (BubbleTextView) mInflater.inflate(layoutResId, parent, false);

favorite.applyFromShortcutInfo(info, mIconCache);

favorite.setOnClickListener(this);

returnfavorite;

}

从这里可以看出,其实Hotseat里面的按钮也是BubbleTextView的对象,也就是跟一般的workspace里面的按钮一样。对象生成以后会添加到对应的Screen里面。前面Hotseat的文章我也说过,Hotseat其实也是一个CellLayout的screen。在程序里面是标记为最后一个screen。

3、Item添加到Hotseat

void addInScreen(View child, long container, int screen, int x, int y, int spanX, intspanY,

boolean insert)

{if(OWLLauncherDebug.HotSeat) Log.d(OWL, "addInScreen------->screen="+screen);final CellLayout layout;

//针对Hotseat的对象做特殊处理 mythouif (container ==LauncherSettings.Favorites.CONTAINER_HOTSEAT)

{if(OWLLauncherDebug.HotSeat) Log.d(OWL, "addInScreen------->CONTAINER_HOTSEAT");

layout=mLauncher.getHotseat().getLayout();

child.setOnKeyListener(null);//隐藏Hotseat文件夹标题

if(child instanceof FolderIcon)

{//((FolderIcon) child).setTextVisible(false);

}if(OWLLauncherDebug.HotSeat) Log.d(OWL, "addInScreen------->CONTAINER_HOTSEAT screen="+screen);if (screen < 0)

{

screen=mLauncher.getHotseat().getOrderInHotseat(x, y);

}else{//获取child的位置,返回true添加成功,false失败 这里其实是Hotseat里面Item的位置

x =mLauncher.getHotseat().getCellXFromOrder(screen);

y=mLauncher.getHotseat().getCellYFromOrder(screen);

}if(OWLLauncherDebug.HotSeat) Log.d(OWL, "addInScreen-------> x="+x + "y="+y);

}

}

上面就是把Hotseat里面元素添加到Hotseat对应的CellLayout里面去,里面有一部分针对Hotseat元素的特殊处理,也就是刚开始说的隐藏文件夹标题以及技术元素位置的代码。除了这些,我并没有找到隐藏按钮文字的方法。后来只能看看Hotseat里面另外一个按钮(AllAPP)能不能显示文字。

4、Hotseat的AllAPP按钮

voidresetLayout()

{

//清空Hotseat里面所有的元素

mContent.removeAllViewsInLayout();//添加ALLAPP按钮

Context context =getContext();

LayoutInflater inflater= LayoutInflater.from(context);//修改为自己定义的button配置application, mythou

BubbleTextView allAppsButton =(BubbleTextView)

inflater.inflate(R.layout.application, mContent,false);

//设置allapp按钮的图片

allAppsButton.setCompoundDrawablesWithIntrinsicBounds(null,

context.getResources().getDrawable(R.drawable.all_apps_button_icon),null, null);

allAppsButton.setText(context.getString(R.string.all_apps_button_label));

allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));int width =allAppsButton.getWidth();int heigh =allAppsButton.getHeight();

Log.d("OWL_HOTSEAT", "allAppsButton width="+width+"heigh="+heigh);

//.........

}

上面是Hotseat.java里面的resetLayout()方法,前面也说了Hotseat里面的按钮分为两种,其中AllAPP按钮是代码里面生成的。最后也是调用addViewToCellLayout()方法,addViewToCellLayout()是CellLayout里面的方法,跟前面一样,会添加到CellLayout里面。

5、Hotseat显示Item标题

前面说了半天都没说到如何修改显示标题。其实这个说起来很简单,Hotseat里面的元素,每个都保存了Item的标题,我还特意把数据打印出来看了,因为刚开始以为系统直接把标题数据删除了。之所以没有显示出来是因为Hotseat设置的高度太低,导致标题部分显示被屏蔽了,很实用也很囧的方法。另外可能会有人要问,既然从显示空间上限制了,为何还要加个判断文件夹标题隐藏?这个问题答案,只要你看看文件夹高度就知道了,自己实践一下才能印象深刻。

我对Launcher的分析也有一段时间了,不过现在看来对这个程序还不了解,后面还是多花点时间,达到能随心所欲地修改才行!最后谢谢女朋友大人给我提醒,让我省了不少时间,O(∩_∩)O哈!

系列文章:

Edited by mythou

android launcher分析和修改10,Android Launcher分析和修改10——HotSeat深入进阶相关推荐

  1. android 壁纸改变回调,Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换...

    已经好久没更新Launcher系列文章,今天不解析源码,讲讲如安在Launcher里面添加桌面设置的功能.今朝很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

  2. Android Activity的启动流程分析:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互

    文章目录 一. Step1 - Step 11:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity: Step 1. Laun ...

  3. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  4. Android系统默认Home应用程序(Launcher)的启动过程源码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还须要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  5. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用启用普通安卓应用 | 应用进程分析 )

    文章目录 一. Launcher 应用 startActivitySafely 方法分析 二. Launcher 中的 startActivity(View v, Intent intent, Obj ...

  6. 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | Launcher 应用简介 | Launcher 应用源码简介 | Launcher 应用快捷方式图标点击方法分析 )

    文章目录 一. Launcher 应用简介 二. Launcher 应用源码简介 三. Launcher 图标点击方法分析 一. Launcher 应用简介 Launcher 应用 : Android ...

  7. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)

    Step 10.  ActivityManagerService.systemReady 这个函数是在上面的Step 6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才 ...

  8. 微软android桌面壁纸,微软桌面(com.microsoft.launcher) - 6.210402.0.960830 - 应用 - 酷安

    权限信息 · com.microsoft.launcher.permission.SETTINGS_ACCESS · android.permission.FOREGROUND_SERVICE · c ...

  9. Android 如何将定制的Launcher成为系统中唯一的Launcher

    如果你要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自己的Home,而且不希望用户安装的Launcher来替换掉你的Launcher. 我们可以通 ...

  10. Android Settings和SettingsProvider源码分析与修改,android开发计算器界面

    Resume函数: @Override public void onResume() { super.onResume(); PreferenceGroup parentPreference = ge ...

最新文章

  1. 全部python编程语言-可以用 Python 编程语言做哪些神奇好玩的事情?
  2. 数据库性能优化的误区!
  3. JAVA基本数据类型和引用数据类型的参数传递详解
  4. SAP Spartacus ng serve 之后,localhost 4200 会后面自动添上 electronics-spa 吗?
  5. 资深开发者们是如何读书的?---线下读书会记录
  6. SQL日期时间格式自由转换大全
  7. 分布式服务框架XXL-RPC
  8. java JDBC 连接数据库查询数据与直接使用sql的疑问
  9. C++_类和对象_C++继承_继承的方式_公共继承_保护继承_私有继承---C++语言工作笔记062
  10. ELasticSearch安装使用过程中遇到的坑的解决方案,以及使用Kibana操作ELasticSearch
  11. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节
  12. 一种基于linux系统的精准流量统计方法
  13. 目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能
  14. 大三计算机保研er现在还能参加哪些竞赛?
  15. 经营者购买餐饮商铺需要注意些什么
  16. python操作mysql数据库练习
  17. 每个人都需要良好的人生观、价值观、职业观
  18. KEPWare使用中的遇到的问题
  19. Smart200与200PLC转以太网无需编程实现以太网数据交换
  20. SQL SERVER索引原理及填充因子

热门文章

  1. Python问题记录:如何处理中文网页中的多余空格
  2. PushMe(交互式)
  3. 通过ActiveX执行文件
  4. 关于自绘CListBox的一些疑惑
  5. 一文看懂数据挖掘:哪一种方法最好?都需要哪些技术?
  6. STM32之RCC原理
  7. 9名程序员被抓!这次我并不同情他们!
  8. 微盟耗时 145 个小时弥补删库,血亏 1.5 亿元!
  9. 一个命令,让你的网站支持https
  10. 如何打造一支有超强战斗力的技术团队?