Launcher3日历图标跟随日期改变而改变

在上一篇的文章里里实现了动态时钟和动态日历的Launcher图标,但是今天测试的时候发现动态日历会有leakreceived的问题,无法取消Received的绑定。所以今天换一种方式实现动态日历图标:

LauncherAppState.java里增加:

public static final String ACTION_UPDATE_ICON = "com.xxx.update_icon";
private LauncherAppState() {
    …………
            // UPDATE APPICON BEGIN
        IntentFilter timefilter = new IntentFilter();
        timefilter.addAction(Intent.ACTION_DATE_CHANGED);
        timefilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        timefilter.addAction("android.intent.action.TIME_SET");
        timefilter.addAction(ACTION_UPDATE_ICON);
        sContext.registerReceiver(mModel, timefilter);
        // UPDATE APPICON END
}

LauncherModel.java里增加:

public interface Callbacks {
        …………
        public void updateAppIcon(AppInfo info);   //UPDATE APPICON
}
 @Override
    public void onReceive(Context context, Intent intent) {
        …………
     /**************UPDATE APPICON BEGIN **********************************/
       else if (Intent.ACTION_DATE_CHANGED.equals(action) ||
            Intent.ACTION_TIMEZONE_CHANGED.equals(action) ||
            "android.intent.action.TIME_SET".equals(action) ||
            LauncherAppState.ACTION_UPDATE_ICON.equals(action)) {
	        String pkgName = null;
	        if (LauncherAppState.ACTION_UPDATE_ICON.equals(action)) {
	            pkgName = intent.getStringExtra("packageName");
	        } else {
	            pkgName = "com.android.calendar";
	        }

	        final ArrayList<AppInfo> list
	                = (ArrayList<AppInfo>) mBgAllAppsList.data.clone();

	        if (null == list || list.isEmpty()) {
	            return;
	        }

	        AppInfo info = null;
	        for (AppInfo ai : list) {
	            if (ai.componentName.getPackageName().equals(pkgName)) {
	                info = ai;
	                break;
	            }
	        }

	        if (null != info && mCallbacks != null) {
	            Callbacks callbacks = mCallbacks.get();
	            if (callbacks != null && info != null) {
	                callbacks.updateAppIcon(info);
	            }
	        }
        }
        /**************UPDATE APPICON END *****************************/
}

Launcher.java里添加:

    // UPDATE APPICON BEGIN
    @Override
    public void updateAppIcon(AppInfo info){
        if (null != mIconCache) {
//        	mIconCache.updateTitleAndIcon(info);
        	mWorkspace.updateShortcut(info.componentName.getPackageName());
        }
    }
    // UPDATE APPICON END

Workspace.java里添加:

 // UPDATE APPICON BEGIN
    void updateShortcut(String pkgName) {
        ArrayList<ShortcutAndWidgetContainer> childrenLayouts = getAllShortcutAndWidgetContainers();
        for (ShortcutAndWidgetContainer layout: childrenLayouts) {
            int childCount = layout.getChildCount();
            for (int j = 0; j < childCount; j++) {
                final View view = layout.getChildAt(j);
                Object tag = view.getTag();
                if (tag instanceof ShortcutInfo) {
                    ShortcutInfo info = (ShortcutInfo) tag;
                    try {
                        if (pkgName.equals(info.intent.getComponent().getPackageName())) {
                            BubbleTextView bv = (BubbleTextView) view;
//                            bv.applyFromShortcutInfo(info, mIconCache);
                            bv.applyCalendarInfo(info);
                        	bv.invalidate();
                        }
                    } catch (Exception e) {
                    }
                }
            }
        }
    }
    // UPDATE APPICON END

BubbleTextView.java里添加:

    /************************UPDATE APPICON start*****************************/
    public void applyCalendarInfo(ShortcutInfo info) {
        Bitmap b = Utilities.createCalendarIconBitmap(mLauncher);

        FastBitmapDrawable iconDrawable = mLauncher.createIconDrawable(b);
        iconDrawable.setGhostModeEnabled(info.isDisabled != 0);

        setIcon(iconDrawable, mIconSize);
        if (info.contentDescription != null) {
            setContentDescription(info.contentDescription);
        }
        setText(info.title);
        setTag(info);

//        if (promiseStateChanged || info.isPromise()) {
//            applyState(promiseStateChanged);
//        }
    }

    /************************UPDATE APPICON end*****************************/

Utilities.java里添加:

	//UPDATE APPICON
	static Bitmap createCalendarIconBitmap(Context context) {
		//Time time = new Time();
		//time.setToNow();
		int dayOfMonth         = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
		int dayOfWeek          = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
//      canvas.drawBitmap(getRes(mTime.monthDay), null, getBounds(), mPaint);
		Bitmap calendarBackground = BitmapFactory.decodeResource(context.getResources(), R.drawable.calendar);
		Bitmap dayOfMonthRes      = getCalendarDataRes(context, dayOfMonth);
		Bitmap dayOfWeekRes       = getCalendarWeekDayRes(context, dayOfWeek);

		int width  = getIconBitmapSize();
		int height = getIconBitmapSize();

		Bitmap newBmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(newBmp);

		Rect destRect = new Rect(0, 0, width, height);
		Rect srcRect  = new Rect(0, 0, calendarBackground.getWidth(), calendarBackground.getHeight());

		canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
		canvas.drawBitmap(calendarBackground, srcRect, destRect, null);
		canvas.drawBitmap(dayOfMonthRes, (width - dayOfMonthRes.getWidth()) / 2 , (height - dayOfMonthRes.getHeight()) / 2 + 10, null);
		canvas.drawBitmap(dayOfWeekRes, (width - dayOfWeekRes.getWidth()) / 2, dayOfWeekRes.getHeight(), null);

		canvas.save(Canvas.ALL_SAVE_FLAG);
		canvas.restore();

		return newBmp;
	}	
</pre><pre>

IconCache.java里添加:

 private CacheEntry cacheLocked(ComponentName componentName, LauncherActivityInfoCompat info,
            UserHandleCompat user, boolean usePackageIcon, boolean useLowResIcon) {
          …………
        //UPDATE APPICON BEGIN
        if (null != entry && componentName.getPackageName().equals("com.android.calendar")) {
             entry.icon = Utilities.createCalendarIconBitmap(mContext);
        }
        //UPDATE APPICON END
        return entry;
}

虽然看起来麻烦了点,但是却没有无法注销广播接收器的error报出来了。

时间: 2024-08-29 11:25:00

Launcher3日历图标跟随日期改变而改变的相关文章

android launcher 日历图标显示日期

看到iphone上的日历图标上的数字会随着日期的变化而变化,最近在android平台上也研究了 一下,实现方法如下: 直接上源码 在launcher里改的 首先,在IconCache.java文件中,找到方法private CacheEntry cacheLocked(ComponentName componentName, ResolveInfo info, HashMap<Object, CharSequence> labelCache) 在entry.icon = Utilities.c

制作可视化日历,输入日期得到当月 月历表

import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Scanner; /** * 制作可视化日历,输入日期得到当月 月历表 * */ public class CalendarDemo { public static voi

方框列数随着浏览器宽度改变而改变的几种方法

方框列数随着浏览器宽度改变而改变的几种方法 一,使用浮动float <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>考察浮动</title> <style type="text/css"> #content { background-color: red; position

winform中,如何控制控件位置随窗体的大小改变而改变

winform中,如何控制控件位置随窗体的大小改变而改变 有如下3种方法: 方法1 [csharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MarkPrint

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/

android 日历图标显示星期

上一篇文档中谈到了在日历图标上显示当前日期, 现在我添加了几行代码,可以在日历图标上显示对应的星期: 修改源码是在Utilities.java中 函数createCalendarIconBitmap 添加几行代码: int dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK); String weekStrings[] = {"周日","周一","周二","周三&quo

App字体大小不随系统改变而改变

转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6713724.html 在 "设置" , "显示" , "字体大小" 里面我们可以设置系统字体大小 App界面字体,如果被修改之后,可能就达不到理想状态的效果,界面布局就发生了变化. 未修改过的效果(测试机型:Nexus 5): 正常 小 超大    修改之后的效果(测试机型:Nexus 5): 正常 小 超大    我们从这两组对比图中可以直观的看到修改

delphi实现窗体组建随窗体大小改变而改变

在网上查了许多资料去论述如何在dephi中去实现组件随窗口大小的变化而变化,然都不尽如人意.有人说用组件的align + anchors 这两个属性去控制,但是我用了之后,让我大惊失色.把anchors属性下面的四个值都变为true.如果用户用鼠标去拖动窗口,那么窗口上的组件像是中了夺命书生的面目全非脚一样,基本上就没有所谓的五官之态. 下面就介绍我的方法,同样本人的方法也是看了网友们的资料才得以完成的. (1) 下载TFormResizer组件 我用的是第三方插件TFormResizer,首先

自制一个UIView代替ViewController的导航栏视图跟随scrollview滑动而改变大小并且图片移动交错效果,列表的Header View中的图片产生视差滚动效果

#import <UIKit/UIKit.h> @interface ELHeaderView : UIView@property (nonatomic, weak) UIViewController *viewController;@property (nonatomic, weak) UIScrollView *scrollView; - (id)initWithFrame:(CGRect)frame backGroudImageURL:(NSString *)backImageURL h