مشخصات مقاله
-
3144
-
0.0
-
7628
-
0
-
2
آموزش ساخت wallpaper والپیپر زنده در اندروید
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
ساخت والپیپر متحرک برای اندروید, ساخت live wallpaper برای اندروید
فهرست محتوا
1. توضیحی مختصر
· تصویر پس زمینه ی زنده (Live wallpaper) چیست ؟
· چگونگی ایجاد پوستر پویا
· استفاده از intent ها جهت انتخاب تصویر پس زمینه
2. مثالی از ایجاد و انتخاب پوستر ((wallpaper
1. توضیحی مختصر
تصویر پس زمینه ی زنده (Live wallpaper) چیست ؟
Live wallpaper در واقع تصاویر پس زمینه ی متحرک, پویا و تعاملی هستند که در صفحه ی اصلی / home screen سیستم عامل اندروید مورد استفاده قرار می گیرند. Live wallpaper مشابه بسیاری دیگر از برنامه های اندروید بوده و از همان قابلیت ها بهره می گیرد.
چگونگی ایجاد پوستر پویا
به منظور ایجاد یک تصویر پس زمینه ی زنده (live wallpaper), ابتدا لازم است یک فایل XML که تعریف کننده ی خصوصیات wallpaper است ایجاد کنید . این فایل دربردارنده ی توصیفی از برنامه ی کاربردی مورد نظر بوده و همچنین شامل یک پیش نمایش و لینک به preference activity می باشد که امکان تنظیم و سفارشی سازی پوستر پویا را برای شما فراهم می کند .
لازم است یک service ایجاد کنید که کلاس WallpaperService را بسط دهد (به ارث ببرد) . کلاس مذکور در حقیقت کلاس پایه برای همه ی پوسترهای سیستم محسوب می شود . برنامه نویس باید متد onCreateEngine() را پیاده سازی کرده و شئی از نوع android.service.wallpaper.WallpaperService.Engine بازگرداند . این شئ کلیه ی رخدادهای چرخه ی حیات (life-cycle event), متحرک سازی (animation) و ترسیمات (drawings) مربوط به پوستر را اداره می کند . کلاس Engine مجموعه ای از متدهای چرخه ی حیات از جمله onCreate(), onSurfaceCreated(), onVisibilityChanged(), onOffsetsChanged(), onTouchEvent() و onCommand() را تعریف می کند .
Service به مجوز android.permission.BIND_WALLPAPER نیاز داشته و باید به وسیله یintent-filter برای عملیات android.service.wallpaper.WallpaperService ثبت شود.
همچنین لازم است در فایل AndroidManifest.xml درج کنید که برنامه ی کاربردی شما از ویژه گی android.software.live_wallpaper بهره می گیرد . با انجام این کار, برنامه از نصب شدن روی دستگاه هایی که از قابلیت پوستر زنده پشتیبانی نمی کنند, امتناع می ورزد .
استفاده از intent ها جهت انتخاب تصویر پس زمینه
می توانید از intent به منظور انتخاب wallpaper استفاده کنید .
// Button to set the Wallpaper
public void onClick(View view) {
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
new ComponentName(this, MyWallpaperService.class));
startActivity(intent);
}
2. مثالی از ایجاد و انتخاب پوستر ((wallpaper
پروژه ی جدیدی به نام de.vogella.android.wallpaper ایجاد کنید, نیازی نیست activity ایجاد کنید .
اکنون پوشه ی /res/xml و فایل mywallpaper.xml را خلق کنید .
<?xml version="1.0" encoding="UTF-8" ?>
<wallpaper xmlns:android="http://schemas.android.com/apk/res/android"
android:thumbnail="@drawable/icon"
android:description="@string/wallpaper_description"
android:settingsactivity="de.vogella.android.wallpaper.MyPreferencesActivity" />
فایل نام برده حامل توصیفی درباره ی wallpaper و پیش نمایشی از نگاره (graphic) است . همچنین می توانید لینکی به activity دلخواه قرار دهید که به شما اجازه می دهد wallpaper را اختصاصی تنظیم کنید. فایل منبع ذکر شده از AndroidManifest.xml لینک می شود . این امکان نیز وجود دارد که خصیصه ی ""android:thumbnail را که به drawable ارجاع داده و تصویر کوچکتری از پوستر کنونی ارئه می دهد, در فایل دخیل کنید .
AndroidManifest.xml را به فایل زیر تغییر داده تا بدین وسیله سرویس MyWallpaperService تعریف شود. حال uses-feature را تعریف کنید .
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.vogella.android.wallpaper"
android:versioncode="1"
android:versionname="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<service android:name="MyWallpaperService"
android:enabled="true"
android:label="Wallpaper Example "
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService">
</action>
</intent-filter>
<meta-data android:name="android.service.wallpaper"
android:resource="@xml/mywallpaper">
</meta-data>
</service>
<activity android:name=".MyPreferencesActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.WallpaperSettings">
</activity>
<activity android:name=".SetWallpaperActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Light.WallpaperSettings">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minsdkversion="10" />
<uses-feature android:name="android.software.live_wallpaper"
android:required="true">
</uses-feature>
</manifest>
جهت ذخیره سازی المان هایی که ترسیم کردیم باید کلاس MyPoint را خلق کنیم .
package de.vogella.android.wallpaper;
public class MyPoint {
String text;
private int x;
private int y;
public MyPoint(String text, int x, int y) {
this.text = text;
this.x = x;
this.y = y;
}
}
اکنون activity جدید را ایجاد کرده, prefs.xml preference file را در پوشه ی res/xml ایجاد کنید.
<?xml version="1.0" encoding="utf-8" ?>
<preferencescreen xmlns:android="http://schemas.android.com/apk/res/android">
<checkboxpreference android:key="touch"
android:title="Enable Touch"></checkboxpreference>
<edittextpreference android:key="numberOfCircles"
android:title="Number of Circles"></edittextpreference>
</preferencescreen>
Activity ی جدیدی به نام MyPreferencesActivity و کلاس زیر را ایجاد کنید:
package de.vogella.android.wallpaper;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.widget.Toast;
public class MyPreferencesActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
// add a validator to the "numberofCircles" preference so that it only
// accepts numbers
Preference circlePreference = getPreferenceScreen().findPreference("numberOfCircles");
// add the validator
circlePreference.setOnPreferenceChangeListener(numberCheckListener);
}
/**
* Checks that a preference is a valid numerical value
*/
Preference.OnPreferenceChangeListener numberCheckListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// check that the string is an integer
if (newValue != null && newValue.toString().length() > 0
&& newValue.toString().matches("\\d*")) {
return true;
}
// If now create a message to the user
Toast.makeText(MyPreferencesActivity.this, "Invalid Input",
Toast.LENGTH_SHORT).show();
return false;
}
};
}
اکنون کدنویسی wallpaper service را انجام دهید :
package de.vogella.android.wallpaper;
import java.util.ArrayList;
import java.util.List;
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.view.MotionEvent;
import android.view.SurfaceHolder;
public class MyWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyWallpaperEngine();
}
private class MyWallpaperEngine extends Engine {
private final Handler handler = new Handler();
private final Runnable drawRunner = new Runnable() {
@Override
public void run() {
draw();
}
};
private List<MyPoint> circles;
private Paint paint = new Paint();
private int width;
int height;
private boolean visible = true;
private int maxNumber;
private boolean touchEnabled;
public MyWallpaperEngine() {
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(MyWallpaperService.this);
maxNumber = Integer
.valueOf(prefs.getString("numberOfCircles", "4"));
touchEnabled = prefs.getBoolean("touch", false);
circles = new ArrayList<MyPoint>();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(10f);
handler.post(drawRunner);
}
@Override
public void onVisibilityChanged(boolean visible) {
this.visible = visible;
if (visible) {
handler.post(drawRunner);
} else {
handler.removeCallbacks(drawRunner);
}
}
}
@Override
public void onSurfaceDestroyed(SurfaceHolder holder) {
super.onSurfaceDestroyed(holder);
this.visible = false;
handler.removeCallbacks(drawRunner);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
this.width = width;
this.height = height;
super.onSurfaceChanged(holder, format, width, height);
}
@Override
public void onTouchEvent(MotionEvent event) {
if (touchEnabled) {
float x = event.getX();
float y = event.getY();
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.BLACK);
circles.clear();
circles.add(new MyPoint(String.valueOf(circles.size() + 1), x, y));
drawCircles(canvas, circles);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
super.onTouchEvent(event);
}
}
private void draw() {
SurfaceHolder holder = getSurfaceHolder();
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
if (canvas != null) {
if (circles.size() >= maxNumber) {
circles.clear();
}
int x = (int) (width * Math.random());
int y = (int) (height * Math.random());
circles.add(new MyPoint(String.valueOf(circles.size() + 1),
x, y));
drawCircles(canvas, circles);
}
} finally {
if (canvas != null)
holder.unlockCanvasAndPost(canvas);
}
handler.removeCallbacks(drawRunner);
if (visible) {
handler.postDelayed(drawRunner, 5000);
}
}
// Surface view requires that all elements are drawn completely
private void drawCircles(Canvas canvas, List<MyPoint> circles) {
canvas.drawColor(Color.BLACK);
for (MyPoint point : circles) {
canvas.drawCircle(point.x, point.y, 20.0f, paint);
}
}
}
در این مرحله activity ای ایجاد کنید که از طرح کلی (layout) دربردارنده ی یک Button استفاده می کند . این دکمه از خصوصیت onClick جهت اشاره به متد onClick استفاده می کند .
package de.vogella.android.wallpaper;
import android.app.Activity;
import android.app.WallpaperManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class SetWallpaperActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClick(View view) {
Intent intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER);
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT,
new ComponentName(this, MyWallpaperService.class));
startActivity(intent);
}
}
پس از اجرای اپلیکیشن, برنامه کاربردی مورد نظر باید به شما اجازه دهد wallpaper را انتخاب کنید . پس زمینه شما باید شبیه آنچه در تصویر زیر مشاهده می کنید باشد . چنانچه قابلیت Touch را در تنظیمات (preference) فعال کرده باشید, می توانید با کلیک روی صفحه دایره های موجود در آن را حذف کنید . البته می توانید با مراجعه به بخش تنظیمات (settings) تعداد دایره هایی که نمایش داده می شود را مشخص کنید .