android壁纸运行条件,android动态壁纸开发(能运行的)

网上也有讲开发动态壁纸的博客,我在看书编写这个例子时,发现我编写的动态壁纸找不到,后来发现是没有将我编写的WallpaperService跑起来,而书上和有些博客照搬写到是不需要Activity的,我发现没有Activity的话,程序都跑不起。下面讲下我的做法:

第一步:编写LiveWallpaper类继承WallpaperService,代码如下:

public class LiveWallpaper extends WallpaperService{

private Bitmap bitmap;

// 实现动态壁纸必须要实现的抽象方法

@Override

public Engine onCreateEngine() {

bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.me);

return new MyEngine();

}

class MyEngine extends Engine{

private boolean mVisible;

// 记录当前用户动作发生的位置

private float mTouchX = -1;

private float mTouchY = -1;

// 记录要绘制的矩形的数量

private int count = 1;

// 记录第一个矩形所需坐标变换的X、Y坐标的偏移

private int originX = 50,originY = 50;

// 定义画笔

private Paint mPaint = new Paint();

Handler mHandler = new Handler();

private final Runnable drawTarget = new Runnable() {

@Override

public void run() {

drawFrame();

}

};

@Override

public void onCreate(SurfaceHolder surfaceHolder) {

super.onCreate(surfaceHolder);

// 初始化画笔

mPaint.setARGB(76,0,0,255);

mPaint.setAntiAlias(true);

mPaint.setStyle(Paint.Style.FILL);

// 设置壁纸的触碰事件为true

setTouchEventsEnabled(true);

}

@Override

public void onVisibilityChanged(boolean visible) {

super.onVisibilityChanged(visible);

mVisible = visible;

if(visible){

drawFrame();

}else{

// 如果界面不可见,删除回调

mHandler.removeCallbacks(drawTarget);

}

}

@Override

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

super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);

drawFrame();

}

@Override

public void onDestroy() {

super.onDestroy();

// 删除回调

mHandler.removeCallbacks(drawTarget);

}

@Override

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(){

final SurfaceHolder holder = getSurfaceHolder();

Canvas c = null;

try{

c = holder.lockCanvas();

if(c != null){

c.drawColor(0xffffffff);

// 在触碰点绘制图像

drawTouchPoint(c);

mPaint.setAlpha(76);

c.translate(originX,originY);

// 采用循环绘制count个图形

for(int i = 0; i < count; i++){

c.translate(80,0);

c.scale(0.95f,0.95f);

c.rotate(20f);

c.drawRect(0,0,150,75,mPaint);

}

}

}finally {

if(c != null){

holder.unlockCanvasAndPost(c);

}

}

// 调度下一次重绘

mHandler.removeCallbacks(drawTarget);

if(mVisible){

count++;

if(count >= 50){

Random rand = new Random();

count = 1;

originX += (rand.nextInt(60)-30);

originY += (rand.nextInt(60)-30);

try{

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 每隔0.1秒执行drawTarget一次

mHandler.postDelayed(drawTarget,100);

}

}

private void drawTouchPoint(Canvas c){

if(mTouchX >= 0 && mTouchY >= 0){

// 设置画笔的透明度

mPaint.setAlpha(255);

c.drawBitmap(bitmap,mTouchX,mTouchY,mPaint);

}

}

}

}第二步:在AndroidManifest.xml中进行态壁纸的service配置,代码如下:

android:name=".LiveWallpaper"

android:enabled="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:permission="android.permission.BIND_WALLPAPER">

android:name="android.service.wallpaper"

android:resource="@xml/livewallpaper" />

然后在res文件下下新建xml文件夹,在xml文件夹中建立livewallpaper.xml文件,livewallpaper.xml文件中的代码如下:

第三步:在MainActivity中编写代码,运行WallpaperService,代码如下:

public class MainActivity extends Activity{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Intent intent = new Intent(this,LiveWallpaper.class);

// 启动设置的动态壁纸的Service

startService(intent);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值