کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش ساخت 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) تعداد دایره هایی که نمایش داده می شود را مشخص کنید . 

نمایش Live Wallpaper

1394/07/27 7628 3144
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...