Android 在实时壁纸中绘制位图

Android 在实时壁纸中绘制位图,android,live-wallpaper,Android,Live Wallpaper,我正在尝试制作一个简单的实时壁纸,当用户触摸屏幕时,会在该位置绘制位图。我面临2个问题,如果我在Runnable中绘制它,那么它将持续创建位图,如果我在外部绘制它,那么它将持续闪烁。我已经注意到,如果我改变了runnable闪烁的延迟时间,也会改变,如果我完全移除runnable,那么画得很好,但是位置变得很奇怪 这是我的密码。 这个持续闪烁 package com.example.live_wallpaper_p1; import android.app.WallpaperManager;

我正在尝试制作一个简单的实时壁纸,当用户触摸屏幕时,会在该位置绘制位图。我面临2个问题,如果我在Runnable中绘制它,那么它将持续创建位图,如果我在外部绘制它,那么它将持续闪烁。我已经注意到,如果我改变了runnable闪烁的延迟时间,也会改变,如果我完全移除runnable,那么画得很好,但是位置变得很奇怪

这是我的密码。 这个持续闪烁

package com.example.live_wallpaper_p1;

import android.app.WallpaperManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.SurfaceHolder;



public class DemoWallpaperService extends WallpaperService {

    @Override
    public Engine onCreateEngine() {
        return new DemoWallpaperEngine();
    }

    private class DemoWallpaperEngine extends Engine{
        private boolean mVisible = false;
        private final Handler mHandler = new Handler();
        private Bitmap imm;
        private float xcor;
        private float ycor;
        BitmapFactory.Options option;       
        DemoWallpaperEngine()
        {
        imm = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icon, option));
        }

        private final Runnable mUpdateDisplay = new Runnable() {
        @Override
        public void run() {
            draw();
        }};

        @Override
        public Bundle onCommand(String action, int x, int y, int z, Bundle extras, boolean resultRequested) {
            if (action.equals(WallpaperManager.COMMAND_TAP)) {
                xcor=x;
                ycor=y;
                final SurfaceHolder holder = getSurfaceHolder();

                Canvas c = null;
                try {
                    c = holder.lockCanvas();
                    if (c != null) {
                    c.drawBitmap(imm, xcor-(imm.getWidth()/2), ycor-(imm.getHeight()/2),null);
                        //drawCube(c);
                    }
                } finally {
                    if (c != null)
                        holder.unlockCanvasAndPost(c);
                }

            }
            return null;
        }



        private void draw() {
           SurfaceHolder holder = getSurfaceHolder();
           Canvas c = null;
           try {
              c = holder.lockCanvas();
              if (c != null) {
                  //do something
              }
           } finally {
              if (c != null)
                 holder.unlockCanvasAndPost(c);
           }
           mHandler.removeCallbacks(mUpdateDisplay); 
      if (mVisible) {
              mHandler.postDelayed(mUpdateDisplay, 10); 

           } 
        }

        @Override
        public void onVisibilityChanged(boolean visible) {
            mVisible = visible;
            if (visible) {
                draw();
            } else {
                mHandler.removeCallbacks(mUpdateDisplay);
            }
        }

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

        @Override
        public void onSurfaceDestroyed(SurfaceHolder holder) {
            super.onSurfaceDestroyed(holder);
            mVisible = false;
            mHandler.removeCallbacks(mUpdateDisplay);
        }

        @Override
        public void onDestroy() {
             super.onDestroy();
             mVisible = false;
             mHandler.removeCallbacks(mUpdateDisplay);
        }
    }    
}

您可以试试这个示例代码

此处imageURL是指向图像位置的http链接

 Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
    holder.itemImage.setImageBitmap(bitmap); 
如果您的图像在手机存储器中

用这个

image.setImageResource(R.drawable.test2);

真正的效果是在“draw()”或“render()”方法中执行的操作。你需要在这里发布代码。这是完整的代码。它使用draw()方法。对于此用户,将需要Internet。我想要内置位图。位图是Java中的内置类。我不知道你想说什么?你给出的上述代码需要互联网连接才能运行。我希望它应该工作,即使互联网连接不可用。那么你在SD卡中保存图像的位置?在应用程序本身中。就像我们在其他应用程序中保存一样,这也是一样的。