最新一直在做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);
}
...............
}
目前为止主菜单日历图标刷新日期的功能就基本实现了。