2013-06-23 2 views
1

안드로이드 개발에 새로운입니다. 나는 사용자가 화면에 닿을 때마다 비트 맵 이미지를 그리려하고있다. 나는 화면에서 일어나는 터치 이벤트의 x와 y 위치를 가져올 수 있었다. 그러나 아래에 언급 된 프로그램이 캔버스에 이미지를 그리지 않는 이유를 알 수 없습니다.안드로이드 - 터치 이벤트에서 화면에 비트 맵 그리기

public class SurfaceViewTest extends Activity implements OnTouchListener {  
FastRenderView renderView; 
Bitmap bob565; 
Bitmap bob4444; 
float x,y; 
Canvas canvas = new Canvas(); 

public void onCreate(Bundle savedInstanceState) { 


    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
         WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    renderView = new FastRenderView(this); 
    setContentView(renderView); 
} 


protected void onResume() { 
    super.onResume(); 
    renderView.resume(); 
} 

protected void onPause() { 
    super.onPause();   
    renderView.pause(); 
}  


public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 
    ; 
switch (event.getAction()) { 

    case MotionEvent.ACTION_DOWN: 
     x = event.getX(); 
     y = event.getY() 
     canvas.drawBitmap(bob4444, x, y, null); 
     break; 

    } 
    return true; 
} 




class FastRenderView extends SurfaceView implements Runnable { 
    Thread renderThread = null; 
    SurfaceHolder holder; 
    volatile boolean running = false; 

    public FastRenderView(Context context) { 
     super(context);   
     holder = getHolder();  

     try { 
      AssetManager assetManager = context.getAssets(); 
      InputStream inputStream = assetManager.open("bobrgb888.png"); 
      bob565 = BitmapFactory.decodeStream(inputStream); 
      inputStream.close(); 
      Log.d("BitmapText", 
        "bobrgb888.png format: " + bob565.getConfig()); 

      inputStream = assetManager.open("bobargb8888.png"); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inPreferredConfig = Bitmap.Config.ARGB_4444; 
      bob4444 = BitmapFactory.decodeStream(inputStream, null, options); 

      inputStream.close(); 
      Log.d("BitmapText", 
        "bobargb8888.png format: " + bob4444.getConfig()); 

     } catch (IOException e) { 

     } finally { 
      // we should really close our input streams here. 
     } 
    } 


    public void resume() {   
     running = true; 
     renderThread = new Thread(this); 
     renderThread.start();   
    }  

    public void run() { 
     while(running) { 
      if(!holder.getSurface().isValid()) 
       continue; 

      Canvas canvas = holder.lockCanvas();    
      canvas.drawRGB(0, 0, 255);  
      canvas.drawBitmap(bob4444, x, y, null); 
      holder.unlockCanvasAndPost(canvas); 



     } 
    } 

    public void pause() {       
     running = false;       
     while(true) { 
      try { 
       renderThread.join(); 
       return; 
      } catch (InterruptedException e) { 
       // retry 
      } 
     }  


     }   
    } 
} 
+0

http://stackoverflow.com/questions/14676741/how-to-redraw-surfaceview-using-invalidate-metod 가능성 관련? – Lesleh

답변

2

결코 마음 : 여기

내가 일하고 코드입니다. 나는 그것을 스스로 알아 냈다. 내가보기에 터치 리스너를 설정하는 것을 놓쳤다. 변경 한 후의 최종 코드는 다음과 같습니다.

public class SurfaceViewTest extends Activity implements OnTouchListener{  
    FastRenderView renderView;    
    float x, y; 
    Bitmap bob565, bob4444; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
         WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    renderView = new FastRenderView(this); 
    renderView.setOnTouchListener(this); 
    setContentView(renderView); 
}  



protected void onResume() { 
    super.onResume(); 
    renderView.resume(); 
} 

protected void onPause() { 
    super.onPause();   
    renderView.pause(); 
}  

class FastRenderView extends SurfaceView implements Runnable { 
    Thread renderThread = null; 
    SurfaceHolder holder; 
    volatile boolean running = false; 

    public FastRenderView(Context context) { 
     super(context);   
     holder = getHolder(); 


     try{ 
     AssetManager assetManager = context.getAssets(); 
     InputStream inputStream = assetManager.open("bobrgb888.png"); 
     bob565 = BitmapFactory.decodeStream(inputStream); 
     inputStream.close(); 
     Log.d("BitmapText", 
       "bobrgb888.png format: " + bob565.getConfig()); 

     inputStream = assetManager.open("bobargb8888.png"); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_4444; 
     bob4444 = BitmapFactory 
       .decodeStream(inputStream, null, options); 
     inputStream.close(); 
     Log.d("BitmapText", 
       "bobargb8888.png format: " + bob4444.getConfig()); 

     } 
     catch (IOException e) { 
      // silently ignored, bad coder monkey, baaad! 
     } finally { 
      // we should really close our input streams here. 
     } 
    } 

    public void resume() {   
     running = true; 
     renderThread = new Thread(this); 
     renderThread.start();   
    }  

    public void run() { 
     while(running) { 
      if(!holder.getSurface().isValid()) 
       continue; 

      Canvas canvas = holder.lockCanvas();    
      canvas.drawRGB(0, 0, 255); 

      canvas.drawBitmap(bob4444, x-bob4444.getWidth()/2, y-bob4444.getHeight()/2, null); 
      holder.unlockCanvasAndPost(canvas);    
     } 
    } 

    public void pause() {       
     running = false;       
     while(true) { 
      try { 
       renderThread.join(); 
       return; 
      } catch (InterruptedException e) { 
       // retry 
      } 
     }  
    }   
} 

public boolean onTouch(View v, MotionEvent event) { 
    // TODO Auto-generated method stub 

    switch (event.getAction()) { 


    case MotionEvent.ACTION_UP: 
     x = event.getX(); 
     y = event.getY(); 

     break; 
    } 


    return true; 
} 

}

+0

+1, 당신은 당신 자신을 알아 냈고, stackoverflow에 오신 것을 환영합니다. – Charlie

+0

@FAST 감사합니다! – Pramit