0

私は、動きHelloWorld!!を使って描かれた""文字列で愚かなアプリケーションを実行しようとしています。Canvas文字列の位置(x_new, y_new)は、単に古い位置にイベントによって返される位置を(x_old, y_old)加えたものです。問題は、イベントが認識されないことです。この関数は、常に変更されない場所のようなものを出力します。何か提案はありますか?ありがとう!!(x, y)ACTION_UPACTION_UPLog.d()motionEvent(28254): MotionEvent{4050df70 action=4 x=354.0 y=415.0 pressure=0.20000002 size=0.26666668}action=4

class myView extends View {

private Canvas canvas;
    private int x;
private int y;

public HUDView(Context context) {
   super(context);
   this.x=5;
   this.y=5;    

}


protected void onDraw(Canvas canvas) {
    this.canvas=canvas;
    this.canvas.drawText("HelloWorld!!", x, y, mLoadPaint);
}

@Override
public boolean onTouchEvent( MotionEvent event) {
    super.onTouchEvent(event);
    Log.d("motionEvent", event.toString());
    if (event.getAction()==MotionEvent.ACTION_UP){
        Log.d("motionEvent", "action_up");
            this.x+=(int)event.getX();
            this.y+=(int)event.getY();
        return true;
    }
    this.postInvalidate();
    return true;
}


}
4

2 に答える 2

2
  1. グローバル変数 Canvas は必要ありません(ビューで更新されていないキャンバスに描画しています)

  2. onTouchEven では、Action がアップしていても、postInvalidating なしで true を返します

  3. コンストラクタの名前が間違っています

質問にあるように、コードは実行されません。これはうまくいくはずですが

class myView extends View {

  private int x;
  private int y;

  public myView (Context context) {
    super(context);
       this.x=5;
       this.y=5;    
  }

 @Override
 protected void onDraw(Canvas canvas){
         canvas.drawText("HelloWorld!!", x, y, mLoadPaint);
 }

 @Override
public boolean onTouchEvent( MotionEvent event) {
     super.onTouchEvent(event);
      Log.d ("motionEvent", event.toString());
        if (event.getAction()==MotionEvent.ACTION_UP){
        Log.d("motionEvent", "action_up");
        this.x+=(int)event.getX();
        this.y+=(int)event.getY();
       }
      this.postInvalidate();
     return true;
  }

}
于 2012-12-17T15:52:44.900 に答える
0

use invalidate post invalidate はスレッドで使用されます

于 2012-12-17T15:59:05.370 に答える