Android Launcher分析-HotSeat进阶

前面已经写过Hotseat分析的文章,主要是讲解如何在Launcher里面配置以及修改Hotseat的参数。

今天主要是讲解一下如何在Hotseat里面的Item显示名称。

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

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

1.Hotseat隐藏文件夹标题

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

//Edited by mythou
//http://www.cnblogs.com/mythou/    

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也是一样,我们看看下面代码:

//Edited by mythou
//http://www.cnblogs.com/mythou/  

public void bindItems(ArrayList<ItemInfo> shortcuts, int start, int end) 
{
   //.........for (int i=start; i<end; i++)
        {
     //.........if(OWLLauncherDebug.HotSeat) Log.d("OWL_Launcher", "bindItems------->item="+item); 
              switch (item.itemType)
             {
                case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
                case LauncherSettings.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对象。

3.Item添加到Hotseat

//Edited by mythou
//http://www.cnblogs.com/mythou/  

View createShortcut(int layoutResId, 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);
        return favorite;
}

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

4.Hotseat的AllAPP按钮

//Edited by mythou
//http://www.cnblogs.com/mythou/  

void addInScreen(View child, long container, int screen, int x, int y, int spanX, int spanY,boolean insert)
 {
        if(OWLLauncherDebug.HotSeat) Log.d(OWL, "addInScreen------->screen="+screen);
        final CellLayout layout;
     //针对Hotseat的对象做特殊处理 mythou
        if (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按钮

//Edited by mythou
//http://www.cnblogs.com/mythou/  

void resetLayout() 
{
   //清空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);    
     //.........

}

5.Hotseat显示Item标题

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

转载地址:

http://www.cnblogs.com/mythou/p/3211443.html

时间: 2024-11-07 20:34:14

Android Launcher分析-HotSeat进阶的相关文章

Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置

上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html). 今天主要是说说Launcher里面图标.布局.壁纸等的设置问题.毕竟我们一般修改Launcher,这些都是需要修改的地方,也是比较容易修改的部分.按照效果图(效果图在上一篇文章),分开说明如何修改,以及里面涉及的逻辑分析. 原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3155692.h

Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)

最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文.因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于Android4.0.3的Launcher2修改.Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多.所以打算写一些分析和修改Launcher结合的文章. 原创博文,转载请标明出处:http://www.

Android Launcher 3 简单分析

最近在学习Android Launcher的相关知识,在github上找到可以在Android studio上编译的Launcher 3代码,地址:https://github.com/rydanliu/Launcher3 Launcher 3的界面主要由SearchDropTargetBar.Workspace.CellLayout.PageIndicator.Hotseat组成.如下图: Launcher 3 最主要的是一个Activity,基本上所有操作都集中在这个Activity上.这个

Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程

Android核心分析 之一分析方法论探讨之设计意图 http://www.apkbus.com/android-24212-1-1.html Android核心分析 之二方法论探讨之概念空间篇 http://www.apkbus.com/android-24213-1-1.html Android是什么 之三手机之硬件形态 http://www.apkbus.com/android-24215-1-2.html Android核心分析之四手机的软件形态 http://www.apkbus.co

Android Launcher源码结构

Launcher 是 Android手机开启后第一个运行的 应用程序,也叫Home,或者叫做手机桌面. 本文介绍的是4.1源码的launcher2 app. Android41\packages\apps\Launcher2 首先找到主Activity,打开AndroidManifest.xml  入口是  com.android.launcher2.Launcher 这个类 Launcher 主界面包含 wallpaper墙纸,work_screen屏幕, 最底部的hotseat, 以及all

android launcher

1.android_launcher的源码详细分析 2.android---launcher 3.Android 4.4 Launcher3桌面源码分析 4.通过深度剖析Android之Launcher源码设计架构,创建HomeScreen的Shortcut(快捷方式) 5.Android launcher进化 6.Android4.0 Launcher 源码分析系列(一)

Android Launcher 怎样去掉主菜单,全部应用摆在桌面,相似小米桌面

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net          雨季o莫忧离:http://blog.csdn.net/luckkof 正文 Launcher3/src/com/android/launcher3/ 1. AppsCustomizePagedView.java public static boolean DISABLE_ALL_APPS =

Android Launcher源码研究(二) 加载app流程1

今天主要分析Android Launcher源码中的一些重要类之间的关系,基本的加载流程.先来看一个类图 Launcher.java 是主Activity 在onCreate方法里面初始化了LauncherMode实例. LauncherApplication app = ((LauncherApplication)getApplication()); mModel = app.setLauncher(this); 直接进入LauncherApplication.java的方法 Launcher

android launcher开发之图标背景以及默认配置

1:然后我自己看了一下桌面图标的载入过程: 桌面第一次载入时是默认读取一个xml配置文件,完毕配置工作.这个配置文件在Launcher文件夹下, 路径是:\Launcher\res\xml\default_workspace.xml .这个XML文件就是刚升级,Launcher第 一次显示的时候,会读取的配置文件.default_workspace.xml里面能够配置APP快捷方式.Widget.Search搜索栏等 launcher里面负责解析default_workspace.xml文件的方