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

上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html)。

    今天主要是说说Launcher里面图标、布局、壁纸等的设置问题。毕竟我们一般修改Launcher,这些都是需要修改的地方,也是比较容易修改的部分。按照效果图(效果图在上一篇文章),分开说明如何修改,以及里面涉及的逻辑分析。

 原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3155692.html

1、图标大小和标题大小

    Android原生图标大小都是通过配置文件设置,配置文件路径是/res/values/dimens.xml 。需要注意的是,values对应的文件夹很多,因为是多国语言支持。而dimens.xml在默认的values文件夹下面或者values-land和values-port(针对不同分辨率和平板类型,需要根据你运行情况找对应的dimens修改,如果需要使用多种分辨率,最好所有dimens都修改好)。下面是配置workspace的按钮属性配置。下面是针对values-land修改的cell大小。


//Edited by mythou
//http://www.cnblogs.com/mythou/<!-- Workspace cell size -->
<dimen name="workspace_cell_width_land">88dp</dimen>
<dimen name="workspace_cell_width_port">96dp</dimen>
<dimen name="workspace_cell_height_land">88dp</dimen>
<dimen name="workspace_cell_height_port">96dp</dimen>
<dimen name="workspace_width_gap_land">32dp</dimen>
<dimen name="workspace_width_gap_port">0dp</dimen>
<dimen name="workspace_height_gap_land">0dp</dimen>
<dimen name="workspace_height_gap_port">24dp</dimen><!-- Folders -->
<dimen name="folder_preview_size">68dp</dimen>
<dimen name="folder_cell_width">86dp</dimen>
<dimen name="folder_cell_height">90dp</dimen>
<dimen name="folder_width_gap">3dp</dimen>
<dimen name="folder_height_gap">3dp</dimen>
<dimen name="folder_padding">6dp</dimen>

 2、Launcher 图标加入默认背景。

    Launcher默认图标是各自应用程序设计的,这也导致了,界面图标看上去大小不同意,有点凌乱的感觉。如果整个系统是自己修改的,内置应用图标可以设置统一风格大小。如果是第三方程序就很难保证,所以一个折中办法是给所有图标加入一个背景,看上去风格一致。

 Launcher图标的获取处理是在Utilities.java类里面,我们可以从里面找到Bitmap createIconBitmap(Drawable icon, Context context) 方法。这个方法就是返回应用图标的。默认createIconBitmap里面有个加入五颜六色背景的方法,不过是屏蔽了,我们可以参考这个方法,加入一个默认背景图。

//Edited by mythou
//http://www.cnblogs.com/mythou/static Bitmap createIconBitmap(Drawable icon, Context context) {//...............final int left = (textureWidth-width) / 2;final int top = (textureHeight-height) / 2;//测试用,加入彩色背景边框if (false) {// draw a big box for the icon for debuggingcanvas.drawColor(sColors[sColorIndex]);if (++sColorIndex >= sColors.length) sColorIndex = 0;Paint debugPaint = new Paint();debugPaint.setColor(0xffcccc00);canvas.drawRect(left, top, left+width, top+height, debugPaint);}//增加图标背景图片 OWLif (true) {Bitmap backBitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.apical_icon_bg);int backWidth = backBitmap.getWidth();int backHeight = backBitmap.getHeight();if(backWidth != sIconWidth || backHeight != sIconHeight){Matrix matrix = new Matrix();matrix.postScale((float)sIconWidth/backWidth, (float)sIconHeight/backHeight);canvas.drawBitmap(Bitmap.createBitmap(backBitmap, 0, 0, backWidth, backHeight, matrix, true),0.0f, 0.0f, null);}else{canvas.drawBitmap(backBitmap, 0.0f, 0.0f, null);}}//................return bitmap;}}

如图上面代码,加入了 R.drawable.apical_icon_bg 一张默认的背景图作为背景,这样所有图标看上去大小都是一致的。而且风格也比较接近。对于做系统应用的人来说体验比较好。如果需要一些比较炫的效果,其实可以在这里给图标做倒影或者其他效果。

 

3、更换Launcher默认壁纸

Launcher默认的壁纸配置是放在framework下的res下面配置的,图片也是放在framework下面。对于需要做独立Launcher的项目,这个不能离开framework,非常不方便。所以就在Launcher自身实现一个默认壁纸设置的功能。默认壁纸,只能在Launcher第一次运行或者恢复默认设置时才需要设置显示。

因此我把默认壁纸反正设置放在Launcher.java类的onCreate()方法下的showFirstRunWorkspaceCling()执行。

showFirstRunWorkspaceCling()方法,只有Launcher第一次启动或者清除数据,恢复设置。才会运行。在showFirstRunWorkspaceCling()里面调用下面的方法

//Edited by mythou
//http://www.cnblogs.com/mythou/private void setDefaultWallPaper(){//修改默认背景 OWL test,可以在Framework替换默认静态图default_wallpaperWallpaperManager mwallpaerManager;mwallpaerManager = WallpaperManager.getInstance(this);try {mwallpaerManager.setResource(R.drawable.launcher_default_bg);} catch (IOException e) {Log.e(TAG, "set default wallpaper error");e.printStackTrace();}}

Launcher的壁纸都是调用系统WallpaperManager操作的,具体有兴趣可以查看源码。

android的静态壁纸,默认是frameworks/base/core/res/res/drawable/default_wallpaper.jpg。如果是做系统的,可以替换这张jpg图片也可以达到替换默认壁纸功能。

至于默认动态壁纸,这个要修改/framework/base/core/res/res/values/config.xml 。

<string name="default_wallpaper_component">@null</string>//把null修改为具体程序名,如下<string name="default_wallpaper_component" translatable="false">包名/动态壁纸服务名</string>

另外Launcher自身自带了一些默认壁纸,反正Launcher的res/drawable文件夹下,不同分辨率文件夹放了大小不一样。

这些默认壁纸在Launcher下values/wallpapers.xml下有配置。

//http://www.cnblogs.com/mythou/<resources><string-array name="wallpapers" translatable="false"><item>wallpaper_01</item><item>wallpaper_02</item><item>wallpaper_03</item><item>wallpaper_04</item><item>wallpaper_05</item><item>wallpaper_06</item><item>wallpaper_07</item><item>wallpaper_08</item><item>wallpaper_09</item><item>wallpaper_10</item><item>wallpaper_11</item><item>wallpaper_12</item></string-array>
</resources>

不过系统默认最多是支持24张图片。可以修改壁纸名字或者新增壁纸都是可以的。壁纸名字跟图片名字一一对应。

 

4、壁纸设置过程:

具体壁纸操作其实都是在WallpaperChooserDialogFragment这个Fragment里面实现,

查找默认壁纸:

//Edited by mythou
//http://www.cnblogs.com/mythou/private void findWallpapers() {mThumbs = new ArrayList<Integer>(24);mImages = new ArrayList<Integer>(24);final Resources resources = getResources();// Context.getPackageName() may return the "original" package name,// com.android.launcher2; Resources needs the real package name,// com.android.launcher. So we ask Resources for what it thinks the// package name should be.final String packageName = resources.getResourcePackageName(R.array.wallpapers);addWallpapers(resources, packageName, R.array.wallpapers);addWallpapers(resources, packageName, R.array.extra_wallpapers);}

其中R.array.wallpapers 就是上面说的默认壁纸名字的xml配置文件。通过这个文件加载所有默认壁纸。除了wallpapers 还有一个extra_wallpapers。这两个功能原理是一样的。

设置壁纸比较简单,跟我们设置默认壁纸一样

//Edited by mythou
//http://www.cnblogs.com/mythou/private void selectWallpaper(int position) {try {WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(Context.WALLPAPER_SERVICE);wpm.setResource(mImages.get(position)); //设置壁纸Activity activity = getActivity();activity.setResult(Activity.RESULT_OK);activity.finish();} catch (IOException e) {Log.e(TAG, "Failed to set wallpaper: " + e);}}

主要还是调用WallpaperManager的setResource方法。

 

今天就写到这里,如果有发现哪里写错了请留言,谢谢!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

捷径 - The certain shortcut

赛斯高汀(Seth Godin)的博客&#xff1a;http://sethgodin.typepad.com/seths_blog/2013/05/the-certain-shortcut.html The shortcut thats sure to work, every time: 所谓的捷径向来如此&#xff1a; Take the long way. 脚踏实地&#xff0c;一步一个脚印(遍历) Do t…

高效率三大法则总结

原则一&#xff1a;专注 之前经常听到很多人所谓的牛人&#xff0c;说什么边干活的时候可以开着msn、qq&#xff0c;工作和娱乐两不误&#xff0c;边听下属汇报的同时边写下午会议的发言稿&#xff0c;然而科学事实证明人类的大脑硬件结构决定了根本不可能一脑两用&#xff0c;…

N 年沉淀,腾讯这套系统终于开源!

大家好&#xff0c;我是鱼皮&#xff0c;前段时间给大家介绍了字节跳动开源的两套设计系统&#xff0c;分别是 Arco Design 和抖音 Semi Design。而就在几天前&#xff0c;腾讯终于也开源了自家的设计系统 TDesgin &#xff01;这次&#xff0c;终于能介绍自己公司的项目了。如…

在php中使用sockets:从新闻组中获取文章

PHP能打开远程或本地主机上的Socket端口。本文是一个使用Socket的小例子&#xff1a;连 接到一个Usenet新闻组服务器&#xff0c;同服务器对话&#xff0c;从新闻组中下载一些文章。在php中打开一个socket 使用fsockopen()打开一个socket.这个函数在php3和php4种都可以使用。函…

Android之Launcher分析和修改3——Launcher启动和初始化

前面两篇文章都是写有关Launcher配置文件的修改&#xff0c;代码方面涉及不多&#xff0c;今天开始进入Launcher代码分析。 我们开机启动Launcher&#xff0c;Launcher是由Activity Manager启动的&#xff0c;而Activity Manager是由system server启动。 原创博文&#xff0c…

史上最强物理科普!

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

mysql 怎么实现随机查询并分页,不重复查询

2019独角兽企业重金招聘Python工程师标准>>> 需求&#xff1a; 企业应用中&#xff0c;一般数据量不是很特别多&#xff0c;同时大多在局域网内&#xff0c;性能不会有问题&#xff0c;一般不会分页处理&#xff0c;随机排序数据一般不会有问题 web网站中&#xf…

评分卡模型剖析之一(woe、IV、ROC、信息熵)

信用评分卡模型在国外是一种成熟的预测方法&#xff0c;尤其在信用风险评估以及金融风险控制领域更是得到了比较广泛的使用&#xff0c;其原理是将模型变量WOE编码方式离散化之后运用logistic回归模型进行的一种二分类变量的广义线性模型。 本文重点介绍模型变量WOE以及IV原理&…

主机远程唤醒配置

配置&#xff1a;win10戴尔主机F2进biosbios设置2.系统设置3.以太网设置4.电源管理设置以上设置完成后关机&#xff0c;就可以在远程电脑上打开WakeMeOnLan&#xff0c;然后添加或者搜索需要唤醒的电脑的ip&#xff0c;mac和主机名称&#xff0c;然后就可以唤醒远程主机了查看m…

Java字节序,java整型数与网络字节序 byte[] 数组转换关系

Java字节序 http://origin100.iteye.com/blog/267165 /*** 通信格式转换** Java和一些windows编程语言如c、c、delphi所写的网络程序进行通讯时&#xff0c;需要进行相应的转换* 高、低字节之间的转换* windows的字节序为低字节开头* linux,unix的字节序为高字节开头* java则无…

python dict.fromkeys()研究

def unique(seq): #return [x for x in my_list if x not in locals()[_[1]]] return {}.fromkeys(seq).keys() dict.fromkeys(seq,valNone) #创建并返回一个新字典&#xff0c;以序列seq中元素做字典的键&#xff0c;val为字典所有键对应的初始值(默认为None) 例子&#xff…

unix高级编程apue.h问题

2019独角兽企业重金招聘Python工程师标准>>> apue.h头文件为作者自己编写而非系统自带&#xff0c;故需要自行添加&#xff01;第一&#xff1a;打开网站 http://www.apuebook.com/第二&#xff1a;选择合适的版本&#xff08;一共有三个版本&#xff0c;根据书的版…

Vim文本编辑器 常用指令大全 提升编程效率必备法宝之一

经常处理文本以及经常需要写代码的人&#xff0c;都会有自己比较常用的编辑器&#xff0c;本人喜欢用Vim&#xff0c;理由就是Vim编辑器灵活&#xff0c;并且可以达到纯键盘操作&#xff0c;使用纯熟情况下&#xff0c;根本不需要鼠标操作&#xff0c;听起来是不是很酷的&#…

IT与业务之间的鸿沟根源

目前世界经济进入到数字经济时期&#xff0c;IT与业务的融合已经不是什么新鲜的话题&#xff0c;其实从计算机的诞生的那一天开始&#xff0c;IT与业务融合的问题就已经开始了。1、经常听到一种观点&#xff1a;IT与业务之间的鸿沟这归结于谁领导谁的问题。&#xff08;1&#…

Java里面Unreachable code

今天写了一段Java代码&#xff0c;不小心出了“Unreachable code”错误&#xff0c;开始的时候MyEclipse一直提示我要我重命名一个对象&#xff0c;但我重命名了也不好用&#xff0c;最后才看到这个“Unreachable code”错误&#xff0c;在网上调查了一下&#xff0c;这个错误翻…

EIGRP stub SIA

转载于:https://blog.51cto.com/liushuo890/1202399

C++Vector使用方法

C内置的数组支持容器的机制&#xff0c;可是它不支持容器抽象的语义。要解决此问题我们自己实现这种类。在标准C中&#xff0c;用容器向量&#xff08;vector&#xff09;实现。容器向量也是一个类模板。标准库vector类型使用须要的头文件&#xff1a;#include <vector>。…

岛国人气美少女竟然每晚跟 3 个人通宵打麻将?

1 桥本怕不是四川人?▼2 借口总比困难多▼3 突然觉得自己是大厨▼4 连自己都不放过▼5 这就是纹身的烦恼▼6 这又是什么黑暗料理&#xff08;via.坏蛋王师傅&#xff09;▼7 哦吼&#xff0c;是在下输了▼7 哦吼&#xff0c;是在下输了▼你点的每个赞&#xff0c;我都认…

java获取ResultSet长度

2019独角兽企业重金招聘Python工程师标准>>> public class Test { public static void main(String[] args) throws SQLException { Connection conn WLMGlobal.connMgr_stat_instance().getConnection(); Statement stmt conn.createStatement(Result…