首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android动画壁纸

Android动画壁纸
EN

Stack Overflow用户
提问于 2013-01-11 16:38:29
回答 1查看 747关注 0票数 2

我试图制作一个动画的Android背景,使用一些我正在绘制的图片。我一步一步地画出图像,但手机画得很慢。

我正在尝试这样做:

代码语言:javascript
复制
    public class MyWallpaperService extends WallpaperService {
        private int[] images = { R.drawable.p1, R.drawable.p2, R.drawable.p3,
                R.drawable.p4, R.drawable.p5, R.drawable.p6, R.drawable.p7,
                R.drawable.p8, R.drawable.p9, R.drawable.p10, R.drawable.p11,
                R.drawable.p12, R.drawable.p13, R.drawable.p14, R.drawable.p15,
                R.drawable.p16, R.drawable.p17, R.drawable.p18, R.drawable.p19,
                R.drawable.p20, R.drawable.p21, R.drawable.p22, R.drawable.p23,
                R.drawable.p24 };

        @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() {
                    drawImage(images[0]);
                }

            };

            private Paint paint = new Paint();
            private boolean touch = true;

            @Override
            public void onVisibilityChanged(boolean visible) {
                if (visible) {
                    handler.post(drawRunner);
                } else {
                    handler.removeCallbacks(drawRunner);
                }
            }

            @Override
            public void onSurfaceDestroyed(SurfaceHolder holder) {
                super.onSurfaceDestroyed(holder);
                handler.removeCallbacks(drawRunner);
            }

            @Override
            public void onSurfaceChanged(SurfaceHolder holder, int format,
                    int width, int height) {
                super.onSurfaceChanged(holder, format, width, height);
            }

            @Override
            public void onTouchEvent(MotionEvent event) {
                if (partOne) {
                    if (touch) {
                        touch = false;
                        for (int i = 0; i < images.length; i++)
                            imagePostDelay(i, i * 100, i == images.length - 1 ? true
                                    : false);
                    }
                }
                super.onTouchEvent(event);
            }

            private void drawImage(int id) {
                WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
                Display display = wm.getDefaultDisplay();
                @SuppressWarnings("deprecation")
                int width = display.getWidth(); // deprecated 960
                @SuppressWarnings("deprecation")
                int height = display.getHeight(); // deprecated 540
                final Resources res = getResources();
                Bitmap bitmap;
                Canvas canvas = null;
                SurfaceHolder holder = getSurfaceHolder();
                bitmap = BitmapFactory.decodeResource(res, id);
                bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
                try {
                    canvas = holder.lockCanvas();
                    canvas.drawBitmap(bitmap, 0, 0, paint);
                } catch (NullPointerException e) {
                } finally {
                    if (canvas != null)
                        holder.unlockCanvasAndPost(canvas);
                }
            }

            private void imagePostDelay(final int index, int delay,
                    final boolean allowTouch) {
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        try {
                            drawImage(images[index]);
                        } catch (ArrayIndexOutOfBoundsException e) {
                        }
                        if (allowTouch)
                            touch = true;
                    }
                }, delay);
            }
        }

我试图在onCreate方法中以适当的分辨率保存图像,但没有帮助。然后,我尝试使用较少的图像,但它抛出了一个OutOfMemory异常。这可能是由图像数量造成的。最重要的是,捕捉图像没有多大帮助。还是很慢。

  • 有什么好的教程可以帮助在Android上制作实时幻灯片背景吗?
  • 将图像以适当的分辨率存储在xml中并使用setWallpaper()方法更改图像是个好主意吗?setWallpaper()方法会更快吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-11 16:48:47

更有效率地移动

代码语言:javascript
复制
bitmap = BitmapFactory.decodeResource(res, id);
bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);

代码语言:javascript
复制
....
private class MyWallpaperEngine extends Engine {
bitmap = BitmapFactory.decodeResource(res, id);

....
    @Override
    public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        super.onSurfaceChanged(holder, format, width, height);

        // size the background bitmap so it draws efficiently 
        bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);

        drawFrame();
    }

....
void drawFrame() {
Canvas c = null;
        try {
            c = holder.lockCanvas();
            if (c != null) {
                // This will draw on every cycle of the Runnable, 
                // so don't do any decoding of Bitmap here, 
                // that would be very inefficient.  
               canvas.drawBitmap(bitmap, 0, 0, paint);
         }
        } finally {
            if (c != null) holder.unlockCanvasAndPost(c);
        }

        mHandler.removeCallbacks(drawRunner);
        if (mVisible) {
            mHandler.postDelayed(drawRunner,  1000/25);
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14282629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档