0

ユーザーが画面に触れるとその位置にビットマップが描画されるシンプルなライブ壁紙を作成しようとしています。私は 2 つの問題に直面しています。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);
        }
    }    
}
4

1 に答える 1

0

このサンプルコードを試すことができます

ここでimageURLは画像の場所へのhttpリンクです

 Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
    holder.itemImage.setImageBitmap(bitmap); 

あなたの画像が電話のメモリにある場合。

これを使って

image.setImageResource(R.drawable.test2);
于 2013-04-14T12:00:19.483 に答える