android launcher 显示时间,android launcher 日历图标显示日期

看到iphone上的日历图标上的数字会随着日期的变化而变化,最近在android平台上也研究了 一下,实现方法如下:

直接上源码

在launcher里改的

首先,在IconCache.java文件中,找到方法private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info,

HashMap labelCache)

在entry.icon = Utilities.createIconBitmap(icon, mContext); 这个位置修改:

if(info.activityInfo.packageName.equals("com.android.calendar")){

entry.icon = Utilities.createCalendarIconBitmap(icon, mContext);

}else{

if (index >= 0) {

entry.icon = Utilities.createIconBitmap(icon, mContext);

} else {

entry.icon = Utilities.createIconBitmap(

/* SPRD: Feature 253522, Remove the application drawer view @{ */

// getFullResIcon(info), mContext);

icon, mContext, true);

}

}

改后源码如下:

private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info,

HashMap labelCache) {

CacheEntry entry = mCache.get(componentName);

if (entry == null) {

entry = new CacheEntry();

mCache.put(componentName, entry);

ComponentName key = LauncherModel.getComponentNameFromResolveInfo(info);

if (labelCache != null && labelCache.containsKey(key)) {

entry.title = labelCache.get(key).toString();

} else {

entry.title = info.loadLabel(mPackageManager).toString();

if (labelCache != null) {

labelCache.put(key, entry.title);

}

}

if (entry.title == null) {

entry.title = info.activityInfo.name;

}

/* SPRD: Fix bug 281291, remove icon_top for theme defaut icon @{ */

/* SPRD: UUI theme : system icons @{ */

Drawable icon;

/* SPRD: Fix bug294355, add just to ThemeManager. @{ */

int index = sysIndexOf(componentName.getClassName());

Log.i("jxt", "index:"+index+",Name:"+componentName.getClassName());

icon = getFullResIcon(info);

//changed by leo

if(info.activityInfo.packageName.equals("com.android.calendar")){

entry.icon = Utilities.createCalendarIconBitmap(icon, mContext);

}else{

if (index >= 0) {

entry.icon = Utilities.createIconBitmap(icon, mContext);

} else {

entry.icon = Utilities.createIconBitmap(

/* SPRD: Feature 253522, Remove the application drawer view @{ */

// getFullResIcon(info), mContext);

icon, mContext, true);

}

}

/* @} */

/* @} */

/* @} */

}

return entry;

}

接下来修改Utilities.java

添加一个函数:

static Bitmap createCalendarIconBitmap(Drawable icon, Context context){

Bitmap calendarIcon = createIconBitmap(icon,context);

String dayString = String.valueOf(Calendar.getInstance().get(Calendar.DAY_OF_MONTH));

synchronized (sCanvas) {

final Canvas canvas = sCanvas;

canvas.setBitmap(calendarIcon);

final float mDensity = context.getResources().getDisplayMetrics().density;

Paint mDatePaint = new Paint();

mDatePaint.setTypeface(Typeface.DEFAULT_BOLD);

mDatePaint.setTextSize((int)30F * mDensity);

mDatePaint.setColor(0xff000000);

mDatePaint.setAntiAlias(true);

Rect rect = new Rect();

mDatePaint.getTextBounds(dayString,0,dayString.length(),rect);

int hoffset = 20;

int width1 = rect.right - rect.left;

int height1 = rect.bottom - rect.top;

int width2 = calendarIcon.getWidth();

int height2 = calendarIcon.getHeight() + hoffset;

canvas.drawText(dayString,(width2 - width1)/2 - rect.left,(height2 - height1)/2 - rect.top,mDatePaint);

canvas.setBitmap(null);

return calendarIcon;

}

}

再修改LauncherModel.java文件:

在onReceive()方法中添加如下代码:

//changed by leo

}else if(Intent.ACTION_DATE_CHANGED.equals(action) ||

Intent.ACTION_TIME_CHANGED.equals(action) ||

Intent.ACTION_TIMEZONE_CHANGED.equals(action)){

final String packageName = "com.android.calendar";

enqueuePackageUpdated(new PackageUpdatedTask(

PackageUpdatedTask.OP_UPDATE, new String[]{packageName}));

}

最后修改LauncherApplication.java文件,如果是launcher3的源码,则修改LauncherAppState.java文件

我这里修改的是

LauncherAppState.java

在构造函数 private LauncherAppState()中添加:

//changed by leo

filter.addAction(Intent.ACTION_TIME_CHANGED);

filter.addAction(Intent.ACTION_DATE_CHANGED);

filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);

修改后的样式为:

// Register intent receivers

IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);

filter.addAction(Intent.ACTION_PACKAGE_REMOVED);

filter.addAction(Intent.ACTION_PACKAGE_CHANGED);

filter.addDataScheme("package");

sContext.registerReceiver(mModel, filter);

filter = new IntentFilter();

filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);

filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);

filter.addAction(Intent.ACTION_LOCALE_CHANGED);

filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);

//changed by leo

filter.addAction(Intent.ACTION_TIME_CHANGED);

filter.addAction(Intent.ACTION_DATE_CHANGED);

filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);

sContext.registerReceiver(mModel, filter);

当然, 这样是不能运行看到效果的,要将该导入的包都导入 ,然后再单编译launcher模块,push到手机里,就能看到日历图标上显示当前日期了。

今天看到好多人修改后引起了问题,我把源码提取出来了,放在资源里,需要的可以去下载查看,请点击链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值