標籤:
這是個全民看臉的時代,手機也一樣。漂亮的APP給手機增色不少,那就趕緊給你這個女朋友打扮一下吧。
從設定靜態壁紙,到動態壁紙,到鎖屏壁紙,再到主題,其實也沒那麼簡單。
1、設定靜態壁紙
MainActivity.java
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wallpaperManager = WallpaperManager.getInstance(this);registerReceiver(broadcastReceiver, new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED));}WallpaperManager wallpaperManager;public void onClick(View v){switch(v.getId()){case R.id.btn_setWallpaper:File file = new File(Environment.getExternalStorageDirectory()+"/pictures/field.png");try {InputStream is = new FileInputStream(file);//ContextWrapper方法,可讀Bitmap、InputStream//需SET_WALLPAPER許可權。讀檔案需WRITE_EXTERNAL_STORAGE許可權setWallpaper(is);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}break;case R.id.btn_setWallpaper2://可載入res、InputStream、Bitmaptry {wallpaperManager.setResource(R.drawable.frame);} catch (IOException e) {e.printStackTrace();}break;case R.id.btn_clearWallpaper://清除壁紙try {wallpaperManager.clear();} catch (IOException e) {e.printStackTrace();}}}//接收壁紙改變廣播private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if(intent.getAction().equals(Intent.ACTION_WALLPAPER_CHANGED)){Toast.makeText(MainActivity.this, "已更改牆紙", Toast.LENGTH_SHORT).show();}}};}activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:id="@+id/btn_setWallpaper" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="setWallpaper"/> <Button android:id="@+id/btn_setWallpaper2" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="setWallpaper2"/> <Button android:id="@+id/btn_clearWallpaper" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="clearWallpaper"/></LinearLayout>
2、設定動態壁紙
MyWallpaperService.java,每次從動態壁紙庫選擇當前壁紙會觸發該Service執行個體化並調用onCreateEngine
/** * 封裝器Service,用來執行個體化和管理Engine */public class MyWallpaperService extends WallpaperService {private static final String TAG = MyWallpaperService.class.getSimpleName();public MyWallpaperService(){super();Log.d(TAG, "MyWallpaperService");}@Overridepublic Engine onCreateEngine() {Log.d(TAG, "onCreateEngine");return new MyWallpaperServiceEngine(this);}}MyWallpaperServiceEngine.java
/** * Engine封裝一個用於顯示牆紙的SurfaceView * <P>SurfaceView雙緩衝機制:一個front buffer,一個back buffer。假設當前顯示的是front,若內容發生變化, * back在原來基礎上把內容畫好。然後back和front交換位置。<P> */public class MyWallpaperServiceEngine extends WallpaperService.Engine {private static final String TAG = MyWallpaperServiceEngine.class.getSimpleName();//每秒30個frameprivate static final int FPS = 5;private final Handler handler = new Handler();public MyWallpaperServiceEngine(WallpaperService wp){wp.super();paint = new Paint();paint.setARGB(255, 255, 255, 255);}@Overridepublic void onCreate(SurfaceHolder surfaceHolder) {super.onCreate(surfaceHolder);}@Overridepublic void onOffsetsChanged(float xOffset, float yOffset,float xOffsetStep, float yOffsetStep, int xPixelOffset,int yPixelOffset) {super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);}@Overridepublic void onTouchEvent(MotionEvent event) {super.onTouchEvent(event);}Timer timer;@Overridepublic void onSurfaceCreated(SurfaceHolder holder) {super.onSurfaceCreated(holder);timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {drawFrame();}}, 0, 1000/FPS);}public void onSurfaceDestroyed(SurfaceHolder holder) {timer.cancel();};Paint paint;float y = 300f;private void drawFrame(){final SurfaceHolder holder = getSurfaceHolder();Canvas canvas = null;try{canvas = holder.lockCanvas(new Rect(100, 100, 500, 1100));if(canvas!=null){//清屏,重設像素數組canvas.drawColor(Color.BLACK);//在畫布上繪製canvas.drawCircle(300f, y, 200f, paint);y += 20f;if(y>900f){y = 300f;}}}finally{if(canvas!=null){holder.unlockCanvasAndPost(canvas);}}//handler.removeCallbacks(drawSurface);//handler.postDelayed(drawSurface, 1000/FPS);}private final Runnable drawSurface = new Runnable() {@Overridepublic void run() {drawFrame();}};}AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qinuli.compiletest" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.SET_WALLPAPER"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:permission="android.permission.BIND_WALLPAPER" > <activity android:name="com.qinuli.compiletest.MainActivity"> <intent-filter > <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name="com.qinuli.compiletest.SettingsActivity"></activity> <service android:name="com.qinuli.compiletest.MyWallpaperService"> <intent-filter > <action android:name="android.service.wallpaper.WallpaperService"/> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/mylivewallpaper"/> </service> </application></manifest>
mylivewallpaper.xml
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:author="@string/author" android:description="@string/description" android:thumbnail="@drawable/wallpapericon" android:settingsActivity="com.qinuli.compiletest.SettingsActivity"/>
res/values/strings.xml
<string name="author">石鑫</string><string name="description">即時互動壁紙</string>
SettingsActivity.java
public class SettingsActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_settings);}}activity_settings.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Feel free to ask!"/></LinearLayout>
Android牆紙的設定