2012-05-01 1 views
0

La méthode onKeyDown ne fonctionne pas. Lorsque j'appuie sur le bouton, le bitmap ne bouge pas. Quand c'est fait directement en mettant j = j + 5; à l'intérieur de la toile cela fonctionne. Quand l'a-t-on directement dans onkeydown j + 5 alors aussi il ne bougeait pas.Toile Surface View. @Override sur la touche enfoncée

public class SmileyView extends SurfaceView implements SurfaceHolder.Callback { 
     public SmileyView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      // TODO Auto-generated constructor stub 
      holder = getHolder(); 
      s= BitmapFactory.decodeResource(context.getResources(),R.drawable.smiley); 
      holder.addCallback(this); 
      sd=context.getResources().getDrawable(R.drawable.lander_plain); 
     } 

     @Override 
    public boolean onKeyDown(int keyCode, KeyEvent msg) { 

     return rv.dokey(); 
     } 
    private int i=100;private int j=0; 
     private Bitmap s;private SurfaceHolder holder;private RenderView rv ; 
     boolean grun=true;long t=0;private boolean key=false;private Drawable sd;volatile private int f=0; 
     public void resume() 
     { 
      rv=new RenderView(); 
     } 


     @Override 
     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void surfaceCreated(SurfaceHolder arg0) { 
      // TODO Auto-generated method stub 
      grun=true; 
      if(rv!=null) 
      rv.start(); 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder arg0) { 
      // TODO Auto-generated method stub 
     try { 
      grun =false; 
      rv.join(); 
      rv=null; 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 


    class RenderView extends Thread { 

     RenderView(){ 
     super(); 

     } 
     @Override 
     public void run() 
     { 
      SurfaceHolder h=holder; 
      while(grun) 
      { 
       Canvas ca=null; 
       try{ca = h.lockCanvas(null); 
        synchronized (h) { 

       dodraw(ca); 
        } 
       } 
       finally 
       { 
        if(ca!=null) 
        h.unlockCanvasAndPost(ca); 
       } 
      } 
     } 
     public void dodraw(Canvas canvas) 

     { canvas.drawColor(Color.BLACK); 
      canvas.drawBitmap(s, j, j, null); 

      sd.setBounds(10, 10, 230, 180); 
      sd.draw(canvas); 
      key =false; 

      canvas.restore(); 
     } 

     boolean dokey() 
     { 
      j=j+5; 
      return true; 
     } 
    } 

    } 

Répondre

1

La vue doit avoir le focus afin d'accepter les événements clés, et en plus de forcer focalisable sur l'élément, theres pas une bonne façon de rendre votre SmileyView prendre le focus. Au lieu de cela, Remplacer onKeyDown dans votre activité pour passer à travers l'événement clé, si ce surfaceview est la seule chose sur l'écran:

public class MyActivity extends Activity { 
    private SmileyView mSmileyView 

    @Override 
    protected boolean onKeyDown(int keyCode, KeyEvent event) { 
    return mSmileyView.onKeyDown(keyCode, event); 
    } 
} 
+0

cela a fonctionné. Merci. Pouvez-vous suggérer une méthode qui fonctionnerait dans la vue des smileys. – user1318755

0

Est-ce que vous essayez de déboguer? j doit être synchronisé. Vous l'éditez à partir d'un fil et l'utiliser dans le fil de rendu

Questions connexes