Android 8.1 Launcher3实现动态指针时钟功能

所属分类: 软件编程 / Android 阅读数: 42
收藏 0 赞 0 分享

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

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

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() {
    @Override
    public 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 / 12
    drgeeHour += 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() {
      @Override
      public 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()中分别开始和暂停

@Override  protected void onResume() {
   ......
    /* begin */
    DeskClockUtil.getInstance().onResume(this);
    /* end */
    if (mLauncherCallbacks != null) {
      mLauncherCallbacks.onResume();
    }
  }

@Override
  protected void onPause() {
    // Ensure that items added to Launcher are queued until Launcher returns
    InstallShortcutReceiver.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实现动态指针时钟功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

使用ViewPager实现android软件使用向导功能实现步骤

现在的大部分android软件,都是使用说明,就是第一次使用该软件时,会出现向导,可以左右滑动,然后就进入应用的主界面了,下面我们就实现这个功能
收藏 0 赞 0 分享

android在异步任务中关闭Cursor的代码方法

android在异步任务中如何关闭Cursor?在我们开发应用的时候,很多时候会遇到这种问题,下面我们就看看代码如何实现
收藏 0 赞 0 分享

Android自定义桌面功能代码实现

android自定义桌面其实很简单,看一个例子就明白了
收藏 0 赞 0 分享

android将图片转换存到数据库再从数据库读取转换成图片实现代码

有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来
收藏 0 赞 0 分享

TextView显示系统时间(时钟功能带秒针变化

用System.currentTimeMillis()可以获取系统当前的时间,我们可以开启一个线程,然后通过handler发消息,来实时的更新TextView上显示的系统时间,可以做一个时钟的功能
收藏 0 赞 0 分享

Android用ListView显示SDCard文件列表的小例子

本文简单实现了用ListView显示SDCard文件列表,目录的回退等功能暂不讨论,获取文件列表,files即为所选择目录下的所有文件列表
收藏 0 赞 0 分享

Android拦截外拨电话程序示例

这篇文章主要介绍了Android拦截外拨电话的示例,大家参考使用吧
收藏 0 赞 0 分享

通过Html网页调用本地安卓(android)app程序代码

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式
收藏 0 赞 0 分享

android Textview文字监控(Textview使用方法)

以手机号充值为例,当用户输入最后一位数时候,进行汇率的变换,本文就实现类似这样的功能
收藏 0 赞 0 分享

Android ListView长按弹出菜单二种实现方式示例

这篇文章主要介绍了Android ListView长按弹出菜单的方法,大家参考实现
收藏 0 赞 0 分享
查看更多