2011-07-27 3 views
0

私は簡単なGUIのやりとりをしようとしています - 画面に触れて、その前の位置から赤いボールを移動させてください。私のボールが私が意図した場所からのオフセットで出現することを除いて、すべてが素晴らしい作品です。オフセットは元のボールを描いた場所と直接関係しています。あたかもボールビューにそのオフセットがそのサイズの一部として含まれているかのようです。 たとえば、元の値をX = 100、Y = 100で半径25で描画した場合、getXとgetYの各戻り値から100を引き、適切な場所に配置する必要があります。私はこれが正常ではないと確信していますが、私の問題を見つけることができませんでした。助けてもらえますか?コードはonDraw操作は、私が期待するところに円を描いていません

public LinearLayout my_canvas; 
public Ball ball1; 

public class Ball extends View { 
    private final float x; 
    private final float y; 
    private final int r; 
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

    public Ball(Context context, float x, float y, int r) { 
     super(context); 
     mPaint.setColor(0xFFFF0000); 
     LinearLayout.LayoutParams tlp = 
      new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT); 
     this.setLayoutParams(tlp); 
     this.x = x; 
     this.y = y; 
     this.r = r; 
     Log.v("BookOne", "ball constructor at "+x+","+y); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawCircle(x, y, r, mPaint); 
     my_canvas.invalidate(); 
    } 
} 

が主なアプリケーション内にあります。

my_canvas = (LinearLayout) findViewById(R.id.my_canvas); 
    my_canvas.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent e) { 
       Log.v("BookOne", "Entered onTouch for canvas"); 
       float x = e.getX(); 
       float y = e.getY(); 

       Log.v("BookOne", "set coordinates"); 
       ball1.setX(x); 
       ball1.setY(y); 
       ball1.invalidate(); 
       //my_canvas.invalidate(); 

       Log.v("BookOne", "get ranges"); 
       int r = v.getRight(); 
       int l = v.getLeft(); 
       int t = v.getTop(); 
       int b = v.getBottom(); 
       int w = v.getWidth(); 
       int h = v.getHeight(); 
       Log.v("BookOne", "Ball moving to "+x+","+y); 
       log_view_dimensions("ball1 dimensions", ball1); 
       log_view_dimensions("View v dimensions", v); 
       log_view_dimensions("my_canvas dimensions", my_canvas); 
       Log.v("BookOne", "about to return FALSE"); 
       return(false); 
      } 
    }); 

    ball1 = new Ball(my_canvas.getContext(), 100, 100, 25); 
    my_canvas.addView(ball1); 
    Log.v("BookOne", "ball1 added"); 

続い私はgetXメソッドとのgetYから取得していますXとYの値が正しい表示されますが、ボールが離れて100個のピクセルが再描画されています。

はFYI、ここでLogCatからダンプがあります:

7月26日20:54:43.830:VERBOSE/BookOne(5463):54:キャンバス 7月26日20用onTouchに参入43.830:VERBOSE/BookOne( 5463):座標を設定 07-26 20:54:43.830:VERBOSE/BookOne(5463):範囲を取得 07-26 20:54:43.830:ボールを337.0,262.5に移動 07- 26 20:54:43.830:VERBOSE/BookOne(5463):ball1ディメンションl = 0; r = 800; t = 0; b = 536 07-26 20:54:43.830:VERBOSE/BookOne(5463):ball1ディメンションw = 800; h = 536 07-26 20:54:43.830:VERBOSE/BookOne(5463):v次元を表示するl = 0; r = 800; t = 584; b = 1120 07-26 20:54:43.830:VERBOSE/BookOne(5463):v次元を表示するw = 800; h = 536 07-26 20:54:43.830:VERBOSE/BookOne(5463):my_canvasディメンションl = 0; r = 800; t = 584; b = 1120 07-26 20:54:43.830:VERBOSE/BookOne(5463):my_canvasディメンションw = 800; h = 536 07-26 20:54:43.830:VERBOSE/BookOne(5463):FALSEを返します。

ball1の寸法に注意してください。何が意味ですか?

事前のお手伝いがあります。

マイク

答えて

0

サークルのオフセットのための可能な理由は、あなたがonMeasure()メソッドをオーバーライドしていないことです。 onMeasureの実装が提供されていない場合、デフォルトでAndroidはサイズを100 X 100に設定します。その結果、xとyから100を引いて正しい位置にボールを取得します。

関連する問題