当前位置:操作系统 > 安卓/Android >>

Android 动态壁纸 Livepaer

动态壁纸原理 及 例子

  最近做动态壁纸的项目,原来觉得动态壁纸是个很小的项目,但是看到Android Market上有个专门的动态壁纸分类(现在升级为Google Play了), 而且自己做的这个项目可连接上服务器,供用户购买下载图片,终于有了自信,认识到这个不算是个小项目了。接下来我主要谈谈动态壁纸的原理,然后会解释一个“小球的例子”,供大家能深入的理解该原理。

  一:原理

  动态壁纸为:在手机上点击 Menu→Wall易做图s→Live wall易做图s→然后打开自己的程序。建个最简单的动态壁纸的步骤如下:

  1.在rex/xml中新建一个.xml.其中注册一个wall易做图.假设这个名字为ab.xml(下文要用到,可随意设置,没要求)

  <wall易做图  xmlns:android="http://schemas.android.com/apk/res/android" />最简单的就是写这一句,这样的话打开动态壁纸就会出现只出现一个按钮(左图),一般我们不这样做,要像右图这样子。

 

 \ \


若动态壁纸"设置..."(Setting...)你想连接Activity,也在这里指定,比如:

android:settingsActivity="com.birbeck.wall易做图slideshow.SettingsActivity"(这个一般是继承了PreferenceActivity类的Activity。就是首选项模式的类),要设置了这个属性,就会如有图所示了。

  \


 

如上截图是手机上的动态壁纸列表,你也可以通过android:description=“XXX”来设置描述,通过anroid:thumbnail="XX"来设置该动态壁纸的图片。

  2.接下来要在manifest中注册一个service。

  <service>

    XXX

  </service>

  在这个servier中要指定你继承Wall易做图Service类的路径,指定1中设置的xml,设置广播,设置允许权限等。比如:

  通过android:name="com.bn.ex12f.Sample12_6_WallPaper"指定继承Wall易做图Service的类 ,

  通过android:permission="android.permission.BIND_WALLPAPER">允许动态壁纸权限。

  这一种还必须设置一个<intent-filter>,用来监听Android系统发出的动态壁纸的广播。

  还要通过<meta-data android:name="android.service.wall易做图" android:resource="@xml/ab" />.这篇文章中主要讲原理和重要的点,源码我会附上的。

  3.就是实现继承了WallpaerService的类了。只需要重写Wall易做图Serviced的onCreateEngine方法。

  @Override
  public Engine onCreateEngine()
  {
    ce=new BallEngine();(class BallEngine extends Engine{...})
    return ce;
  }

  在这个方法里只需返回一个Engine的子类对象就可以了。所以重头戏,写动态壁纸程序的主要工作量就是实现Engine的子类。

  4.实现Engine的子类

  简而言之,该类的作用就是让你去实现动态壁纸的具体代码。以上三点可认为是格式化的一些东西。这个类不需要强制继承任何方法,现在简述一下一般要重写的方法的功能。

  public void onCreate(Su易做图ceHolder su易做图ceHolder){...}

  public void onDestroy(){...}这俩方法就不说明了

  public void onVisibilityChanged(boolean visible)

  {
    if(visible)//如果可见
    {
    ...
    }
    else//如果不可见
    {

    ...
    }
  }该方法作用是当前动态壁纸可见时要画图。重写这个方法一般如以上格式所示。

  

  public void onSu易做图ceCreated(Su易做图ceHolder holder) //重写onSu易做图ceCreated方法
  {
    super.onSu易做图ceCreated(holder);//调用父类对应方法
  }该方法是应用程序第一次创建时要调用。可在这个方法里调用父类对应方法。该方法执行完毕后系统会立即调用onSu易做图ceChanged方法(如下)。若在这里调用父类对应方法,那么就在onSu易做图ceChanged中实现主要功能。

  public void onSu易做图ceChanged(Su易做图ceHolder holder, int format, int width, int height)

  {

  ...

  }该方法有两个用处。1.若动态壁纸要随着横屏竖屏而切换可在这里写。2.想和用户交互的话,比如用户滑动屏幕时,点击屏幕时等。3.注意:onSu易做图ceCreated调用之后会立即调用该方法。

  这些就是动态壁纸原理的介绍。接下来是一个小例,希望大家能够喜欢。这个例子很简单。效果图如下:

  功能说明:黄 蓝 绿三个小球(截图不好,球显示不对)。碰到屏幕边的话会像谈到地面上一样,会返回。

  效果不错吧,你们会了吗? (代码虽然都附上了,但是资源,布局都没法附。博客园又不支持附件,还用原来的方法,想要代码,邮箱联系我:carman_loneliness@163.com )

 \


 

这个是继承了WallpaerService的类的代码。
  View Code
package com.bn.ex12f;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.service.wall易做图.Wall易做图Service;
import android.view.Su易做图ceHolder;

public class Sample12_6_WallPaper extends Wall易做图Service
{
    BallEngine ce;    //BallEngine的引用
    Handler hd = new Handler();//创建Handler对象
    Bitmap yellowBallBitmap;//黄球位图
    Bitmap blueBallBitmap;//蓝球位图
    Bitmap greenBallBitmap;//绿球位图
     @Override
    public Engine onCreateEngine() //重写onCreateEngine方法
    {
        ce=new BallEngine();   //创建 BallEngine对象
        return ce;//返回创建的对象
    }
     //初始化图片资源的方法
    public void initBitmap(){
        yellowBallBitmap=BitmapFactory.decodeResource(this.getResources(), R.drawable.yellowball);//初始化黄球
        blueBallBitmap=BitmapFactory.decodeResource(this.getResources(), R.drawable.blueball);//初始化蓝球
        greenBallBitmap=BitmapFactory.decodeResource(this.getResources(), R.drawable.greenball);//初始化绿球
    }
 class BallEngine extends Engine //创建内部类
 {
     Sample12_6_WallPaper father;//MovingBallWallPaper的引用
     private final Paint paint = new Paint();  //创建画笔  
     boolean ifDraw;//是否可见的标志位
     BallGoThread bgThread;        //BallGoThread引用
      AllBalls allBalls;// AllBalls对象的引用
     private final Runnable mDrawCube = new Runnable() {//匿名内部类
         public void run() {//重写run方法
             drawBalls();//调用drawBalls方法
         }
     };
     @Override
     public void onCreate(Su易做图ceHolder su易做图ceHolder) //重写onCreate方法
     {
         super.onCreate(su易做图ceHolder);  //调用父类对应方法
          paint.setAntiAlias(true);//打开抗锯齿
          initBitmap();//初始化位图资源
      }

     @Override
     public void onDestroy() //重写onDestroy方法
     {
         super.onDestroy();//调用父类对应方法
     }

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,