我的Android进阶之旅------>Android Widget 桌面数字时钟(DigtalClockWidget)实例

step1:新建项目DigtalClockWidget,并将显示时间的图片导入到drawable文件夹目录下:

                                                       

                                                   各个图片如下:

                                                                                              

step2:编写Widget的UI界面

a.  /xml/appwidget_provider.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
     指定该桌面组件的基本配置信息:
	minWidth:桌面小控件的最小宽度。
	minWidth:桌面小控件的最小高度。
	updatePeriodMillis:更新频率
	initialLayout:初始时显示的布局

-->
<!--指定该Widget的布局界面为@layout/main-->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/main"
    android:minHeight="30px"
    android:minWidth="300px"
    android:updatePeriodMillis="500"
   />

b./layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/digit" android:layout_width="fill_parent"
	android:layout_height="fill_parent" android:orientation="horizontal"
	android:gravity="center">

	<!-- 定义19个ImageView来显示液晶数字 -->

	<ImageView android:id="@+id/img01" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img02" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img03" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img04" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img05" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:src="@drawable/digity" />

	<ImageView android:id="@+id/img06" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img07" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img08" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:src="@drawable/digity" />

	<ImageView android:id="@+id/img09" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img10" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img11" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:src="@drawable/digite" />

	<ImageView android:id="@+id/img12" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img13" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img14" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:src="@drawable/digit" />

	<ImageView android:id="@+id/img15" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img16" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />

	<ImageView android:id="@+id/img17" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:src="@drawable/digit" />

	<ImageView android:id="@+id/img18" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:src="@drawable/digit" />

	<ImageView android:id="@+id/img19" android:layout_width="wrap_content"
		android:layout_height="wrap_content" />
</LinearLayout>

step3:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="cn.roco.widget.clock" android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk android:minSdkVersion="8" />
        <uses-permission android:name="android.permission.CALL_PHONE"/>
	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<!-- 指定广播接受者 -->
		<receiver android:name="TimeWidgetProvider">
			<intent-filter>
				<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
			</intent-filter>
			<meta-data android:name="android.appwidget.provider"
				android:resource="@xml/appwidget_provider" /><!-- 指定provider -->
		</receiver>
		<!-- 指定时钟服务 -->
		<service android:name=".TimeService" />
	</application>
</manifest>

step4:TimeService.java

package cn.roco.widget.clock;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.IBinder;
import android.widget.RemoteViews;

public class TimeService extends Service {
	// 将0~9的液晶数字图片定义成数组
	private int[] digits = new int[] { R.drawable.digit00, R.drawable.digit01,
			R.drawable.digit02, R.drawable.digit03, R.drawable.digit04,
			R.drawable.digit05, R.drawable.digit06, R.drawable.digit07,
			R.drawable.digit08, R.drawable.digit09, };

	// 将显示年 月 日 小时、分钟、秒钟的ImageView定义成数组
	private int[] digitViews = new int[] { R.id.img01, R.id.img02, R.id.img03,
			R.id.img04, R.id.img06, R.id.img07, R.id.img09, R.id.img10,
			R.id.img12, R.id.img13, R.id.img15, R.id.img16, R.id.img18,
			R.id.img19 };

	private Timer timer;

	private TimerTask timerTask = new TimerTask() {
		@Override
		public void run() {

			/** 获取并格式化当前时间 */
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			String time = sdf.format(new Date());
			/** 获得显示时间的View */
			RemoteViews views = new RemoteViews(getPackageName(), R.layout.main);
			for (int i = 0; i < time.length(); i++) {
				// 将第i个数字字符转换为对应的数字
				int num = time.charAt(i) - 48;
				// 将第i张图片设为对应的液晶数字图片
				views.setImageViewResource(digitViews[i], digits[num]);
			}
			/** 调用拨号程序 */
			Intent intent = new Intent(Intent.ACTION_VIEW,
					Uri.parse("tel:10086"));
			PendingIntent pendingIntent = PendingIntent.getActivity(
					getApplicationContext(), 0, intent, 0);
			views.setOnClickPendingIntent(R.id.digit, pendingIntent);

			/** 更新时间的显示 */
			AppWidgetManager appWidgetManager = AppWidgetManager
					.getInstance(getApplicationContext());
			// 将AppWidgetProvider子类实例包装成ComponentName对象
			ComponentName componentName = new ComponentName(
					getApplicationContext(), TimeWidgetProvider.class);
			// 调用AppWidgetManager将remoteViews添加到ComponentName中
			appWidgetManager.updateAppWidget(componentName, views);
		}
	};

	@Override
	public void onCreate() {
		super.onCreate();
		// 定义计时器
		timer = new Timer();
		// 启动周期性调度
		timer.schedule(timerTask, 0, 1000);
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		timer.cancel();
		timer = null;
	}

}

step5:TimeWidgetProvider.java

package cn.roco.widget.clock;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
public class TimeWidgetProvider extends AppWidgetProvider {

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
	}

	/** 当用户从桌面上删除widgets的时候被调用 */
	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
	}

	/**
	 * 第一次往桌面添加Widgets的时候才会被调用,
	 * 往后往桌面添加同类型的widgets时候不会被调用
	 */
	@Override
	public void onEnabled(Context context) {
		//启动服务
		context.startService(new Intent(context, TimeService.class));
	}

	/** 最后一个同类型widgets实例被删除的时候调用 */
	@Override
	public void onDisabled(Context context) {
		//停止服务
		context.stopService(new Intent(context, TimeService.class));
	}
}

step6:部署应用到模拟器上,部署完成后打开该Widget

       

应用的效果图如下:

   ==================================下面看一个gif动画===========================================

                        

该项目的源码在:http://pan.baidu.com/share/link?shareid=403033&uk=805959799

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

==================================================================================================

时间: 2024-10-26 02:46:37

我的Android进阶之旅------&gt;Android Widget 桌面数字时钟(DigtalClockWidget)实例的相关文章

我的Android进阶之旅------&amp;gt;Android利用温度传感器实现带动画效果的电子温度计

     要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight属性的合理运用,关于android:layout_weight属性的讲解,可以参考:<我的Android进阶之旅------>关于android:layout_weight属性的一个面试题> 地址为:http://blog.csdn.net/ouyang_peng/article/

我的Android进阶之旅------&amp;gt;Android疯狂连连看游戏的实现之状态数据模型(三)

对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游戏逻辑的重要步骤. 1.定义数据模型 连连看的界面是一个NxM的"网格",每个网格上显示一张图片.而这个网格只需要一个二维数组来定义即可,而每个网格上所显示的图片,对于底层数据模型来说,不同的图片对于着不同的数值即可. 对于上图所示的数据模型,只要让数值为0的网格上不绘制图片,其他数值的网

我的Android进阶之旅------&amp;gt;Android疯狂连连看游戏的实现之开发游戏界面(二)

连连看的游戏界面十分简单,大致可以分为两个区域: 游戏主界面区 控制按钮和数据显示区 1.开发界面布局 本程序使用一个RelativeLayout作为整体的界面布局元素,界面布局上面是一个自定义组件,下面是一个水平排列的LinearLayout. 下面是本程序的布局文件:/res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=

我的Android进阶之旅------&amp;gt;Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法会随机从res/drawable目录中取得N张图片. 下面是res/drawable目录视图: 为了让getPlayImages()方法能随机从res/drawable目录中取得N张图片,具体实现分为以下几步: 通

我的Android进阶之旅------&amp;gt; Android为TextView组件中显示的文本添加背景色

通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article/details/46916963)      我们学会了在TextView中显示图片的方法,现在我们来学习如何为TextView组件中显示的文本添加背景色.要求完成的样子如图所示: 首先来学习使用BackgroundColorSpan对象设置文字背景色,代码如下: TextView textView=(

我的Android进阶之旅------&amp;gt;Android权限参考大全

访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内 访问定

我的Android进阶之旅------&amp;gt;Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法

我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 96% F5 95% F2 94% F0 93% ED 92% EB 91% E8 90% E6 89% E3 88% E0 87% DE 86% DB 85% D9 84% D6 83% D4 82% D1 81% CF 80% CC 79% C9 78% C7 77% C4 76% C2 75% B

我的Android进阶之旅------&amp;gt;Android颜色值(RGB)所支持的四种常见形式

Android中颜色值是通过红(Red).绿(Green).蓝(Blue)三原色,以及一个透明度(Alpha)值来表示的,颜色值总是以井号(#)开头,接下来就是Alpha-Red-Green-Blue的形式.其中Alpha值可以省略,如果省略了Alpha的值,那么该颜色默认是完全不透明的. Android的颜色值支持常见的四种形式如下所示: #RGB:分别指定红.绿.蓝三原色的值(只支持0~f这16级颜色)来代表颜色. #ARGB:分别指定红.绿.蓝三原色的值(只支持0~f这16级颜色)及透明度

我的Android进阶之旅------&amp;gt;Android疯狂连连看游戏的实现之游戏效果预览(一)

今天看完了李刚老师的<疯狂Android讲义>一书中的第18章<疯狂连连看>,从而学会了如何编写一个简单的Android疯狂连连看游戏.      开发这个流行的小游戏,难度适中,而且能充分激发学习热情,适合Android初学者来说是一个不错的选择.对于该游戏的开发,需要重点掌握单机游戏的界面分析和数据建模能力:游戏玩家严重看到的是游戏界面,但是在开发者眼中看到的应该是数据模型.除此之外,单机游戏通常需要一个比较美观的界面,需要通过自定义View来实现游戏主界面.      开发连