下面我们研究一下如何实现一个数字液晶时钟,本质属于特效一种哈。
首先创建一个布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><TextView  android:id ="@+id/ledview_clock_time"  android:layout_width ="wrap_content"  android:layout_height ="wrap_content"  android:layout_centerInParent="true"android:shadowColor ="#00ff00"  android:shadowDx ="0"  android:shadowDy ="0"  android:shadowRadius ="10"  android:textColor ="#00ff00"  android:textSize ="80sp" />  <TextViewandroid:id ="@+id/ledview_clock_bg"   android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_centerInParent="true"android:layout_gravity="center"  android:text="@string/default_time"  android:textColor="#3300ff00"  android:textSize="80sp" />  </RelativeLayout>

对于阴影的几个属性我们引用一下别人博客里的内容:(http://blog.csdn.net/whoispo/article/details/8061907)
Android的TextView的XML属性中有关于阴影的几条属性
shadowDX、shadowDy、shadowRadius,说明分别是阴影的横、纵坐标偏移,以及阴影的半径,这个不太好理解。一下的图可以实际说明这些的参数的内容。
shadowDx,shadowDy从下面三幅图可以看出是是什么
DX=20,Dy=0

DX=0,DY=20

DX=20,DY=20

shadowRadius可以从下面三幅图看出是什么
R=3

R=10

R=40

通过这些效果可以直观的看出每个属性的含义。
下面自定义一个控件:

package com.yayun.leddemo;import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;public class LEDView extends LinearLayout {private TextView timeView;private TextView bgView;private static final String FONT_DIGITAL_7 = "fonts" + File.separator+ "digital-7.ttf";//字体private static final String DATE_FORMAT = "%02d:%02d:%02d";//日期格式private static final int REFRESH_DELAY = 500;//刷新延迟private final Handler mHandler = new Handler();private final Runnable mTimeRefresher = new Runnable() {@Overridepublic void run() {Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));//时区final Date d = new Date();calendar.setTime(d);timeView.setText(String.format(DATE_FORMAT,calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE),calendar.get(Calendar.SECOND)));mHandler.postDelayed(this, REFRESH_DELAY);}};@SuppressLint("NewApi")public LEDView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init(context);}public LEDView(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public LEDView(Context context) {super(context);init(context);}private void init(Context context) {LayoutInflater layoutInflater = LayoutInflater.from(context);View view = layoutInflater.inflate(R.layout.ledview, this);timeView = (TextView) view.findViewById(R.id.ledview_clock_time);bgView = (TextView) view.findViewById(R.id.ledview_clock_bg);AssetManager assets = context.getAssets();//字体管家类final Typeface font = Typeface.createFromAsset(assets, FONT_DIGITAL_7);timeView.setTypeface(font);// 设置字体bgView.setTypeface(font);}public void start() {mHandler.post(mTimeRefresher);}public void stop() {mHandler.removeCallbacks(mTimeRefresher);}
}

新建一个Activity调用这个控件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".LEDActivity"android:background="@color/black" ><com.yayun.leddemo.LEDView android:id="@+id/ledview"android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_centerInParent="true"android:layout_gravity="center"  />  </RelativeLayout>
package com.yayun.leddemo;import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class LEDActivity extends Activity {private LEDView ledView;@SuppressLint("NewApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_led);ledView = (LEDView) findViewById(R.id.ledview);ActionBar actionBar = getActionBar();  actionBar.setDisplayHomeAsUpEnabled(true); }@Overrideprotected void onResume() {super.onResume();ledView.start();//调用开始}@Overrideprotected void onStop() {super.onStop();ledView.stop();//暂停}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_led, menu);return true;}}

运行实例如下:

录制显示问题,不知道为什么,大家可以自行运行查看效果。

喜欢的朋友关注我,谢谢!

源码下载

Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)相关推荐

  1. Android实战简易教程-第七十五枪(WIFI直连工具类)

    设置指定的WIFI用户名密码和加密方式,可以进行WIFI直连. 1.工具类-WifiUtil.java: package demo.androidwar.com.myapplication;impor ...

  2. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)

    用户注册或者找回密码时一般会用到短信验证功能,这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注册用户.获取SDK 大家可以 ...

  3. Android实战简易教程-第六十枪(分享一个城市选择功能模块)

    在做一些APP的时候可能会用到城市选择模块的功能,本实例可以提供位置自定定位和手动选择的功能,非常好用,大家可以修改后加入自己的项目中. 首先看一下效果: 1.进入有的手机可能会提示权限要求,这时我们 ...

  4. Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)

    学习Android有一段时间了,对服务器端有很深的好奇,决定对服务器端的实现进行一些研究,这里实现了一个简单的小例子,用于获取服务器端的json数据,例子很简单,适合初学者学习使用. 服务器端 首先我 ...

  5. Android实战简易教程-第三十六枪(监听短信-实现短信验证码自动填入)

    一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听 ...

  6. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)...

    上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...

  7. Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)

    前段时间写过一篇文章:Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)有的同学留言建议,可不可以动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容 ...

  8. Android实战简易教程-第五十枪(工具类的测试)

    在开发中,为了提高开发效率,我们一般会自定义自己的工具类.为了保证项目的可靠性,在将工具类引入项目之前,我们一般都会对工具类进行单元测试,下面我们通过一个实例看一下如何搭建测试环境. 1.首先自定义一 ...

  9. Android实战简易教程-第五十七枪(分享小米手电筒源码)

    手电筒功能实现简单很实用,下面我们就来研究一下如何自制一款手电筒小程序,初学者可以通过实例了解原理,提高学习android技术的热情和动力. 首先我们了解一下手电筒要调用哪些android权限: &l ...

最新文章

  1. Python安装及netcdf数据读写
  2. selenium提取数据之driver对象定位标签元素获取标签对象的方法
  3. Nginx if 条件判断
  4. 【C语言项目】贪吃蛇游戏(上)
  5. arm rtx教程_ARM CMSIS标准概述及快速入门
  6. 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数
  7. Echarts多任务可视化之再优化
  8. python中tkinter的使用-中
  9. 用户zabbix@localhost的访问被拒绝(使用密码:yes)_Coinbase意外地保存了3420个客户的未加密密码...
  10. 超越MobileNet v3!华为诺亚、北大提出GhostNet​,使用线性变换生成特征图
  11. Spring事务—方法调用事务回滚
  12. CPUID — CPU Identification
  13. 机器学习之类别不平衡问题 (2) —— ROC和PR曲线
  14. 太赞了!终于有人把怎么在IDEA中使用Java热部署插件JRebel讲清楚了...
  15. Git小乌龟的安装及使用
  16. 自定义封装无人值守Windows10镜像
  17. c / c++ 整数除法 保留小数及浮点型的比较
  18. 在线拍照功能JQuery.webCap.plugin 实现
  19. Linux-用户操作
  20. LogAnomaly: Unsupervised Detection of Sequential and Quantitative Anomalies in Unstructured Logs

热门文章

  1. 宝鸡7项改革重点:扩大电子签章应用,推进政务服务“一网通办”
  2. java项目部署方案模板_JavaWeb项目部署指南
  3. linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备
  4. 使用alist备份Obsidian文件,并实现全平台同步(webdav)
  5. 进入新阶段的全球科技革命
  6. 汽车4s店汽车销售企业网站源码 织梦dedecms模板
  7. 本地浏览器访问虚拟机中安装的elasticsearch,访问失败
  8. Linux内核文件系统
  9. 中国心灵慰籍音乐——紫色家园系列
  10. 百闻不如一见,4款名不见经传的极品软件,让你眼界大开