主菜单日历图标日期刷新

最新一直在做android6.0的项目,下面就主菜单日历图标日期刷新问题分享下,初来乍到,请多多关照,–):

解决这个问题主要考虑两个问题:1、怎样才能刷新日期。2、日期的现实位置

其他的也不多说了还是直接上代码吧,哈哈

1、CalendarIcon.java类中主要实现了当前日期的获取及日期居中显示(注意我这是直接做了0到9的图片然后通过算法来实现),具体如下:

package com.android.launcher3;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.View;

import java.util.Calendar;
import java.util.Locale;

public class CalendarIcon {
private Context mContext;

public CalendarIcon(Context context) {
    mContext = context;
}

private int[] daysId = new int[]{//0-9的数字图片,大小根据主菜单日历背景大小来定
    R.drawable.calendar_0,R.drawable.calendar_1,R.drawable.calendar_2,R.drawable.calendar_3,R.drawable.calendar_4,
    R.drawable.calendar_5,R.drawable.calendar_6,R.drawable.calendar_7,R.drawable.calendar_8,R.drawable.calendar_9
};

//得到日期,合成新图标
private Bitmap createCalendarBitmap(Bitmap src){
    String tag = "createBitmap";
    Log.d(tag, "create a new bitmap");
    if (src == null)
    {
        return null;
    }
    final Calendar c = Calendar.getInstance();
    int day = c.get(Calendar.DAY_OF_MONTH);
    int x = src.getWidth();
    int y = src.getHeight();
    int oneNumX = 0;
    int oneNumY = 0;
    int twoNumX = 0;
    Bitmap newb = Bitmap.createBitmap(x, y, Config.ARGB_8888);
    Canvas cv = new Canvas(newb);
    cv.drawBitmap(src, 0, 0, null);

    if (day <= 9) {
       Bitmap oneNumBitmap = BitmapFactory.decodeResource(mContext.getResources(),daysId[0]);
       Bitmap twoNumBitmap = BitmapFactory.decodeResource(mContext.getResources(),daysId[day]);
       oneNumX = oneNumBitmap.getWidth();
       oneNumY = oneNumBitmap.getHeight();
       twoNumX = twoNumBitmap.getWidth();
       cv.drawBitmap(oneNumBitmap,x/2 - oneNumX , y/2 - oneNumY/2, null);
       cv.drawBitmap(twoNumBitmap,x/2 , y/2 - oneNumY/2, null);
       //cv.drawBitmap(oneNumBitmap, x/2- oneNumX/2 , y/2 - oneNumY/2, null); //show one number
    } else {
       Bitmap oneNumBitmap = BitmapFactory.decodeResource(mContext.getResources(),daysId[getDay(day)[0]]);
       Bitmap twoNumBitmap = BitmapFactory.decodeResource(mContext.getResources(),daysId[getDay(day)[1]]);
       oneNumX = oneNumBitmap.getWidth();
       oneNumY = oneNumBitmap.getHeight();
       twoNumX = twoNumBitmap.getWidth();
       cv.drawBitmap(oneNumBitmap,x/2 - oneNumX , y/2 - oneNumY/2, null);
       cv.drawBitmap(twoNumBitmap,x/2 , y/2 - oneNumY/2, null);
    }
    cv.save(Canvas.ALL_SAVE_FLAG);
    cv.restore();
    return newb;
}

private int[] getDay(int day){
    return stringToInts(day+"");
}

private int[] stringToInts(String s){
    int[] n = new int[s.length()];
    for(int i = 0;i<s.length();i++){
        n[i] = Integer.parseInt(s.substring(i,i+1));
    }
    return n;
}

public Bitmap getDrable() {
    BitmapDrawable background = (BitmapDrawable) mContext.getResources().getDrawable(
    R.drawable.ic_launcher_calendar);
    Bitmap icon = createCalendarBitmap(background.getBitmap());
    return icon;
}

}

2、注册刷新日期广播
packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java

filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_DATE_CHANGED);
filter.addAction(Intent.ACTION_TIME_TICK);

3、接收广播并并对时间保存处理
packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java

import android.os.SystemProperties;
import android.content.SharedPreferences;
import java.util.Calendar;

在onReveice方法中进行处理如下
// Innovatech:liuxiaohong:for calendar icon.
if ( (Intent.ACTION_DATE_CHANGED.equals(action)
|| Intent.ACTION_TIME_CHANGED.equals(action) || Intent.ACTION_TIME_TICK.equals(action))) {
final Calendar c = Calendar.getInstance();
int day = c.get(Calendar.DAY_OF_MONTH);
if (mCallbacks != null && (getDate(context) != day)) {
Callbacks callbacks = mCallbacks.get();
if (callbacks != null) {
saveDate(context, day);
forceReload();
}
}
}
// End of Innovatech-liuxiaohong

// Innovatech:liuxiaohong:for calendar icon.
private void saveDate(Context context, int date) {
SharedPreferences sp = context.getSharedPreferences(“now_date”,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putInt(“nowdate”, date);
editor.commit();
}

private int getDate(Context context) {
SharedPreferences sp = context.getSharedPreferences(“now_date”,Context.MODE_PRIVATE);
int date = sp.getInt(“nowdate”, 1);
return date;
}
// End of Innovatech-liuxiaohong

4、launcher界面刷新图标
路径:package/apps/Launcher3/src/com/android/Launcher3/IconCache.java
@Thunk ContentValues updateCacheAndGetContentValues(LauncherActivityInfoCompat app,
boolean replaceExisting) {
……….
if ( “com.android.calendar”.equals(app.getComponentName().getPackageName()) ){
entry.icon = Utilities.createIconBitmap(new CalendarIcon(
mContext).getDrable(), mContext);
}
……….
}

private CacheEntry cacheLocked(ComponentName componentName, LauncherActivityInfoCompat info,
UserHandleCompat user, boolean usePackageIcon, boolean useLowResIcon) {
..............
if ( “com.android.calendar”.equals(app.getComponentName().getPackageName()) ){
entry.icon = Utilities.createIconBitmap(new CalendarIcon(
mContext).getDrable(), mContext);

...............

目前为止主菜单日历图标刷新日期的功能就基本实现了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值