Why does this code only draw a circle once? I cannot for the life of me figure it out. Do I need to do some kind of refresh or something? I am able to get a red dot, to draw once, but any click after does not show a new dot, or even move the previous one.
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);
}
}
Change your
LinearLayoutto anAbsoluteLayout. I think what’s happening is that your firstBallViewis actually taking up the entirety of theLinearLayoutview group and any other views you add to it are being pushed out of the layout.Also, look into using
addView(View, AbsoluteLayout.LayoutParams)instead, so you can set the size/position of the ball there as opposed to inBallView.onDraw, which will allow smaller regions of your layout to be marked dirty.