Android编程之动态壁纸实例分析

本文实例讲述了Android编程之动态壁纸。分享给大家供大家参考,具体如下:

从android 2.1版本起引入了动态壁纸的概念,熟悉android的人一定不会陌生。这里解释一个动态壁纸是怎么形成又是怎么工作的。

首先动态桌面的动态体现出这个组件是实时变化的,也就是说有一个后台在不停的刷新这个组件。联想到后台组件首先想到的就是service,从代码角度看,果然如此。每一个动态桌面都继承自WallpaperService,其中必须实现的抽象方法onCreateEngine,返回一个Engine对象,实际上所有的绘图与刷新都是由engine完成,service正是提供engine的部分。

打个比方说,在我们设置一个动态壁纸时有预览,这时启动了一个预览的engine来绘制与刷新,当我们设置了壁纸以后又启动了一个填充整个桌面的engine在实时的绘制与刷新。所以动态壁纸的重点在engine里,这里等下提及。

现在着手创建一个动态壁纸。

第一步创建我们的WallpaperService类,同样在其中创建engine类,engine是WallpaperService的内部类。其中engine中关键的方法有

引用

代码如下:

onCreate(SurfaceHolder surfaceHolder)

有了surfaceholder我们可以获得canvas对象,有了canvas我们就可以绘图

引用

代码如下:

onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep,float yOffsetStep, int xPixelOffset, int yPixelOffset)

屏幕滑动的时候触发此方法

xOffset可以用来判断屏幕序号 百分比的形式,举例说如果你手机上有5个分屏,第一屏这里是0.000,第二屏是0.2000 第三屏是0.4000以此类推
xOffsetStep从字面意义就能理解是步进 同样和你的分屏数有关 如果你的分屏数为5 则每次步进xOffsetStep都是0.20000
xPixelOffset就是实际上像素的移动距离,也就是说移动了多少像素,奇怪的是这里左右移动像素点的offset都为负数

引用

代码如下:

public void onVisibilityChanged(boolean visible)

当动态壁纸的可见性发生变化时触发此方法,举例说在桌面上时,动态壁纸的visibility为true,当你运行某个程序的时候动态壁纸的visibility变为false,这里很好理解

引用

代码如下:

public Bundle onCommand(String action, int x, int y, int z, Bundle extras, boolean resultRequested)

可以监听点击事件,点击时触发此方法,action为 android.wallpaper.tap,x记录了横坐标,y记录了纵坐标,z的作用未知,可能是为3d桌面预留下的? 没有试验过,z一般为0
还有一些重要的生命周期方法,和activity类似,就不多说了。

当你要将一个app定义为动态壁纸时,首先需要在AndroidManifest.xml中进行指定,前面提到过,动态壁纸是从 android 2.1 开始支持,所以需要添加

引用

代码如下:

<uses-sdk android:minSdkVersion="7" />

由于还要对系统说明这是一个动态壁纸,我们还要加入

代码如下:

<uses-feature android:name="android.softwate.live_wallpaper"/>

除此之外,由于我们运行了service,所以同样需要对service进行配置
引用

<service android:name="LiveWallService" android:label="My_live _wallpaper" android:permission="android.permission.BIND_WALLPAPER" >
  <intent-filter>
   <action android:name="android.service.wallpaper.WallpaperService" />
  </intent-filter>
  <meta-data android:name="android.service.wallpaper" android:resource="@xml/livepaper"/>
</service>

比较重要的部分首先是权限android:permission="android.permission.BIND_WALLPAPER"
其次service需要响应action

代码如下:

android:name="android.service.wallpaper.WallpaperService

再就是配置文件了

代码如下:

<meta-data android:name="android.service.wallpaper" android:resource="@xml/livepaper"/>

接下来接收配置文件。首先在res文件夹下建立一个xml目录,和写appwidget一样。
在目录下我们创建一个xml文件

<?xml version="1.0" encoding="utf-8"?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
 android:settingsActivity="LiveWallPreference"
 android:thumbnail="@drawable/ic_launcher"
 android:description="@string/wallpaper_description"
 />

wallpaper 是系统要求这么写的,带上命名空间。

引用

代码如下:

android:settingsActivity="LiveWallPreference"

指定配置动态壁纸的PreferenceActivity,这个PreferenceActivity同样需要在AndroidManifest.xml中注册,不过和一般的activity一样。当我们点击动态壁纸的设置按钮时,导向这个activity。不可缺少,否则点击设置会报错。

引用

android:thumbnail="@drawable/ic_launcher"
android:description="@string/wallpaper_description"

第一个图标对应动态壁纸列表中的图标,第二条description则是图标右边你创建的动态壁纸的名字。

至此动态壁纸的框架就算完成了。接下来只需要在wallpaperservice类中加入刷新机制,加入动态内容,一个动态桌面就完成了。

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android自定义Button并设置不同背景图片的方法

    本文实例讲述了Android自定义Button并设置不同背景图片的方法.分享给大家供大家参考,具体如下: 1.自定义MyButton类 public class MyButton extends Button { //This constructormust be public MyButton(Context context, AttributeSet attrs) { super(context, attrs); } public MyButton(Context context) { su

  • android动态壁纸调用的简单实例

    调用后动态壁纸其实是显示在Activity的后面,而Activity则是透明显示,这样就可以看到下面的动态壁纸,如果Activity不是透明的则什么也看不到. 代码中有用到两个接口 IWallpaperService mService; IWallpaperEngine mEngine; 我们可以看到该目录下面有三个aidl接口,分别是 复制代码 代码如下: interface IWallpaperConnection { void attachEngine(IWallpaperEngine e

  • Android设置桌面背景图片的实现方法

    1.设置桌面背景图片的方法 复制代码 代码如下: Resources res=getResources(); BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.icon); Bitmap bmp=bmpDraw.getBitmap(); try{ setWallpaper(bmp); }catch(IOException e) { e.printStackTrace(); } 2.在manifest中增加设置桌面的

  • Android编程之手机壁纸WallPaper设置方法示例

    本文实例讲述了Android编程之手机壁纸WallPaper设置方法.分享给大家供大家参考,具体如下: /** * Andorid设置手机屏幕的壁纸 * * @description: * @author ldm * @date 2016-5-4 下午3:08:56 */ public class SetWallpaperActivity extends Activity { // WallpaperManager类:系统壁纸管理.通过它可以获得当前壁纸以及设置指定图片作为系统壁纸. priva

  • Android实现手机壁纸改变的方法

    本文实例讲述了Android实现手机壁纸改变的方法.分享给大家供大家参考.具体如下: main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" androi

  • android中实现背景图片颜色渐变方法

    常用,记录一下. 效果图: 首先新建xml文件  bg_gradient.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <shape xmlns:android="http://schemas.android.com/apk/res/android" >        <gradient          android:startColor="

  • android 自定义ScrollView实现背景图片伸缩的实现代码及思路

       用过多米音乐的都市知道, 这个UI可以上下滑动,作用嘛---无聊中可以划划解解闷,这被锤子公司老罗称谓为"情怀",其实叫"情味"更合适.嘿嘿.如今挪动互联网开展这么迅速,市场上已不再是那早期随便敲个APP放上架就能具有几十万用户的阶段了.近来苹果公司,为了怕android下载量赶超苹果商店,大势宣称:(第 500 亿个下载应用的用户就能够获得 10,000 美元的 iTunes 礼品卡,除此之外,紧随第 500 亿以后的前 50 名用户也可以获得 500 美元

  • Android 背景图片的缩放实现

    Android 背景图片的缩放 ONE Goal ,ONE Passion ! 我们看到一些效果,控件中的背景图片会慢慢变大,但是控件不会随着图片的放大而变大.效果如下: 分析: 想让图片变大,而且控件本身大小不能改变,那么就要改变图片自身大小,而不能改变控件大小. 实现原理: 1,首先拿到我们要放大的图片bitmap. 2,使用Bitmap.createBitmap().创建一个bitmap的副本. 3,使用matrix去改变图片副本本身大小 4,使用ValueAnimator去根据变化率将副

  • Android编程之书架效果背景图处理方法

    本文实例讲述了Android编程之书架效果背景图处理方法.分享给大家供大家参考,具体如下: 在android应用中,做一个小说阅读器是很多人的想法,大家一般都是把如何读取大文件,如果在滚动或是翻页时,让用户感觉不到做为重点.我也在做一个类似一功能,可是在做书架的时候,看了QQ阅读的书架,感觉很好看,就想做一个,前面一篇<android书架效果实现原理与代码>对此做了专门介绍,其完整实例代码可点击此处本站下载. 上面的例子很不错,可是有一个问题是他的背景图的宽必须是手机屏幕的宽,不会改变,这样感

  • Android编程之动态壁纸实例分析

    本文实例讲述了Android编程之动态壁纸.分享给大家供大家参考,具体如下: 从android 2.1版本起引入了动态壁纸的概念,熟悉android的人一定不会陌生.这里解释一个动态壁纸是怎么形成又是怎么工作的. 首先动态桌面的动态体现出这个组件是实时变化的,也就是说有一个后台在不停的刷新这个组件.联想到后台组件首先想到的就是service,从代码角度看,果然如此.每一个动态桌面都继承自WallpaperService,其中必须实现的抽象方法onCreateEngine,返回一个Engine对象

  • Android控件动态用法实例分析

    本文实例讲述了Android控件动态用法.分享给大家供大家参考.具体如下: 通常android里的界面布局都是在XML里设定好的 也就是说 在程序中,不能更改界面上的元素数量等, 比如聊天会话界面 当有人发言就要增加一个TextView,这就是动态增加控件,这就不能在XML里事先布局了! 不过还好,ANDROID使用控件也不是只有XML这一种方式 以下代码就是动态生产控件的JAVA程序 package com.fetion.android; import android.app.Activity

  • Android编程之消息机制实例分析

    本文实例讲述了Android编程之消息机制.分享给大家供大家参考,具体如下: 一.角色描述 1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里:或者接收Looper(从Message Queue取出)所送来的消息. 3. Message Queue(消息队列):用来存放线程放入的消息. 4.线程:UI thr

  • Android编程ViewPager回弹效果实例分析

    本文实例讲述了Android编程ViewPager回弹效果.分享给大家供大家参考,具体如下: 其实在我们很多应用中都看到当ViewPager滑到第一页或者最后一页的时候,如果再滑动的时候,就会有一个缓冲的过程,也就是回弹效果.之前在研究回弹效果的时候,也顺便实现了ViewPager的回弹效果,其实也很简单,一下是实现代码,注释比较少: package com.freesonfish.viewpager_2; import android.content.Context; import andro

  • Android编程之监听器用法实例分析

    本文实例讲述了Android编程之监听器用法.分享给大家供大家参考,具体如下: 这里通过监听内容提供者数据变化和监听发送短信进行讲解监听器.如果用户提供者数据发生了变化,监听器立刻就能收到对数据库操作的记录,而监听器是采用通知的机制,如果不采用通知的机制也可以做,那就是不断的查询数据库,这样的话效率就会很低.而采用通知机制的话,当用户向数据库发送一条记录,ContentObserver立刻就能获取到,我们就可以进行处理数据. 监听内容提供者数据的变化 1.在内容提供者中可以通知其他程序数据发生变

  • Android编程获取网络时间实例分析

    本文实例讲述了Android编程获取网络时间的方法.分享给大家供大家参考,具体如下: 在网上看到的最常见的方式有: public static void main(String[] args) throws Exception { URL url=new URL("http://www.bjtime.cn");//取得资源对象 URLConnection uc=url.openConnection();//生成连接对象 uc.connect(); //发出连接 long ld=uc.g

  • Android编程实现动态更新ListView的方法

    本文实例讲述了Android编程实现动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载. 布局main.xml: <?xml

  • Android编程实现动态支持多语言的方法

    本文实例讲述了Android编程实现动态支持多语言的方法.分享给大家供大家参考,具体如下: 资源文件values/strings.xml中添加 <string name="current_language">English</string> <string name="test">test</string> 创建values-en文件夹,添加资源文件 strings.xml: <resources> <

  • Android编程之蓝牙测试实例

    本文实例讲述了Android编程之蓝牙测试.分享给大家供大家参考.具体分析如下: 一.软件平台: win7 + eclipse + sdk 二.设计思路: 配合倒计时定时器实现蓝牙打开,可见,扫描三个功能 三.源代码: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

随机推荐