思路其实很简单:继承WallpaperService服务类,然后完成engine类,来进行屏幕的画图(消息传递和线程)。如果有什么不懂的,就去看SDK吧,那上面比较详细的

首先是主配置文件

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

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

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".MyLiveWallPaperDemo1Activity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
            
            <service 
                android:name="com.ljz.wallpaper.demo1.LiveWallPaperService"
                android:permission="android.permission.BIND_WALLPAPER"
                android:label="壁纸">
                <intent-filter >
                    <action  android:name="android.service.wallpaper.WallpaperService"/>
                </intent-filter>
                 <meta-data android:name="android.service.wallpaper" 
          android:resource="@xml/livewallpaper" />   
            </service>
            
    </application>

</manifest>

主要动态壁纸代码:

package com.ljz.wallpaper.demo1;

import java.util.ArrayList;
import java.util.Random;

import android.R.integer;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.WindowManager;

public class LiveWallPaperService extends WallpaperService
{
static int width;
static int height;

//背景图片
Bitmap bitmapBKG ;

//叶子
int iLeftCount = 2;
ArrayList<Left> lefts = new ArrayList<Left>();

//玫瑰
int iRoseCount = 3;
ArrayList<Rose> roes = new ArrayList<Rose>();

@Override
public Engine onCreateEngine()
{
//初始化屏幕参数
DisplayMetrics dp = new DisplayMetrics();
((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dp);
width = dp.widthPixels;
height = dp.heightPixels;
return new MyEngine(getResources());
}

//界面引擎
public class MyEngine extends Engine
{
//消息传递
Handler handler = new Handler();

//是够可见
Boolean visiable=true;

//画图线程
Runnable runnable = new Runnable()
{
@Override
public void run()
{
drawFrame();
}
};

//画笔
Paint paint = new Paint();

public MyEngine( Resources r  )  
{
//初始化叶子和玫瑰的图片
Bitmap bitmap1 = BitmapFactory.decodeResource(r, R.drawable.floewr1);
Bitmap bitmap2 = BitmapFactory.decodeResource(r, R.drawable.leaf1);
bitmapBKG = BitmapFactory.decodeResource(r, R.drawable.background);
bitmapBKG = Bitmap.createScaledBitmap(bitmapBKG, width, height, false);

//初始化叶子和玫瑰的数据
for( int i = 0 ; i < iLeftCount ;i++ )
{
Left left = new Left();
left.setPos_x( new Random().nextInt(width) );
left.setPos_y( 0 );
left.setBitmap(bitmap2);
lefts.add(left);
}
for( int i = 0 ; i < iRoseCount ;i++ )
{
Rose rose = new Rose();
rose.setPos_x( new Random().nextInt(width) );
rose.setPos_y( 0 );
rose.setBitmap(bitmap1);
roes.add(rose);
}
}

@Override
public void onCreate(SurfaceHolder surfaceHolder)
{
super.onCreate(surfaceHolder);
}

@Override
public void onDestroy()
{
super.onDestroy();
handler.removeCallbacks(runnable);
}

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
super.onSurfaceChanged(holder, format, width, height);
}

@Override
public void onVisibilityChanged(boolean visible)
{
this.visiable = visible;
if( visible )
{
drawFrame();
}
else
{
handler.removeCallbacks(runnable);
}
}

@Override
public void onSurfaceDestroyed(SurfaceHolder holder)
{
super.onSurfaceDestroyed(holder);
visiable = false;
handler.removeCallbacks(runnable);
}

//画图函数
public void drawFrame()
{
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = holder.lockCanvas();
//设置画笔
paint.setStrokeWidth(4);
paint.setTextSize(16);
paint.setAntiAlias(true);
paint.setTypeface(Typeface.create(Typeface.MONOSPACE, Typeface.BOLD));
//画背景图片
canvas.drawBitmap(bitmapBKG, 0,0, paint);
//画叶子和玫瑰
drawImage(canvas,paint);
holder.unlockCanvasAndPost(canvas);
handler.removeCallbacks(runnable);
if( visiable )
handler.postDelayed(runnable, 200);
}

//画叶子和玫瑰
public void drawImage( Canvas canvas , Paint p )
{
//叶子
if( lefts.size() == 0 || roes.size() == 0 )
{
return ;
}
for( int i = 0 ; i < iLeftCount ; i++ )
{
Left aLeft = lefts.get(i);
canvas.drawBitmap(aLeft.getBitmap(), aLeft.getPos_x() , aLeft.getPos_y(), p);
int leaf1temp = aLeft.getPos_y();
leaf1temp++;
if (3 * leaf1temp > height)
{
aLeft.setPos_y(0);
aLeft.setPos_x(new Random().nextInt() * width);
}
else
{
aLeft.setPos_y(leaf1temp);
}
lefts.set(i, aLeft);
}
//画玫瑰
for( int i = 0; i < iRoseCount ; i++ )
{
Rose rose = roes.get(i);
canvas.drawBitmap(rose.getBitmap(), rose.pos_x, rose.pos_y, p);
int h = rose.getPos_y();
h++;
if( h > height  )
{
rose.setPos_y(0);
rose.setPos_x( new Random().nextInt() * width );
}
else
{
rose.setPos_y(h);
}
roes.set(i, rose);
}
}

}

}

android动态壁纸学习相关推荐

  1. Android 动态壁纸引擎试刀学习(初识安卓引擎)

    动态壁纸蛮好玩的,也没接触过,看官方有就拿了学习下,是小马第一次接触引擎Engine,激动兴奋...效果做出来了,就放博客里,记录笔记,吼吼,跟大家交流学习, 废话不多说了,先看效果,再看源码,之后小 ...

  2. Android动态壁纸解析

    转载自 Yalin Jin的文章:http://www.kinglloy.com/ MENU Android动态壁纸解析 24 JULY 2017 阅读之前 建议下载使用Style动态壁纸应用 文章后 ...

  3. android 动态壁纸开发

    转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发 参考:http://www.ophonesdn.com/articl ...

  4. 制作android动态壁纸,如何使用LibGDx制作Android动态壁纸?

    我想制作 Android动态壁纸.我想使用LibGDx.我发现了这个信息: http://www.badlogicgames.com/wordpress/?p=2652 不幸的是,我的壁纸复制代码,e ...

  5. android动态壁纸的制作

    对于Android 2.1来说Live Wallpapers动态壁纸的加入为Android桌面加入了更好的动态效果.如何开发一个Android动态桌面呢? 下面Android123给大家一个详细的步骤 ...

  6. Android 动态壁纸开发(时钟)

    Android 动态壁纸开发(时钟) 这是我人生第一篇文章,希望大家不喜无喷啊!有兴趣的可以看看玩,因为语言组织能力有限,就废话不多说直接进入重点! 先看效果 上图是动态壁纸钟的一个时钟. 我们先来看 ...

  7. android水波效果,android动态壁纸中的水波纹效果

    [实例简介] android动态壁纸中的水波纹效果,采用opengl中的shader实现 [实例截图] [核心代码] @Override public String getVertexShader() ...

  8. LibGDX制作android动态壁纸

    一.还是像普通的android动态壁纸一样,创建一个没有activity的安卓工程TestLibGDXWallpaper 二.AndroidManifest.xml配置 <application ...

  9. android 动态壁纸

    引用:http://www.ophonesdn.com/article/show/278 http://developer.android.com/resources/samples/CubeLive ...

最新文章

  1. 重构ncnn,腾讯优图开源新一代移动端推理框架TNN
  2. 字符串的截取和替换常用方法
  3. c++ 公有继承的赋值兼容规则
  4. 十一级指针实现百万qq号的增删查改以及排序写入
  5. 纪念第一个正式的java程序
  6. as it exceeds the max of 500KB._IT狂人第一季 | 如何考察员工
  7. 联想e52进入bios_联想笔记本怎么设置u盘启动|联想笔记本bios设置usb启动步骤
  8. mac安装python3.7两个版本_MAC下同时安装Python2和Python3
  9. 跨站脚本攻击之反射型XSS漏洞【转载】
  10. 飙泪怀旧:那些经典的老软件、老网站
  11. XP连接网络计算机未启动服务,XP搜索不到网络提示“请启动Windows零配置(WZC)服务”的解决方法...
  12. 哪种pdf编辑器更方便使用
  13. 坚果pro官方固件_坚果Pro线刷包_坚果Pro刷机包_坚果Pro固件包_坚果Pro救砖包 - 线刷宝ROM中心...
  14. MySQL 轻量级Online DDL工具 —— gh-ost
  15. 【鸿蒙学院】鸿蒙(HarmonyOS)IDE迎来重大更新,新特性足以让你尖叫!
  16. 「管理数学基础」2.3 泛函分析:赋范空间与巴拿赫空间
  17. 【每日训练】排序子序列
  18. 矩阵求和及Kadane算法
  19. python读写xls
  20. 使用阿里云邮箱发送邮件

热门文章

  1. 三本学校组织学生去日本IT公司实习咋样?
  2. Twitter或面临欧盟更严格内容审核;韩国电商巨头用机器人军团替代仓库工人;高通公司副总裁加盟三星丨每日大事件...
  3. c语言线程中sleep,关于c ++:减慢线程的最佳方法? 使用Sleep()可以吗?
  4. 启扬智能24小时自助图书馆相关硬件解决方案
  5. 算法工程师10——opencv
  6. SAP CO系统配置-利润中心会计
  7. linux中jpg与png相互转化
  8. noip pj,tg酱油记
  9. 17070302(UE4的Tonemapper)
  10. 跨境电商一站式数字化管理ERP系统,帮你解决烦恼