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);
}
}*/
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。