动态壁纸教程

时间:2010-11-29 10:14:12

标签: android graphics canvas sprite live-wallpaper

我正在尝试从我找到here的动态壁纸教程中执行以下操作。

/**
 * Do the actual drawing stuff
 */
private void doDraw(Canvas canvas) {
    Bitmap b = BitmapFactory.decodeResource(context.getResources(), IMAGES[current]);
    canvas.drawColor(Color.BLACK);
    canvas.drawBitmap(b, 0, 0, null);
    Log.d(TAG, "Drawing finished.");
}

/**
 * Update the animation, sprites or whatever.
 * If there is nothing to animate set the wait
 * attribute of the thread to true
 */
private void updatePhysics() {
    // if nothing was updated :
    // this.wait = true;
    if(previousTime - System.currentTimeMillis() >= 41) { //24 FPS
        current = current < IMAGES.length ? current++ : 0;
    }
    Log.d(TAG, "Updated physics.");
}

但它似乎不起作用。我究竟做错了什么。 “画完”。和“物理更新”。消息正在打印。但我只看到第一张图片。我正在模拟器上测试它。

任何帮助将不胜感激。感谢

2 个答案:

答案 0 :(得分:10)

我制作了一个简单的样本动态壁纸,颜色随时间变化。也许你可以用它作为起点:

package com.cmwmobile.android.samples;

import android.graphics.Canvas;

import android.os.Handler;

import android.service.wallpaper.WallpaperService;

import android.view.SurfaceHolder;

/**
 * The SampleLiveWallpaperService class is responsible for showing the
 * animation and is an interface to android. 
 * @author Casper Wakkers - www.cmwmobile.com
 */
public class SampleLiveWallpaperService extends WallpaperService {
    private Handler handler = null;

    /**
     * Inner class representing the actual implementation of the
     * Live Wallpaper {@link Engine}.
     */
    private class SampleLiveWallpaperEngine extends Engine {
        private boolean visible = false;

        private int[] colors = {0, 0, 0} ;

        /**
         * Runnable implementation for the actual work.
         */
        private final Runnable runnableSomething = new Runnable() {
            /**
             * {@inheritDoc}
             */
            public void run() {
                drawSomething();
            }
        };
        /**
         * The drawSomething method is responsible for drawing the animation.
         */
        private void drawSomething() {
            final SurfaceHolder holder = getSurfaceHolder();

            Canvas canvas = null;

            try {
                canvas = holder.lockCanvas();

                if (canvas != null) {
                    canvas.drawARGB(200, colors[0], colors[1], colors[2]);
                }

                updateColors(colors);
            }
            finally {
                if (canvas != null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            }

            // Reschedule the next redraw.
            handler.removeCallbacks(runnableSomething);

            if (visible) {
                // Play around with the delay for an optimal result.
                handler.postDelayed(runnableSomething, 25);
            }
        }
        /**
         * Method updateColors updates the colors by increasing the value
         * per RGB. The values are reset to zero if the maximum value is
         * reached.
         * @param colors to be updated.
         */
        private void updateColors(int[] colors) {
            if (colors[0] < 255) {
                colors[0]++;
            }
            else {
                if (colors[1] < 255) {
                    colors[1]++;
                }
                else {
                    if (colors[2] < 255) {
                        colors[2]++;
                    }
                    else {
                        colors[0] = 0;
                        colors[1] = 0;
                        colors[2] = 0;
                    }
                }
            }
        }
        /**
         * {@inheritDoc}
         */
        public void onDestroy() {
            super.onDestroy();

            handler.removeCallbacks(runnableSomething);
        }
        /**
         * {@inheritDoc}
         */
        public void onVisibilityChanged(boolean visible) {
            super.onVisibilityChanged(visible);

            this.visible = visible;

            if (visible) {
                drawSomething();
            }
            else {
                handler.removeCallbacks(runnableSomething);
            }
        }
    }

    /**
     * Constructor. Creates the {@link Handler}. 
     */
    public SampleLiveWallpaperService() {
        handler = new Handler();
    }
    /**
     * {@inheritDoc}
     */
    public Engine onCreateEngine() {
        return new SampleLiveWallpaperEngine();
    }
}

答案 1 :(得分:2)

我在我的雇主博客上创建了一个关于在动态壁纸中使用SVG的快速教程,如果你愿意,请查看它。
第1部分http://blog.infrared5.com/2012/03/android-live-wallpaper/
第2部分http://blog.infrared5.com/2012/03/android-live-wallpaper-part-2/