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" />  
        
    <TextView
        android: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
Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第1张图片
DX=0,DY=20
Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第2张图片
DX=20,DY=20
Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第3张图片
shadowRadius可以从下面三幅图看出是什么
R=3
Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第4张图片
R=10
Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第5张图片
R=40
Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第6张图片
通过这些效果可以直观的看出每个属性的含义。
下面自定义一个控件:
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() {

		@Override
		public 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")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_led);
		ledView = (LEDView) findViewById(R.id.ledview);
		
		  ActionBar actionBar = getActionBar();  
		  actionBar.setDisplayHomeAsUpEnabled(true); 
	}

	@Override
	protected void onResume() {
		super.onResume();
		ledView.start();//调用开始
	}

	@Override
	protected void onStop() {
		super.onStop();
		ledView.stop();//暂停
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_led, menu);
		return true;
	}

}

运行实例如下:

Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)_第7张图片

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

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

源码下载



你可能感兴趣的:(android,自定义view,液晶时钟)