Android学习之AppWidget高级效果

接着AppWidget基础学习,今天是一个“进阶版”的小例子,用来检验一下自己的学习效果。于是就做了一个掷骰子的Widget。

方便大家观看,先截图如下:

需要注意的是在drawable文件夹下有几张图片,我是在网上下载的别人的素材。

下面就开始我们的学习之旅吧。

第一步:
是在res/目录下创建一个名为xml的文件夹(其实名字是随意的,不必拘泥与这一个名字),然后在里面创建一个appwidget_info.xml文件,其作用就是向系统进行声明。

<appwidget-provider
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:minHeight="72dp"
  android:minWidth="294dp"
  android:updatePeriodMillis="86400000"
  android:initialLayout="@layout/app_widget_layout"
  >
</appwidget-provider>

 第二步:
对布局界面进行设置,我的设置如下app_widget_layout.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

  <ImageView
    android:id="@+id/imageview_widget"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher"
    />
  <Button
    android:id="@+id/button_widget"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="摇一摇"
    android:textColor="#6663c6"
    />

</LinearLayout>

第三步:
创建一个支撑widget的类,用来完成接下来的逻辑的操作,如下面的WidgetProvider.java.

package com.summer.mywidget;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;

public class WidgetProvider extends AppWidgetProvider{

  private static final String MY_UPDATE_ACTION="com.summer.APP_WIDGET_ACTION";

  /*
  *随机的获得一张图片的int值,为接下来的变换图片打基础
  */
  private static int getRandomPicture(){
    int[] pictureArray=new int[]{R.drawable.dice_1,R.drawable.dice_2,R.drawable.dice_3,
        R.drawable.dice_4,R.drawable.dice_5,R.drawable.dice_6};
    int RandomNumber=(int) ((Math.random()*100)%6);

    return pictureArray[RandomNumber];
  }

  /*
  *用于接收action,分支是区别于自定义ACTION和系统action的有效方式
  */
  @Override
  public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    String RESPONSEACTION=intent.getAction();
    Log.i("Summer", "------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+RESPONSEACTION);

    if(MY_UPDATE_ACTION.equals(RESPONSEACTION)){
      RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.app_widget_layout);

      remoteViews.setImageViewResource(R.id.imageview_widget,getRandomPicture());

      AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(context);
      ComponentName componentName=new ComponentName(context,WidgetProvider.class);
      appWidgetManager.updateAppWidget(componentName, remoteViews);
    }else{
      super.onReceive(context, intent);
    }
  }

  /*
  *用一个循环的方式是为了应对桌面上添加了好几个这样的Widget的情形
  */
  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager,
      int[] appWidgetIds) {
    // TODO Auto-generated method stub

    for(int i=0;i<appWidgetIds.length;i++){
      Intent intent=new Intent();
      intent.setAction(MY_UPDATE_ACTION);
      PendingIntent pendingIntent=PendingIntent.getBroadcast(context, -1, intent, 0);

      RemoteViews remoteViews=new RemoteViews(context.getPackageName(),R.layout.app_widget_layout);
      remoteViews.setOnClickPendingIntent(R.id.button_widget,pendingIntent);
      appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
  }

  @Override
  public void onDeleted(Context context, int[] appWidgetIds) {
    // TODO Auto-generated method stub
    super.onDeleted(context, appWidgetIds);
    System.out.println("my app widget ----------------------------->>>>>>>onDeleted");
  }

  @Override
  public void onEnabled(Context context) {
    // TODO Auto-generated method stub
    System.out.println("my app widget ----------------------------->>>>>>>onEnabled");
    super.onEnabled(context);
  }

  @Override
  public void onDisabled(Context context) {
    // TODO Auto-generated method stub
    System.out.println("my app widget ----------------------------->>>>>>>onDisabled");
    super.onDisabled(context);
  }

}

 第四步:
在清单文件Manifest.xml文件中进行相关项的声明。详如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.summer.mywidget"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.summer.mywidget.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

    <receiver
      android:name="com.summer.mywidget.WidgetProvider">
      <intent-filter >
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
      </intent-filter>
      <intent-filter >
        <action android:name="com.summer.APP_WIDGET_ACTION"></action>
      </intent-filter>
      <meta-data
        android:name="android.appwidget.provider"
        android:resource="@xml/appwidget_info">
      </meta-data>
    </receiver>
  </application>

</manifest>

 第五步:
大功告成,运行一下代码,然后手工的进行app_Widget 的添加,然后你就可以拥有一款”骰子“咯。

总结:

这个小程序虽说是实现了,但是仍然不是比较复杂。需要对广播消息等知识有一定的了解。
改进方向:给每次的点击事件完成时添加动画效果,以获得更好地用户体验。(需要借助于RemoteViews内的相关的方法)。
代码中不可避免的会出现一些错误和不足之处,希望广大博友看到后予以指出,希望能和你们一起进步!

(0)

相关推荐

  • 简单掌握Android Widget桌面小部件的创建步骤

    一.Widget设计步骤 需要修改三个XML,一个class: 1.第一个xml是布局XML文件(如:main.xml),是这个widget的.一般来说如果用这个部件显示时间,那就只在这个布局XML中声明一个textview就OK了. 2.第二个xml是widget_provider.xml,主要是用于声明一个appwidget的.其中,Layout就是指定上面那个main.xml. 3.第三个xml是AndroidManifest.xml,注册broadcastReceiver信息. 4.最后

  • Android UI组件AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下图所示: 点击上图中箭头处的widgets图标,会出现如下界面:(都是widget) 长按上图中的任意一个widget,就可以将其放到桌面上. Widget的使用 Widget的实现思路  (1)在AndroidManifest中声明AppWidget:  (2)在xml目录中定义AppWidget

  • 基于Android AppWidgetProvider的使用介绍

    AppWidgetProvider 用来在HOME页面显示插件 实现步骤:1.为AppWidget提供一个元布局文件AppWigdetProvider_Provider.xml,用来显示Widget的界面.2.创建一个类继承自AppWidgetProvider,并覆写里面的相关的方法.3.为WidgetProvider创建一个引用的布局文件,或者直接用main.xml.4.在程序中注册Manifest.xml. 代码如下: 1.在res/xml/文件夹下创建AppWigdetProvider_P

  • Android开发入门之Appwidget用法分析

    本文实例讲述了Android Appwidget用法.分享给大家供大家参考,具体如下: App Widgets 是一个小型应用程序的View  他可以嵌入到其他应用程序中(如 桌面程序) 并且可以得到周期性刷新. 在创建App Widget之前需要了解以下几个概念 AppWidgetProviderInfo对象 它是对App Widget 元数据的一个描述,譬如 AppWidget的布局,刷新频率,以及   AppWidgetProvider 类  这些元数据都是定义在XML中. AppWidg

  • 讲解Android中的Widget及AppWidget小工具的创建实例

    1.Widget .App Widget .Web App 的概念 Widget最初的概念是98年一个叫Rose的苹果工程师提出,直到2003年的时候才正式为大家所知,不过随后无数大公司都开始接受并应用这一思路. 现在我们看到在苹果系统里按下F4弹出的Dashboard里的小工具叫Widget,在Windows 7里侧边栏上的那些漂亮的小工具叫Gadget(widget变体?),除此以外还有yahoo Widget等等Widget产品.他们有一个共同的特点就是采用前台Web开发用的技术(譬如HT

  • Android学习之AppWidget笔记分享

    什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作. 今天的目标就是怎么创建一个简单的AppWidget. 首先我先把目录结构展示一下,方便大家理解. 第一步:我们需要在res目录下创建一个folder,可以命名为xml(但这并不是必须的,你也可以换成你喜欢的名字).然后在这么目录下创建一个xml文件.我的appwidget.xml文件代码如下: <appwidget-provider xmlns:androi

  • Android之AppWidget(桌面小部件)开发浅析

    什么是AppWidget AppWidget 即桌面小部件,也叫桌面控件,就是能直接显示在Android系统桌面上的小程序,先看图: 图中我用黄色箭头指示的即为AppWidget,一些用户使用比较频繁的程序,可以做成AppWidget,这样能方便地使用.典型的程序有时钟.天气.音乐播放器等.AppWidget 是Android 系统应用开发层面的一部分,有着特殊用途,使用得当的化,的确会为app 增色不少,它的工作原理是把一个进程的控件嵌入到别外一个进程的窗口里的一种方法.长按桌面空白处,会出现

  • Android中的AppWidget入门教程

    什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作.本篇打算从以下几个点来介绍AppWidget: 1.如何创建一个简单的AppWidget 2.如何使得AppWidget与客户端程序交互 创建简单的AppWidget 在介绍之前给大家看一下程序运行的最后结果和项目结构图,以便大家有个整体的印象. 运行结果图: 项目结构图: 第一步: 首先在res文件夹下新建一个名字为xml的文件夹,然后在xml目录下创建一个

  • Android编程之桌面小部件AppWidgetProvider用法示例

    本文实例讲述了Android编程之桌面小部件AppWidgetProvider用法.分享给大家供大家参考,具体如下: /** * 桌面小部件 AppWidget配置 * * @description: * @author ldm * @date 2016-5-16 下午1:57:16 */ public class ExampleAppWidgetConfigure extends Activity { static final String TAG = "ExampleAppWidgetCon

  • Android学习之AppWidget高级效果

    接着AppWidget基础学习,今天是一个"进阶版"的小例子,用来检验一下自己的学习效果.于是就做了一个掷骰子的Widget. 方便大家观看,先截图如下: 需要注意的是在drawable文件夹下有几张图片,我是在网上下载的别人的素材. 下面就开始我们的学习之旅吧. 第一步: 是在res/目录下创建一个名为xml的文件夹(其实名字是随意的,不必拘泥与这一个名字),然后在里面创建一个appwidget_info.xml文件,其作用就是向系统进行声明. <appwidget-provi

  • Android仿抖音主页效果实现代码

    写在前面 各位老铁,我又来啦!既然来了,那肯定又来搞事情啦,话不多说,先上图! "抖音"都玩过吧,是不是很好玩,我反正是天天刷,作为一个非著名的Android低级攻城狮,虽然技术菜的一匹,但是也经常刷着刷着会思考:咦?这玩意是用哪个控件做的?这个效果是咋实现的啊?由于本人技术水平有限,所以今天咱就先挑个比较简单的来看看是如何实现的,思考再三,我们就拿抖音首页的这个效果来练练手吧,话不多说,开搞! 一.准备工作 我们先不急着写代码,先对抖音的这种效果做一个简单的分析,首先需要明确的是它是

  • Android仿微信底部菜单栏效果

    前言 在市面上,大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理,通常都是分为3-5个大模块,从而正确有效地引导用户去使用我们的APP.实现底部菜单栏的方法也有很多种. 1.仿微信底部菜单栏(ViewPager+ImagerView+TextView) ......(其他方式后续会补充) 效果预览 首先来个开胃菜,看看实现效果: 先贴出项目所需的资源文件,这些可随个人自由更改颜色和文字 colors.xml <color name="bg_line_light_gray&quo

  • Android基于TextView属性android:ellipsize实现跑马灯效果的方法

    本文实例讲述了Android基于TextView属性android:ellipsize实现跑马灯效果的方法.分享给大家供大家参考,具体如下: Android系统中TextView实现跑马灯效果,必须具备以下几个条件: 1.android:ellipsize="marquee" 2.TextView必须单行显示,即内容必须超出TextView大小 3.TextView要获得焦点才能滚动 XML代码: android:ellipsize="marquee", andro

  • Android实现图片轮播效果的两种方法

    大家在使用APP的过程中,经常会看到上部banner图片轮播的效果,那么今天我们就一起来学习一下,android中图片轮询的几种实现方法: 第一种:使用动画的方法实现:(代码繁琐) 这种发放需要:两个动画效果,一个布局,一个主类来实现,不多说了,来看代码吧: public class IamgeTrActivity extends Activity { /** Called when the activity is first created. */ public ImageView image

  • Android空心圆及层叠效果实现代码

    本文实例为大家分享了Android空心圆及层叠效果的具体代码,供大家参考,具体内容如下 package com.bwei.test.zidingyiview2; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import an

  • Android学习项目之简易版微信为例(二)

    1 概述 从这篇开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样,需要从main开始写代码逻辑,大部分逻辑控制代码都由自己来实现.事实上,Android已经为我们提供了一个程序运行的框架,我们只需要往框架中填入我们所需的内容即可,这里的内容主要是:四大组件--Activity.Service.ContentProvider.BroadCast.在这四大组件中,可以实现

  • Android实现字母雨的效果

    首先来看效果: 一.实现原理 在实现过程中,主要考虑整个界面由若干个字母组成的子母线条组成,这样的话把固定数量的字母封装成一个字母线条,而每个字母又封装成一个对象,这样的话,就形成了如下组成效果: 字母对象-->字母线条对象-->界面效果 每个字母都应该知道自己的位置坐标,自己上面的字母.以及自己的透明度: class HackCode{ Point p = new Point();//每一个字母的坐标 int alpha = 255;//透明度值 默认255 String code = &q

  • Android EasyBarrage实现轻量级弹幕效果

    本文介绍了Android EasyBarrage实现轻量级弹幕效果,分享给大家,具体如下: 概述 EasyBarrage是Android平台的一种轻量级弹幕效果目前支持以下设置: 自定义字体颜色,支持随机颜色: 自定义字体大小,支持随机字体大小: 支持边框显示,用于区分自己的弹幕和其他弹幕: 自定义边框颜色: 弹幕数据是否允许重复: 自定义单屏显示的最大弹幕数量: 数据不重叠: 支持动态添加弹幕: 不依赖VideoView,数据自动循环显示. github:https://github.com/

随机推荐