2013-04-14 3 views
0

사용자가 자신의 화면을 터치하면 해당 위치에 비트 맵이 그려지는 단순 라이브 배경 무늬를 만들려고합니다. 나는 2 개의 문제에 직면하고있다. Runnable에서 드로잉을한다면 비트 맵을 지속적으로 생성하고, 드로잉을 바깥쪽으로 그리면 계속 깜박이다. 나는 내가 runnable blinking을위한 나의 지연 시간을 변경한다면 또한 변화를 발견했다. 그리고 나는 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); 
     } 
    }  
} 
+0

실제 효과는 방법 "() 렌더링" ") (그릴"에서 할 또는 것입니다. 여기에 코드를 게시해야합니다. –

+0

전체 코드입니다. 그것은 draw() 메소드를 사용합니다. –

답변

0

는 현재이 샘플 코드

을 시도 할 수 있습니다 귀하의 이미지 전화 메모리에있는 경우 이미지 URL은 이미지 위치

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

에 대한 HTTP 링크입니다.

사용이

image.setImageResource(R.drawable.test2); 
+0

이 사용자에 대한 인터넷 : 내 Bitmap inbuilt 싶어요. –

+0

BitMap은 Java의 Inbuilt Class입니다. 나는 너를 말하는거야? –

+0

위 코드는 인터넷 연결을 필요로합니다. 인터넷 연결을 사용할 수없는 경우에도 작동해야합니다. –