Android 8.1 Launcher3实现动态指针时钟

本文主要实现功能,可能有不合理的地方

首先创建一个实现功能的工具里,直接上代码:

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.ShortcutInfo;
import com.android.launcher3.util.LogUtil;public class DeskClockUtil {private OnDeskClockIconChangeListener mListener;private ItemInfo mItemInfo;private boolean mIsResume;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 100) {Message msg1 = new Message();msg1.what = 100;msg1.obj = msg.obj;mHandler.sendMessageDelayed(msg1, 60000);if (mListener != null && mItemInfo != null) {mListener.onChange(IconUtil.getDeskClockIcon((Context) msg.obj), mItemInfo);}}}};private static DeskClockUtil sInstance;private DeskClockUtil() {}public static DeskClockUtil getInstance() {if (sInstance == null) {sInstance = new DeskClockUtil();}return sInstance;}private void refresh(Context context) {if (mListener != null && mItemInfo != null) {mListener.onChange(IconUtil.getDeskClockIcon(context), mItemInfo);}if (mHandler.hasMessages(100)) {mHandler.removeMessages(100);}Message msg = new Message();msg.what = 100;msg.obj = context;mHandler.sendMessageDelayed(msg,1000 * (60 - Integer.parseInt(DateUtils.getCurrentSecond())));}public void onResume(Context context) {mIsResume = true;refresh(context);}public void onPause() {mIsResume = false;mHandler.removeMessages(100);}public void setListener(OnDeskClockIconChangeListener listener, ItemInfo info, Context context) {if (!(info instanceof ShortcutInfo)) {return;}String pkg = null;if (info.getIntent() != null && info.getIntent().getComponent() != null) {pkg = info.getIntent().getComponent().getPackageName();}if (!"com.android.deskclock".equals(pkg) || info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {return;}mListener = listener;mItemInfo = info;if (mIsResume) {refresh(context);}}public interface OnDeskClockIconChangeListener {void onChange(Bitmap icon, ItemInfo info);}}

画出动态时钟

import android.content.Context;
import android.graphics.*;
import com.android.launcher3.R;public class IconUtil {private static final String TAG = "IconUtil";private static Bitmap getBitmap(Context context, int res) {BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.ARGB_4444;return BitmapFactory.decodeResource(context.getResources(), res, options);}public static Bitmap getDeskClockIcon(Context context) {// 添加一个带表盘的背景图Bitmap empty = getBitmap(context, R.drawable.icon_time);int x = empty.getWidth();int y = empty.getHeight();Bitmap deskClock = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_4444);Canvas canvas = new Canvas(deskClock);Paint paint = new Paint();paint.setAntiAlias(true);canvas.drawBitmap(empty, 0, 0, paint);//设置圆角paint.setStrokeCap(Paint.Cap.ROUND);paint.setStrokeWidth(5);paint.setColor(context.getResources().getColor(R.color.deskclock_time));// 时针的长度int radius = 35;// 圆心的x y 坐标int cx = x / 2;int cy = y / 2;int hour = Integer.parseInt(DateUtils.getCurrentHour());int min = Integer.parseInt(DateUtils.getCurrentMin());//时针的角度,这里是整点的角度。因为0°是从3点开始,所以这里减90°,从9点开始计算角度int drgeeHour = hour * 30 - 90;if (drgeeHour < 0) {drgeeHour += 360;}// 加上时针在两个整点之间的角度,一分钟在分针上是6°,在时针上是min * 6 / 12drgeeHour += min * 6 / 12;//时针 针尖的x y坐标,相当于已知圆心坐标和半径,求圆上任意一点的坐标int xHour = (int) (cx + radius * Math.cos(drgeeHour * 3.14 / 180));int yHour = (int) (cy + radius * Math.sin(drgeeHour * 3.14 / 180));canvas.drawLine(xHour, yHour, cx, cy, paint);//分针的长度radius = 45;paint.setStrokeWidth(3);paint.setColor(Color.RED);//分针的角度int drgeeMin = min * 6 - 90;if (drgeeMin < 0) {drgeeMin += 360;}//分针 针尖的x y坐标int x1 = (int) (cx + radius * Math.cos(drgeeMin * Math.PI / 180));int y1 = (int) (cy + radius * Math.sin(drgeeMin * Math.PI / 180));canvas.drawLine(x1, y1, cx, cy, paint);return deskClock;}}

时间工具类

import java.text.SimpleDateFormat;public class DateUtils {public static String getCurrentDay() {SimpleDateFormat format = new SimpleDateFormat("dd");Long t = new Long(System.currentTimeMillis());String d = format.format(t);return d;}public static String getCurrentSecond() {SimpleDateFormat format = new SimpleDateFormat("ss");Long t = new Long(System.currentTimeMillis());String d = format.format(t);return d;}public static String getCurrentMin() {SimpleDateFormat format = new SimpleDateFormat("mm");Long t = new Long(System.currentTimeMillis());String d = format.format(t);return d;}public static String getCurrentHour() {SimpleDateFormat format = new SimpleDateFormat("HH");Long t = new Long(System.currentTimeMillis());String d = format.format(t);return d;}}

下面就比较简单了,我是在BubbleTextView.java中添加listener,我这里偷懒了,应该给时钟单独创建一个view,继承BubbleTextView。

private void applyIconAndLabel(Bitmap icon, ItemInfo info) {/*  begin */setDeskClockIcon(info);/*  end */applyIcon(icon, info);setText(info.title);if (info.contentDescription != null) {setContentDescription(info.isDisabled()? getContext().getString(R.string.disabled_app_label, info.contentDescription): info.contentDescription);}}private void setDeskClockIcon(ItemInfo info) {DeskClockUtil.getInstance().setListener(new DeskClockUtil.OnDeskClockIconChangeListener() {@Overridepublic void onChange(Bitmap icon, ItemInfo info) {applyIcon(icon, info);}}, info, getContext());}private void applyIcon(Bitmap icon, ItemInfo info) {FastBitmapDrawable iconDrawable = DrawableFactory.get(getContext()).newIcon(icon, info);iconDrawable.setIsDisabled(info.isDisabled());setIcon(iconDrawable);}

在Launcher.java的onResume()和onPause()中分别开始和暂停

@Overrideprotected void onResume() {....../* begin */DeskClockUtil.getInstance().onResume(this);/*  end */if (mLauncherCallbacks != null) {mLauncherCallbacks.onResume();}}
@Overrideprotected void onPause() {// Ensure that items added to Launcher are queued until Launcher returnsInstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_ACTIVITY_PAUSED);super.onPause();mPaused = true;mDragController.cancelDrag();mDragController.resetLastGestureUpTime();// We call onHide() aggressively. The custom content callbacks should be able to// debounce excess onHide calls.if (mWorkspace.getCustomContentCallbacks() != null) {mWorkspace.getCustomContentCallbacks().onHide();}if (mLauncherCallbacks != null) {mLauncherCallbacks.onPause();}/*  begin */DeskClockUtil.getInstance().onPause();/*  end */}

这样就可以了,如果想要加秒针,在IconUtil中再把秒针画出来就行。
还有日历的动态图标也可以用同样的方法实现

Android 8.1 Launcher3实现动态指针时钟相关推荐

  1. android 时钟动态图标,Android 8.1 Launcher3实现动态指针时钟功能

    本文主要实现功能,可能有不合理的地方 首先创建一个实现功能的工具里,直接上代码: import android.content.Context; import android.graphics.Bit ...

  2. Android动态秒针插件app,Android 8.1 Launcher3实现动态指针时钟功能

    本文主要实现功能,可能有不合理的地方 首先创建一个实现功能的工具里,直接上代码: import android.content.Context; import android.graphics.Bit ...

  3. Android 9.0 Launcher3 禁止首屏时钟AppWidget拖动到其他屏

    1.前言 在9.0的系统rom定制化开发工作中,在系统Launcher3中 第一屏默认会放一个时钟AppWidget,对于时钟布局是可以任意拖动的,也是可以任意拖动到其他屏,但是如果 拖动时钟控件到其 ...

  4. Android 10.0 Launcher3 禁止首屏时钟AppWidget拖动到其他屏

    1.概述 在系统Launcher3中 第一屏默认会放一个时钟AppWidget,对于时钟布局是可以任意拖动的,也是可以任意拖动到其他屏,拖动到其他屏显得很不好看,所以根据需求改成不能拖动时钟去其他屏, ...

  5. python和C++代码实现模拟动态指针时钟

    一.python代码实现及turtle库简单介绍 桌面时钟项目描述 1.使用turtle库绘制时钟外形及表针: 2.使用datetime获取系统时间: 3.时钟动态显示 turtle库基本命令 1.t ...

  6. Android指针时钟的实现代码

    最近写了个指针时钟的小程序,拿出来和大家分享一下. 指针时钟控件实现: 关键点: 1.Android自定义控件实现 2.Android自定义控件命名空间 3.Android自定义控件从布局文件中获取参 ...

  7. android n 动态时钟,基于JQuery的动态罗盘时钟

    基于JQuery的动态罗盘时钟, 惯例,先来效果图 Index.html 动态时钟 * { margin: 0; padding: 0; } body { background-attachment: ...

  8. Android 9/10 Launcher3 适配出现的问题修改

    Android 10 将桌面设置图标长按出现的弹框中的电池去掉,去掉后如图: 这个主要是关于Android新功能Shortcuts的运用. Launcher3的流程: 在packages\apps\L ...

  9. 利用js制作动态小时钟

    利用js制作动态小时钟 在学完Date()函数之后,可以用来与CSS结合制作一个能转动的时钟. 新建html文件,写好基本结构,代码如下: <!DOCTYPE html> <html ...

  10. Java Swing 小项目:模拟时钟/指针时钟 + 数字日期时钟 的实现

    原文链接:https://xiets.blog.csdn.net/article/details/130685267 版权声明:原创文章禁止转载 Java Swing 图形界面开发(目录) 使用 Ja ...

最新文章

  1. 《网络安全协议》课程实验大纲
  2. CSS0 -- 静态、自适应、流式、响应式
  3. 看完书要及时消化(1)《暗时间》
  4. 云平台项目实战(华为篇)之存储技术
  5. 跋山涉水——深入 Redis 字典遍历
  6. wordpress在前台文章界面添加编辑按钮
  7. 【英语学习】【医学】Unit 02 The Brain and Its Functions
  8. Yaniv Erlich:DNA 很可能是人类终极的储存设备
  9. 最新实战讲解.htaccess文件rewrite规则
  10. isis软件添加源代码c语言,ProteusISIS和Keil软件入门学习..doc
  11. LCD1602自定义符号的使用
  12. html5怎么把文字竖排,艺术字竖排文字怎么设置
  13. 前端常用PS技巧总结之将图片背景透明化
  14. android软件开发 开题报告,基于Android手机app开发与设计 毕业设计 开题报告
  15. 知名互联网公司校招 Java 开发岗面试知识点解析
  16. UVA 12304 (平面几何)
  17. python123九宫格输入_python制作朋友圈九宫格图片
  18. 【Python计量】两期面板数据分析
  19. 走近历史,伦敦卫兵博物馆游玩攻略
  20. 生活之行军蚁死亡漩涡

热门文章

  1. BCM业务连续性管理
  2. 提交网址到bing搜索引擎
  3. Linux下文件、文件夹大小排序及文件内容排序
  4. 逃离北上广的成本越来越高了
  5. 中国(2009-2017)全国各省结婚率和离婚率数据可视化
  6. java中国象棋棋子走法,《中国象棋对弈》象棋规则 棋子的走法
  7. [Silverlight C#]反向波兰语表示法计算器教程
  8. MySQL基础(约束 多表查询)
  9. python寻找所有三位数素数_寻找所有的素数的python实现
  10. 中国这10家慕课网站,您需要知道!