使用自定义字体创建数字时钟小部件

14

我正在尝试创建一个使用自定义字体的数字时钟小部件。这是我在Android开发中遇到的最大挑战。(原本以为只需像tc.setTypeFace("whatever")那样简单)

最好的方法似乎是放弃使用TextClock,而是使用ImageView,并使用自定义AlarmManager传递一个位图来为视图创建一个新图像。每秒钟更新一次。

在进入位图生成之前,我先使用了一个简单的TextView进行练习,并使用了这个教程:Alarm Manager Widget

我的问题是我无法使其每秒钟更新一次。我使用了am.setRepeating(AlarmManager.RTC_WAKEUP , System.currentTimeMillis()+1000, 1000, pi);但它仍然只在每分钟左右更新一次(虽然不是在每分钟的开始)。我认为这与更近期的操作系统(Kitkat,Lollipop)处理AlarmManagers的方式有关。

我的问题是:

  1. 这是正确的做法吗?如果不是,请解释我应该怎么做。

  2. 如何使小部件每秒更新一次?


顺便提一下,每分钟都会发送一个时间刻度广播(如果我没记错的话,这就是TextClock在后台使用的内容)。http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK - JohanShogun
3个回答

3

使用此链接获取低于API 17的Textclock。 您可以使用.setTypeface(Typeface.createFromAsset(getAssets(),fonts/font.ttf"))来设置字体。


2
你不能在小部件中使用getAssets。 - David Small
你可以在Activity或Fragment中通过id找到视图,然后使用".setTypeface(Typeface.createFromAsset(getAssets(),fonts/font.ttf"))"。由于TextClock是TextView的子类,因此也适用。 - avinash
1
使用小部件时,您必须使用RemoteViews。而RemoteViews没有设置字体的方法。 - David Small

3

我有同样的问题...

  1. 最简单的方法 - 如果您使用的是API级别16或更高版本,您可以在xml文件中添加 android:fontFamily="sans-serif-thin" 属性。 非常好用!

这是我的TextView:

<TextView
   android:id="@+id/Time"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:ellipsize="none"
   android:fontFamily="sans-serif-thin"
   android:gravity="center_vertical|center_horizontal"
   android:includeFontPadding="false"
   android:singleLine="true"
   android:text="12:01"
   android:textColor="#fff"
   android:textSize="80sp" />

下面是它的样子:

enter image description here

这种方法唯一的缺点是你不能使用太多系统字体。

  1. 另一种方法是使用自己的类,继承TextView对象,就像这个,并在xml文件中将其定义为普通TextView。 我不建议这样做,因为可能会出现错误。

编辑:要每分钟更新小部件 - 您需要启动一个服务,该服务可以每分钟(或每秒)更新您的时钟。 这个示例也可以参考。


这并没有回答关于如何每分钟更新小部件的问题。 - Reut Sharabani
我需要使用自己的字体,而不是内置的字体。因此选项1可以忽略。在选项2中,您制作的“that”超链接没有指向任何内容?那里应该有一个例子吗?我还深入研究了您提供的示例代码。您说您不建议使用它,但听起来这是我的唯一选择。您所指的错误是什么? - David Small
1
TextClock 需要 API 级别 17 及以上。 - Nikolay Hristov
1
正如 Nikolai 所说,你可以使用 TextClock,但如果你想在 Android 4.4 以下版本中使用相同的效果,可以使用下面的链接。使用以下代码来使用你自己的字体:myTextClock.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/font.ttf")); - avinash
经过许多测试,正确的方法似乎是使用服务每分钟更新一次位图。你提供的示例@NikolaiHristov非常有帮助! - David Small
显示剩余2条评论

2
对于API 17或更高版本的自定义字体,您需要下载任何想要的字体的.ttf文件,然后创建一个assets/fonts/目录,然后保存您的字体。

enter image description here

Typeface fonttype
fonttype = Typeface.createFromAsset(getActivity().getAssets(), "fonts/robotoregular.ttf");
textclock.setTypeface(fonttype);

4
你不能在小部件中这样做。 - David Small

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接