2013-06-23 6 views
1

Новое в разработке android. Я пытаюсь рисовать растровое изображение всякий раз, когда пользователь прикасается к экрану. Мне удалось получить позицию x и y события касания, которое происходит на экране. Но я не могу понять, почему упомянутая ниже программа не будет рисовать изображение на холсте.Android - рисование растрового изображения на экране при событии касания

Вот код, я работаю над:

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