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>

时间: 2024-08-29 19:44:15

Android墙纸的设定的相关文章

[函數] Firemonkey Android 取得系统参数设定的字型大小

Android 系统参数设定内,可以设定字型大小: 可以透过下面代码来取得字型大小比例: function FontScale: Single; var Resources: JResources; Configuration: JConfiguration; begin Result := 1; if TAndroidHelper.Context <> nil then begin Resources := TAndroidHelper.Context.getResources; if Re

android ImageView 宽度设定,高度自适应

最近碰到一个需求,要求是在不知道图片宽度和高度的情况下,让图片在指定宽度内充满,同时高度自适应,在网络上查找了一下,也有很多解决方法,后来针对自己的应用,选择了一个修改较小的方案,最后证明效果还是蛮不错的,记录在这里,希望能帮助到有同样需求的人. 首先,需要给你的ImageView布局加上android:adjustViewBounds="true" <ImageView android:id="@+id/iv_custom_showdress_item_dress&q

Android原理揭秘系列之一动态墙纸

Livewallpaper,即动态墙纸,是Android的一大3D特色功能,用户可以在桌面选择加载动态墙纸,让自己的手机桌面背景旋动起来. 相对于静态桌面壁纸,动态墙纸可以展示各种动态变化的背景,而与传统手机系统采用GIF作为动态背景不同的是,Android的动态墙纸并不是GIF图片,而是一个标准的Android应用程序,也就是APK.既然是应用程序,当然意味着天生具有GIF图片不具备的功能——能与用户发生交互,而且动态的背景变化绝不仅仅局限于GIF图片那般只能是固定的几张图片的循环播放. 需要

[转]Android学习:EditText的使用方法

    EditText是在Android开发中经常被使用到的控件,主要用来获取用户的输入内容. 1.EditText常用属性 EditText继承自TextView,所以EditText也拥有一些TextView中的属性和方法.EditText的常用属性有以下一些: android:capitalize="sentences"//设置英文字母大写类型,sentences仅第一个字母大写:words每一个单词首字母大小,用空格区分单词:characters每一个英文字母都大写 andr

Android总结篇系列:Activity Intent Flags及Task相关属性

同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 -------------------------------------------------------------------------- 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式的时候,已经了解到一些关于task的技术,今天我再向大

[转]用android LinearLayout和RelativeLayout实现精确布局

先明确几个概念的区别: padding margin都是边距的含义,关键问题得明白是什么相对什么的边距. padding是控件的内容相对控件的边缘的边距. margin是控件边缘相对父控件的边距. android:gravity 属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.该属性就干了这个. android:layout_gravity是用来设置该view中的子view相对于父view的位置.比如一个button 在

Android传感器-开发指南

大部分Android平台的设备都带有多个传感器,使你能监视其方位和运动状态的变化.很多设备还有其它类型的传感器,让你能感知周围的环境条件,比如温度.压力.湿度和光线.你可以利用Android的传感器框架访问这些传感器,并获取原始的传感器数据. 传感器框架提供了丰富的类和接口,能帮助你完成很多与传感器有关的工作.比如,你可以用传感器框架来进行: 确定设备上可用的传感器 确定某个传感器的性能,比如量程.制造商.能耗.分辨率等. 读取传感器的原始数据并指定最小读取频率 注册及注销监听传感器变化的传感器

我的Android 4 学习系列之开始入手:配置开发环境与理解Hello World!

p { padding-left: 10px; } 目录 如何安装Android SDK.创建开发环境和调试项目 移动设计中一些注意事项 使用Android虚拟设备.模拟器和其他开发工具 如何安装Android SDK.创建开发环境和调试项目 下载和安装Android SDK : 我的是window7系统,当然下载 SDK starter package 最合适了: http://developer.android.com/sdk/index.html 下载完打开压缩包如下: 然后把这个包解压到

Android自定义控件_View的绘制流程

每一个View/ViewGroup的显示都会经过三个过程:1.measure过程(测量View显示的大小,位置):2.layout过程(布局view的位置):3.draw过程(上一篇文章说到的通过canvas绘制到界面上显示,形成了各色的View) 下面分析一下各个过程:measure过程: 因为DecorView实际上是派生自FrameLayout的类,也即一个ViewGroup实例,该ViewGroup内部的ContentViews又是一个ViewGroup实例,依次内嵌View或ViewG