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

上一篇文章说了如何修改Android自带Launcher2的默认界面设置。

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

1、图标大小和标题大小

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

b7fc7ec0e4687f382ba3288d1a445b5a.png

88dp96dp88dp96dp32dp0dp0dp24dp

68dp86dp90dp3dp3dp6dp

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

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

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

b7fc7ec0e4687f382ba3288d1a445b5a.png

staticBitmap createIconBitmap(Drawable icon, Context context) {//...............finalint left = (textureWidth-width) / 2;

finalint top = (textureHeight-height) / 2;//测试用,加入彩色背景边框

if (false)

{//draw a big box for the icon for debugging

canvas.drawColor(sColors[sColorIndex]);if (++sColorIndex >= sColors.length) sColorIndex = 0;

Paint debugPaint= newPaint();

debugPaint.setColor(0xffcccc00);

canvas.drawRect(left, top, left+width, top+height, debugPaint);

}//增加图标背景图片 OWL

if (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= newMatrix();

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);

}

}//................returnbitmap;

}

}

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

3、更换Launcher默认壁纸

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

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

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

b7fc7ec0e4687f382ba3288d1a445b5a.png

private voidsetDefaultWallPaper()

{//修改默认背景 OWL test,可以在Framework替换默认静态图default_wallpaper

WallpaperManager 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();

}

}

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

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

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

b7fc7ec0e4687f382ba3288d1a445b5a.png

@nullstring>

//把null修改为具体程序名,如下

包名/动态壁纸服务名string>

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

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

b7fc7ec0e4687f382ba3288d1a445b5a.png

wallpaper_01

wallpaper_02

wallpaper_03

wallpaper_04

wallpaper_05

wallpaper_06

wallpaper_07

wallpaper_08

wallpaper_09

wallpaper_10

wallpaper_11

wallpaper_12

string-array>

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

4、壁纸设置过程:

a385a7abba3a8339e3f1d7e580f79251.png

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

查找默认壁纸:

b7fc7ec0e4687f382ba3288d1a445b5a.png

private voidfindWallpapers() {

mThumbs= new ArrayList(24);

mImages= new ArrayList(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);

}

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

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

b7fc7ec0e4687f382ba3288d1a445b5a.png

private void selectWallpaper(intposition) {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);

}

}

b7fc7ec0e4687f382ba3288d1a445b5a.png

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值