How to Build Live Wallpaper with Canvas on Android
This will be a very basic canvas live wallpaper with android. Just to get people started.
Just read the comments on the code to understand how everything works.
AndroidManifest.xml
res/xml/settings.xml - this is a normal preference activity
SampleSettings.java - normal preference activity
MyActivity.java
SampleService.java
That's all of the basic foundation of creating live wallpaper with canvas. You can implement more method for the engine and the service to have more control. But this will basically give you all the initial starting point. Download the full project here
Just read the comments on the code to understand how everything works.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.altlimit.samplelivewallpaper"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="15"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="MyActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!--The service that will be drawing your wallpaper-->
<service android:name=".SampleService"
android:label="@string/app_name"
android:permission="android.permission.BIND_WALLPAPER"
android:icon="@drawable/ic_launcher">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<!--To tell your wallpaper which settings activity it will launch-->
<meta-data android:name="android.service.wallpaper"
android:resource="@xml/meta" />
</service>
<!--The activity declaration settings for your wallpaper-->
<activity android:label="Settings"
android:name=".SampleSettings"
android:exported="true"
android:icon="@drawable/ic_launcher">
</activity>
</application>
<uses-feature
android:name="android.software.live_wallpaper"
android:required="true" >
</uses-feature>
</manifest>
res/xml/settings.xml - this is a normal preference activity
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="Sample Live Wallpaper Settings"
android:key="samplelive_wallpaper_settings">
<PreferenceCategory
android:title="Settings">
<CheckBoxPreference
android:key="pref_sample_checkbox"
android:defaultValue="false"
android:title="Sample Checkbox"
/>
<EditTextPreference
android:key="pref_count"
android:defaultValue="10"
android:numeric="integer"
android:title="Write Me This amount"
/>
<EditTextPreference
android:key="pref_text"
android:defaultValue="Hello World"
android:title="What to write"
/>
</PreferenceCategory>
</PreferenceScreen>
SampleSettings.java - normal preference activity
package org.altlimit.samplelivewallpaper;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class SampleSettings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
}
MyActivity.java
package org.altlimit.samplelivewallpaper;
import android.app.Activity;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.Bundle;
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Call the live wallpaper picker when started your app
Intent intent = new Intent(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER);
startActivity(intent);
}
@Override
protected void onResume() {
super.onResume(); //To change body of overridden methods use File | Settings | File Templates.
finish();
}
}
SampleService.java
package org.altlimit.samplelivewallpaper;
import android.content.SharedPreferences;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.service.wallpaper.WallpaperService;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.Log;
import android.view.SurfaceHolder;
public class SampleService extends WallpaperService {
/**
* A wallpaper service is actually just another android service.
* You just need to implement the onCreateEngine to get started and return your engine
*/
@Override
public Engine onCreateEngine() {
return new SampleEngine();
}
class SampleEngine extends Engine {
/**
* Create variables for your settings
*/
private boolean checkedSettings = false;
private String textToWrite = null;
private int timesToWrite = 0;
private boolean isVisible = false;
private Paint paint;
private StaticLayout staticLayout;
private Handler redrawHandler = new Handler();
private Runnable redrawRunnable = new Runnable() {
@Override
public void run() {
draw();
}
};
// Here is where all the drawing stuff happens
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
// Resets your canvas to black surface
c.drawColor(Color.WHITE);
int cW = c.getWidth();
int cH = c.getHeight();
if (textToWrite != null && timesToWrite > 0) {
paint = new Paint();
String multipleText = "";
for (int i = 0; i < timesToWrite; i ++) {
multipleText = multipleText.concat(" ").concat(textToWrite);
}
paint.setColor(Color.BLACK);
staticLayout = new StaticLayout(multipleText, new TextPaint(paint), cW - 10, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
// Move top left where to write the text
c.translate(10, cH / 3);
staticLayout.draw(c);
// if you want to write more stuff to canvas
c.restore();
}
}
} finally {
if (c != null)
holder.unlockCanvasAndPost(c);
}
// If you have changing data then here is how you redraw
if (isVisible) {
// if you have a longer delay you probably want to clear other in queue to avoid multiple draws
redrawHandler.removeCallbacks(redrawRunnable);
redrawHandler.postDelayed(redrawRunnable, 500); // you add delay if you dont change oftent
}
}
@Override
public void onVisibilityChanged(boolean visible) {
super.onVisibilityChanged(visible);
isVisible = visible;
// Called when your wallpaper is viewed or not so load settings if it is to show changes instantly
if (isVisible) {
final SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
checkedSettings = preference.getBoolean("pref_sample_checkbox", false);
textToWrite = preference.getString("pref_text", null);
timesToWrite = Integer.valueOf(preference.getString("pref_count", "0"));
// Now we update the canvas
draw();
}
}
}
}
That's all of the basic foundation of creating live wallpaper with canvas. You can implement more method for the engine and the service to have more control. But this will basically give you all the initial starting point. Download the full project here
Comments
Post a Comment