12/08/2018, 17:23
Android Live Wallpaper
Xin chào mọi người, hôm nay mình sẽ viết bài chia sẻ về live wallpaper trong android. vậy live wallpaper là gì: nó chính là màn hình home của thiết bị android của bạn, nghĩa là bạn sẽ tạo ra một màn hình riêng của mình. Tạo một wallpaper Trong res/xml tạo 1 file mywallpaper.xml <?xml ...
Xin chào mọi người, hôm nay mình sẽ viết bài chia sẻ về live wallpaper trong android. vậy live wallpaper là gì: nó chính là màn hình home của thiết bị android của bạn, nghĩa là bạn sẽ tạo ra một màn hình riêng của mình.
Tạo một wallpaper
- Trong res/xml tạo 1 file 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"/>
- Tạo class để lưu lại giá trị chúng ta vẽ
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; } }
- Tạo 1 layout mới trong 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>
4.Tạo activity mới
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; } }; }
- Custom wallpaper
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 awidth; 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 awidth, int height) { this.awidth = awidth; this.height = height; super.onSurfaceChanged(holder, format, awidth, 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) (awidth * 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); } } }
- Sử dụng wallpaper của chính mình tạo ra thôi
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); } }
Và kết quả chúng ta đạt được:
Bài viết được tham khảo tại: http://www.vogella.com/tutorials/AndroidLiveWallpaper/article.html Rất mong được sự góp ý của các bạn !