您的位置:首页 > 移动开发 > Android开发

android 动态、静态壁纸实现

2015-04-11 16:52 411 查看
1、静态壁纸
1)获取壁纸实例,实际上是一个服务提供
WallpaperManager wallpaperManager=WallpaperManager.getInstance(this);
WallpaperManager.getInstance()方法内容如下:
public static WallpaperManager getInstance(Context context) {
return (WallpaperManager)context.getSystemService(
Context.WALLPAPER_SERVICE);
}
2、使用下列三个方法之一设置壁纸内容
wallpaperManager.setBitmap(bitmap)
wallpaperManager.setStream(data);
wallpaperManager.setResource(R.drawable.a);

2、动态壁纸
1)、在res目录下建xml目录,并建一个xml文件,如aa.xml
<?xml version="1.0" encoding="utf-8"?>
<wallpaper
xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@drawable/c"/>
2)、写一个类继承WallpaperService类。并重写 public Engine onCreateEngine()方法。
该方法的返回值Engine即为绘制壁纸的方法。重写该类中的方法,并不强制。

当壁纸的显示、状态或大小变化是,会调用Engine的onCreate,
onDestroy,onVisibilityChanged, onSurfaceChanged,
onSurfaceCreated 和onSurfaceDestroyed方法。
有了这些方法,动态壁纸才能展现出动画效果。
而通过设置setTouchEventsEnabled(true),
并且调用onTouchEvent(MotionEvent event)方法,
来激活触摸事件。
3)、在清单文件里面注册该服务
<!-- 配置实时壁纸Service -->
<service android:label="@string/app_name"
android:name="service类全名"
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/xml文件夹下的xml文件" />
</service>
4)、使用方法
长按屏幕选择动态壁纸进行选择。

5)、实例
public class LiveGralley 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 Integer[] mImageIds = {
R.drawable.a,
R.drawable.b, R.drawable.c,
R.drawable.d, R.drawable.e,
R.drawable.f, R.drawable.g,
R.drawable.h,
};

// 定义绘制图形的工具方法
private void drawFrame()
{
// 获取该壁纸的SurfaceHolder
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try
{
// 对画布加锁
c = holder.lockCanvas();
if (c != null)
{
c.save();
// 绘制背景色
int i = new Random().nextInt(8);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), mImageIds[i]);
c.drawBitmap(bitmap, 0, 0, mPaint);
// 在触碰点绘制圆圈
// 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, 3000);
}
}

/*// 在屏幕触碰点绘制圆圈
private void drawTouchPoint(Canvas c)
{
if (mTouchX >= 0 && mTouchY >= 0)
{
c.drawCircle(mTouchX, mTouchY, 40, mPaint);
}
}*/
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: