android 动态壁纸开发

作为android动态壁纸开发,其实质就是一个service所以这是不需要activity的

1.在res/xml/文件夹下编写一个pager的xml

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


2.在AndroidMainfest.xml文件夹下,将activity换成我们将要开发的壁纸的service

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <service
            android:name=".LiveWallpaper"
            android:label="@string/app_name"
            android:permission="android.permission.BIND_WALLPAPER" >


            <!-- 为实时壁纸配置intent-filter -->
            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
            </intent-filter>
            <!-- 为实时壁纸配置meta-data -->
            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/livewallpaper" />
        </service>
    </application>


3.编写我们的动态壁纸效果,这里需要一个类,继承WallpaperService

public class LiveWallpaper extends WallpaperService {
// 实现WallpaperService必须实现的抽象方法
public Engine onCreateEngine() {
// 返回自定义的Engine
return new MyEngine();
}


class MyEngine extends Engine {
// 记录程序界面是否可见
private boolean mVisible;
// 记录当前当前用户动作事件的发生位置
private float mTouchX = -1;
private float mTouchY = -1;
// 记录当前圆圈的绘制位置


// 左上角坐标
private float cx1 = 15;
private float cy1 = 20;


// 右下角坐标
private float cx2 = 300;
private float cy2 = 380;


// 右上角坐标
private float cx3 = 300;
private float cy3 = 20;


// 左下角坐标
private float cx4 = 15;
private float cy4 = 380;


// 定义画笔
private Paint mPaint = new Paint();
// 定义一个Handler
Handler mHandler = new Handler();
// 定义一个周期性执行的任务
private final Runnable drawTarget = new Runnable() {
public void run() {
// 动态地绘制图形
drawFrame();
}
};


@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
// 初始化画笔
mPaint.setColor(0xffffffff);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(2);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStyle(Paint.Style.STROKE);
// 设置处理触摸事件
setTouchEventsEnabled(true);
}


@Override
public void onDestroy() {
super.onDestroy();
// 删除回调
mHandler.removeCallbacks(drawTarget);
}


@Override
public void onVisibilityChanged(boolean visible) {
mVisible = visible;
// 当界面可见时候,执行drawFrame()方法。
if (visible) {
// 动态地绘制图形
drawFrame();
} else {
// 如果界面不可见,删除回调
mHandler.removeCallbacks(drawTarget);
}
}


public void onOffsetsChanged(float xOffset, float yOffset, float xStep,
float yStep, int xPixels, int yPixels) {
drawFrame();
}


public void onTouchEvent(MotionEvent event) {
// 如果检测到滑动操作
if (event.getAction() == MotionEvent.ACTION_MOVE) {
mTouchX = event.getX();
mTouchY = event.getY();
} else {
mTouchX = -1;
mTouchY = -1;
}
super.onTouchEvent(event);
}


// 定义绘制图形的工具方法
private void drawFrame() {
// 获取该壁纸的SurfaceHolder
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
// 对画布加锁
c = holder.lockCanvas();
if (c != null) {
c.save();
// 绘制背景色
c.drawColor(0xff000000);
// 在触碰点绘制圆圈
drawTouchPoint(c);


// 绘制圆圈
c.drawCircle(cx1, cy1, 80, mPaint);
c.drawCircle(cx2, cy2, 40, mPaint);
c.drawCircle(cx3, cy3, 50, mPaint);
c.drawCircle(cx4, cy4, 60, mPaint);
c.restore();
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
mHandler.removeCallbacks(drawTarget);
// 调度下一次重绘
if (mVisible) {
cx1 += 6;
cy1 += 8;
// 如果cx1、cy1移出屏幕后从左上角重新开始
if (cx1 > 320)
cx1 = 15;
if (cy1 > 400)
cy1 = 20;


cx2 -= 6;
cy2 -= 8;
// 如果cx2、cy2移出屏幕后从右下角重新开始
if (cx2 < 15)
cx2 = 300;
if (cy2 < 20)
cy2 = 380;


cx3 -= 6;
cy3 += 8;
// 如果cx3、cy3移出屏幕后从右上角重新开始
if (cx3 < 0)
cx3 = 300;
if (cy3 > 400)
cy3 = 20;


cx4 += 6;
cy4 -= 8;
// 如果cx4、cy4移出屏幕后从左下角重新开始
if (cx4 > 320)
cx4 = 15;
if (cy4 < 0)
cy4 = 380;


// 指定0.1秒后重新执行mDrawCube一次
mHandler.postDelayed(drawTarget, 100);
}
}


// 在屏幕触碰点绘制圆圈
private void drawTouchPoint(Canvas c) {
if (mTouchX >= 0 && mTouchY >= 0) {
c.drawCircle(mTouchX, mTouchY, 40, mPaint);
}
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值