问题:怎样构建一个模拟LED数字时钟的页面?效果例如以下图所看到的:

(原文地址:http://blog.csdn.net/vector_yi/article/details/24460227)

分析:我们能够利用两个TextView来显示,第一个TextView显示LED屏上默认不发光的88:88:88。还有一个显示实时的时间并加入发光及阴影效果。

可是我们还须要解决显示的字体问题,让它看起来更像是一个真实的LED数字时钟。


解决步骤:(1)自己定义一个LedTextView类,继承自TextView。这个类主要用来设置和显示字体。
                (2)在MainActivity中新开启一个线程用来更新LedTextView显示的时间。
                (3)为LedTextView加入阴影效果。看起来更真实。

一、自己定义LedTextView类

我们在创建一个Androidproject时,会同一时候生成一个assets目录。用来存放须要利用到的资源。

在这里,我们首先须要在assets目录下放入一个我们须要用到的字体文件:digital-7.ttf

如图所看到的:



然后再编写LedTextView类,并在类中将字体设置为我们引入的字体digital-7.


LedTextView.java:

public class LedTextView extends TextView {

       private static final String FONTS_FOLDER = "fonts";
private static final String FONT_DIGITAL_7 = FONTS_FOLDER + File.separator
+ "digital-7.ttf";
private void init(Context context) {
AssetManager assets = context. getAssets();
final Typeface font = Typeface . createFromAsset( assets, FONT_DIGITAL_7);
setTypeface (font );// 设置字体
}
public LedTextView (Context context) {
super(context );
init( context);
} public LedTextView (Context context, AttributeSet attrs) {
super(context , attrs );
init( context);
} public LedTextView (Context context, AttributeSet attrs, int defStyle) {
super(context , attrs , defStyle );
init( context);
}
}
代码非常easy,首先指定了字体文件,然后写了一个init()方法用来为LedTextView设置字体,最后重写了TextView类的全部构造函数,并调用init()方法。
接下来须要在XML布局中使用这样LedTextView。
main.xml:
<merge xmlns:android ="http://schemas.android.com/apk/res/android" >

    <com.vectoryi.hack011.view.LedTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/default_time"
android:textColor="#3300ff00"
android:textSize="80sp" /> <com.vectoryi.hack011.view.LedTextView
android:id="@+id/main_clock_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#00ff00"
android:textSize="80sp" /> </merge>
在这里定义了两个LedTextView控件,当中@string/default_time值为"88:88:88"。
另一点须要注意,这里用到了<merge/>标签。博主在前文《延迟载入和避免反复渲染》中已经介绍过<include/>标签的使用。

试想一下,当你<include
/>这个布局main.xml时,假设main.xml是这种:

<<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"> <com.vectoryi.hack011.view.LedTextView
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:layout_gravity ="center"
android:text ="@string/default_time"
android:textColor ="#3300ff00"
android:textSize ="80sp" /> <com.vectoryi.hack011.view.LedTextView
android:id ="@+id/main_clock_time"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:layout_gravity ="center"
android:textColor ="#00ff00"
android:textSize ="80sp" /> </FrameLayout>
是不是添加了View树的Hierarchy层级呢?这样会显得View树更加复杂。假设<include/>这种布局使用多了。会影响性能。

二、实时更新LedTextView显示的内容
接下来看MainActivity:
public class MainActivity extends Activity {

       private static final String DATE_FORMAT = "%02d:%02d:%02d" ;
private static final int REFRESH_DELAY = 500; // 因为Android不同意其它线程操作UI,所以在此创建了一个Handler
private final Handler mHandler = new Handler();
//用来实时更新LedTextView显示的线程
private final Runnable mTimeRefresher = new Runnable() {
@Override
public void run() {
Calendar calendar = Calendar. getInstance (TimeZone
. getTimeZone( "GMT+8")); // 设置时区
final Date d = new Date();
calendar .setTime (d );
mTextView. setText( String. format (DATE_FORMAT ,
calendar .get (Calendar .HOUR ), calendar. get( Calendar. MINUTE),
calendar .get (Calendar .SECOND )));
mHandler. postDelayed (this , REFRESH_DELAY );
}
}; private TextView mTextView ; @Override
public void onCreate(Bundle savedInstanceState ) {
super .onCreate (savedInstanceState );
setContentView (R .layout .main ); mTextView = (TextView ) findViewById (R .id .main_clock_time );
} @Override
protected void onResume() {
super .onResume ();
mHandler. post( mTimeRefresher );
} @Override
protected void onStop() {
super .onStop ();
mHandler. removeCallbacks (mTimeRefresher );
}
}
代码相同也不复杂。主要注意一下多线程的使用

至此,我们已经创建了一个LED数字时钟。效果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmVjdG9yX3lp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

可是总认为和问题要求的效果图差一些。没错,还少了阴影效果。

三、为时钟加入阴影效果
TextView类提供了例如以下方法来设置阴影效果:
public void setShadowLayer (float radius, float dx, float dy, int color)
相应到XML属性就是:
android:shadowRadius,android:shadowDx , android:shadowDy ,android:shadowColor

我们在main.xml中把第二个LedTextView改为:
<com.vectoryi.hack011.view.LedTextView
android:id ="@+id/main_clock_time"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content"
android:layout_gravity ="center"
android:shadowColor ="#00ff00"
android:shadowDx ="0"
android:shadowDy ="0"
android:shadowRadius ="10"
android:textColor ="#00ff00"
android:textSize ="80sp" />
这样就能显示和问题要求一样的效果了。

最后附上GitHub相关资料(https://github.com/VectorYi/LedTextView.git)和源代码下载链接(源代码点我).

50个Android开发技巧(11 为文字加入特效)的更多相关文章

  1. 50个android开发技巧

    50个android开发技巧 http://blog.csdn.net/column/details/androidhacks.html

  2. 50一个Android开发技巧(01 利用好layout_weight属性)

    问题:如何将一个Button放置在布局的中间,并设置其宽度parent的50%? 分析:问题想要达到的效果应该是这样: (原文地址:http://blog.csdn.net/vector_yi/art ...

  3. 50个Android开发技巧(09 避免用EditText对日期进行验证)

    我们都知道,在表单中对数据进行验证不但无聊并且easy出错. (原文地址:http://blog.csdn.net/vector_yi/article/details/24424713) 想象一下,一 ...

  4. 50个Android开发技巧(02 延迟载入和避免反复渲染视图)

    当你在Application中创建复杂的布局时.页面的渲染过程也变得更加缓慢. 此时,我们须要利用 <include />标签(避免反复渲染)和 ViewStub类(延迟载入)来优化我们的 ...

  5. 50个Android开发技巧(24 处理ListView数据为空的情况)

         在移动平台上为用户展示数据的一个经常用法是将数据填充进一个List内,而此时须要注意的一点就是: 原文地址:(http://blog.csdn.net/vector_yi/article/d ...

  6. 50个Android开发技巧(10 为TextView加入样式)

    首先来看一个控件的例子: (原文地址:http://blog.csdn.net/vector_yi/article/details/24428085) 手机上类似这种场景你一定已经见过非常多次了,但有 ...

  7. 50个Android开发技巧(03 自己定义ViewGroup)

    问题:怎样创建一个例如以下图所看到的的布局?                图1 (原文地址:http://blog.csdn.net/vector_yi/article/details/244155 ...

  8. 50个Android开发技巧(12 为控件加入圆角边框)

    控件的圆角边框能够使你的App看起来更美观,事实上实现起来也非常easy. (原文地址:http://blog.csdn.net/vector_yi/article/details/24463025) ...

  9. 50个Android开发人员必备UI效果源码[转载]

    50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...

随机推荐

  1. HDU2084:数塔(DP)

    Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大 ...

  2. Android 下使用tcpdump网络抓包方法

    Android 下使用tcpdump网络抓包方法 抓包需要tcpdump以及Root权限,tcpdump在本文后有下载. 首先把tcpdump传进手机,用adb命令(放SD卡有时会有问题,我一次可以用 ...

  3. 学校作业-Usaco DP水题

    好吧,因为USACO挂掉了,所以我写的所有代码都不保证正确性[好的,这么简单的题,再不写对,你就可以滚粗了! 第一题是USACO 2.2.2 ★Subset Sums 集合  对于从 1 到 N 的连 ...

  4. POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: ...

  5. windows简单杀死进程的批处理程序

    新建一个txt文档,命令为taskkill.bat,复制下面的命令保存 @echo offtaskkill /F /IM vm* /Ttaskkill /F /IM apple* /Ttaskkill ...

  6. diff两个文件夹里的东西

    diff --help -x, --exclude=PAT               exclude files that match PAT 排除某个类型的文件 -u, -U NUM, --uni ...

  7. [Swust OJ 249]--凸包面积

        题目链接:    http://acm.swust.edu.cn/problem/0249/   麦兜是个淘气的孩子.一天,他在玩钢笔的时候把墨水洒在了白色的墙上.再过一会,麦兜妈就要回来了, ...

  8. CentOS6.5实现rsync+inotify实时同步

    参考博文: 参考1:CentOS6.5实现rsync+inotify实时同步 参考2:inotify-tools+rsync实时同步文件安装和配置 CentOS 6.3下rsync服务器的安装与配置  ...

  9. Python 迭代器、生成器、递归、正则表达式 (四)

    一.迭代器&生成器 1.迭代器仅仅是一容器对象,它实现了迭代器协议.它有两个基本方法: 1)next 方法 返回容器的下一个元素 2)_iter_方法 返回迭代器自身.迭代器可以使用内建的it ...

  10. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...