Android墙纸的设定

这是个全民看脸的时代,手机也一样。漂亮的APP给手机增色不少,那就赶紧给你这个女朋友打扮一下吧。

从设置静态壁纸,到动态壁纸,到锁屏壁纸,再到主题,其实也没那么简单。

1、设置静态壁纸

MainActivity.java

public class MainActivity extends Activity {
	@Override
	protected 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、Bitmap
			try {
				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() {
		@Override
		public 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");
	}
	@Override
	public 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个frame
	private 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);
	}
	
	@Override
	public void onCreate(SurfaceHolder surfaceHolder) {
		super.onCreate(surfaceHolder);
	}
	
	@Override
	public void onOffsetsChanged(float xOffset, float yOffset,
			float xOffsetStep, float yOffsetStep, int xPixelOffset,
			int yPixelOffset) {
		super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset);
	}
	
	@Override
	public void onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
	}
	
	Timer timer;
	@Override
	public void onSurfaceCreated(SurfaceHolder holder) {
		super.onSurfaceCreated(holder);
		timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public 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() {
		@Override
		public 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 {
	@Override
	protected 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>

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。