Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)
下面我们研究一下如何实现一个数字液晶时钟,本质属于特效一种哈。
首先创建一个布局文件:
<?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)相关推荐
- Android实战简易教程-第七十五枪(WIFI直连工具类)
设置指定的WIFI用户名密码和加密方式,可以进行WIFI直连. 1.工具类-WifiUtil.java: package demo.androidwar.com.myapplication;impor ...
- Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)
用户注册或者找回密码时一般会用到短信验证功能,这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注册用户.获取SDK 大家可以 ...
- Android实战简易教程-第六十枪(分享一个城市选择功能模块)
在做一些APP的时候可能会用到城市选择模块的功能,本实例可以提供位置自定定位和手动选择的功能,非常好用,大家可以修改后加入自己的项目中. 首先看一下效果: 1.进入有的手机可能会提示权限要求,这时我们 ...
- Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)
学习Android有一段时间了,对服务器端有很深的好奇,决定对服务器端的实现进行一些研究,这里实现了一个简单的小例子,用于获取服务器端的json数据,例子很简单,适合初学者学习使用. 服务器端 首先我 ...
- Android实战简易教程-第三十六枪(监听短信-实现短信验证码自动填入)
一般用户喜欢用手机号作为用户名注册APP账号,这时一般都是通过手机验证码的方式进行验证,下面我们就研究一个非常实用的方法,通过监听短信-实现短信验证码的自动填入,提高用户体验. 首先我们看一下如何监听 ...
- Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)...
上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...
- Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)
前段时间写过一篇文章:Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)有的同学留言建议,可不可以动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容 ...
- Android实战简易教程-第五十枪(工具类的测试)
在开发中,为了提高开发效率,我们一般会自定义自己的工具类.为了保证项目的可靠性,在将工具类引入项目之前,我们一般都会对工具类进行单元测试,下面我们通过一个实例看一下如何搭建测试环境. 1.首先自定义一 ...
- Android实战简易教程-第五十七枪(分享小米手电筒源码)
手电筒功能实现简单很实用,下面我们就来研究一下如何自制一款手电筒小程序,初学者可以通过实例了解原理,提高学习android技术的热情和动力. 首先我们了解一下手电筒要调用哪些android权限: &l ...
最新文章
- Python安装及netcdf数据读写
- selenium提取数据之driver对象定位标签元素获取标签对象的方法
- Nginx if 条件判断
- 【C语言项目】贪吃蛇游戏(上)
- arm rtx教程_ARM CMSIS标准概述及快速入门
- 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数
- Echarts多任务可视化之再优化
- python中tkinter的使用-中
- 用户zabbix@localhost的访问被拒绝(使用密码:yes)_Coinbase意外地保存了3420个客户的未加密密码...
- 超越MobileNet v3!华为诺亚、北大提出GhostNet​,使用线性变换生成特征图
- Spring事务—方法调用事务回滚
- CPUID — CPU Identification
- 机器学习之类别不平衡问题 (2) —— ROC和PR曲线
- 太赞了!终于有人把怎么在IDEA中使用Java热部署插件JRebel讲清楚了...
- Git小乌龟的安装及使用
- 自定义封装无人值守Windows10镜像
- c / c++ 整数除法 保留小数及浮点型的比较
- 在线拍照功能JQuery.webCap.plugin 实现
- Linux-用户操作
- LogAnomaly: Unsupervised Detection of Sequential and Quantitative Anomalies in Unstructured Logs