android 讓TextView支持的Html標簽實現自定義時鍾顯示組件DigitalClock
默認的 DigitalClock顯示時分秒的,而且上午 下午 字體大小和時間一樣大,要實現的時鍾效果是只顯示時分,每分鍾更新一次,上午 下午字體小一號
用自定義 DigitalClock結合TextView的html功能實現。
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="28dip"
android:layout_marginTop="5dip"
android:layout_gravity="center"
android:gravity="center"
android:background="@drawable/watch">
<com.cyberblue.util.MyDigitalClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:layout_gravity="center"
android:gravity="center"
android:textStyle="bold"
android:textSize="29dip" />
</LinearLayout>
===========================================================
package com.cyberblue.util;
import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;
import java.util.Calendar;
/**
* Like AnalogClock, but digital. Shows seconds.
*
* FIXME: implement separate views for hours/minutes/seconds, so
* proportional fonts don't shake rendering
*/
public class MyDigitalClock extends TextView {
Calendar mCalendar;
private final static String m12 = "h:mm aa";
private final static String m24 = "k:mm";
private FormatChangeObserver mFormatChangeObserver;
private Runnable mTicker;
private Handler mHandler;
private boolean mTickerStopped = false;
String mFormat;
public MyDigitalClock(Context context) {
super(context);
initClock(context);
}
public MyDigitalClock(Context context, AttributeSet attrs) {
super(context, attrs);
initClock(context);
}
private void initClock(Context context) {
Resources r = context.getResources();
if (mCalendar == null) {
mCalendar = Calendar.getInstance();
}
mFormatChangeObserver = new FormatChangeObserver();
getContext().getContentResolver().registerContentObserver(
Settings.System.CONTENT_URI, true, mFormatChangeObserver);
setFormat();
}
@Override
protected void onAttachedToWindow() {
mTickerStopped = false;
super.onAttachedToWindow();
mHandler = new Handler();
/**
* requests a tick on the next hard-second boundary
*/
mTicker = new Runnable() {
public void run() {
if (mTickerStopped) return;
mCalendar.setTimeInMillis(System.currentTimeMillis());
String content = (String) DateFormat.format(mFormat, mCalendar);
if(content.split(" ").length > 1){
//用span style的方式不起作用--無法解析 <font size=\"1\" 也不起作用
content = content.split(" ")[0] + " <small><font size=\"1\" color=\"#66ccff\">" + content.split(" ")[1] + "</font></small>";
}
setText(android.text.Html.fromHtml(content));
invalidate();
long now = SystemClock.uptimeMillis();
//一分鍾更新一次
long next = now + (60*1000 - now % 1000);
mHandler.postAtTime(mTicker, next);
}
};
mTicker.run();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mTickerStopped = true;
}
/**
* Pulls 12/24 mode from system settings
*/
private boolean get24HourMode() {
return android.text.format.DateFormat.is24HourFormat(getContext());
}
private void setFormat() {
if (get24HourMode()) {
mFormat = m24;
} else {
mFormat = m12;
}
}
private class FormatChangeObserver extends ContentObserver {
public FormatChangeObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
setFormat();
}
}
}
================================================================
android TextView html
TextView textView=(TextView)findViewById(R.id.hello);
textView.setText(Html.fromHtml("Hello <b>World</b>,<font size=\"3\" color=\"red\">AnalysisXmlActivty!</font>"));
android 支持的Html標簽
<a href="..."> 定義鏈接內容
<b> 定義粗體文字 b 是blod的縮寫
<big> 定義大字體的文字
<blockquote> 引用塊標簽
屬性:
Common -- 一般屬性
cite -- 被引用內容的URI
<br> 定義換行
<cite> 表示引用的URI
<dfn> 定義標簽 dfn 是defining instance的縮寫
<div align="...">
<em> 強調標簽 em 是emphasis的縮寫
<font size="..." color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i> 定義斜體文字
<img src="...">
<p> 段落標簽,里面可以加入文字,列表,表格等
<small> 定義小字體的文字
<strike> 定義刪除線樣式的文字 不符合標准網頁設計的理念,不贊成使用. strike是strikethrough的縮寫
<strong> 重點強調標簽
<sub> 下標標簽 sub 是subscript的縮寫
<sup> 上標標簽 sup 是superscript的縮寫
<tt> 定義monospaced字體的文字 不贊成使用. 此標簽對中文沒意義 tt是teletype or monospaced text style的意思
<u> 定義帶有下划線的文字 u是underlined text style的意思
===============================================
另附:如何獲取Android系統時間是24小時制還是12小時制
ContentResolver cv = this.getContentResolver();
String strTimeFormat = android.provider.Settings.System.getString(cv,
android.provider.Settings.System.TIME_12_24);
if(strTimeFormat.equals("24"))
{
Log.i("activity","24");
}
----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
>
<!-- 定義模擬時鍾 -->
<AnalogClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<!-- 定義數字時鍾 -->
<DigitalClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14pt"
/>
</LinearLayout>