2012-03-26 13 views
0

Warum zeichnet dieser Code nur einmal einen Kreis? Ich kann nicht für das Leben von mir herausfinden. Muss ich etwas auffrischen oder etwas? Ich kann einen roten Punkt bekommen, einmal zeichnen, aber jeder Klick danach zeigt keinen neuen Punkt, oder bewegt sogar den vorherigen.Dieser Kreis zeichnet nur einmal in Android

package ball.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class BallActivity extends Activity { 
/** Called when the activity is first created. */ 

BallView bv; 
int i = 0; 
TextView tv; 

//float x = 20; 
//float y = 20; 
float r = 20; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    tv = (TextView) findViewById(R.id.top); 

    LinearLayout main = (LinearLayout) findViewById(R.id.main_view); 
    //main.addView(new BallView(this, 20, 20, 20)); 
    main.setOnTouchListener(new View.OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      i++; 
      float x = event.getX(); 
      float y = event.getY(); 

      tv.setText("Clicks: " + i + "X: " + x + "Y: " + y); 
      LinearLayout ll = (LinearLayout) v; 
      ll.addView(new BallView(ll.getContext(), x, y, 25)); 

      return false; 
     } 
    }); 
} 
} 


package ball.test; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.view.View; 

public class BallView extends View{ 

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

float x;// = 20; 
float y;// = 20; 
float r;// = 20; 

public BallView(Context context, float x, float y, float r) { 
    super(context); 
    this.x = x; 
    this.y = y; 
    this.r = r; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    paint.setColor(Color.RED); 
    //paint.setStyle(Style.FILL_AND_STROKE); 

    //canvas.drawColor(Color.WHITE); 
    canvas.drawCircle(x, y, r, paint); 
} 
} 
+0

Erhalten Sie irgendwelche Fehler oder Warnungen auf der Konsole? – sarnold

Antwort

3

ändern LinearLayout zu einem AbsoluteLayout. Ich denke, was passiert, ist, dass Ihre erste BallView tatsächlich die Gesamtheit der LinearLayout Ansichtsgruppe einnimmt und alle anderen Ansichten, die Sie hinzufügen, werden aus dem Layout geschoben.

Verwenden Sie stattdessen addView(View, AbsoluteLayout.LayoutParams), damit Sie die Größe/Position des Balls dort festlegen können, im Gegensatz zu BallView.onDraw, wodurch kleinere Bereiche Ihres Layouts als verschmutzt markiert werden können.

+0

Ich stimme zu, aber ich weiß, dass AbsoluteLayout ist depracted. Android schlägt vor, stattdessen ein FrameLayout oder RelativeLayout zu verwenden. – EGHDK

+0

Ich änderte es in ein Rahmenlayout und das löste mein Problem. Danke für die Vorschläge. – linuxer

Verwandte Themen