2012-05-01 10 views
0

onKeyDownメソッドは機能しません。私がボタンを押すと、ビットマップは動かない。 j = j + 5を直接入力すると、キャンバスの内部では動作します。 それはonkeydown j + 5に直接行ったとき、それも動いていませんでした。表面ビューキャンバス。 @キーダウン時のオーバーライド

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; 
     } 
    } 

    } 

答えて

1

ビューは、キーイベントを受け入れるためにフォーカスを持っている必要があり、要素にフォーカス可能強制以外に、あなたのSmileyViewがフォーカスを取るようにする良い方法をtheresの。代わりに、このsurfaceviewは、画面上の唯一のものであれば、キーイベントを通過するように、あなたの活動にonKeyDownメソッドオーバーライド:

public class MyActivity extends Activity { 
    private SmileyView mSmileyView 

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

ありがとう。あなたは、スマイリービューの中で動作するいくつかの方法を提案できますか? – user1318755

0

あなたはデバッグしようとしましたか? jを同期させる必要があります。 1つのスレッドから編集し、レンダースレッドで使用します。