Android自訂View之群組控制項 ---- LED數字時鐘
先
LEDView效果。
之前看到一篇部落格使用兩個TextView實現了該效果,於是我想用自訂控制項的方式實現一個LEDView,使用時即可直接使用該控制項。
採用群組控制項的方式,將兩個TextView疊放在一起,再使用digital-7.ttf字型來顯示資料,從而達到LED的效果。代碼如下:
LEDView.class
package ione.zy.demo;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);}}
ledview.xml檔案
控制項使用Demo
package ione.zy.demo;import android.os.Build;import android.os.Bundle;import android.view.Menu;import android.annotation.SuppressLint;import android.annotation.TargetApi;import android.app.ActionBar;import android.app.Activity;@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;}}
activity_led.xml