How do you draw a custom view(e.g. Circle) on a View?
<p>For my Pong clone, I am trying to draw a custom View from class Ball onto my View in class GamePanel. 
However it's nowhere to be seen on the screen at runtime. </p>

<pre><code>public class Ball extends View {

private float posX;
private float posY;
private float radius;

private Paint paint;

public Ball(Context context, float posX, float posY, float radius){
    super(context);
    this.posX = posX;
    this.posY = posY;
    this.radius = radius;
    setWillNotDraw(false);
    init();

}

private void init(){

    paint = new Paint();
    paint.setColor(Color.WHITE);
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawCircle(posX, posY, radius, paint);

}
</code></pre>

<p>Now this is my class GamePanel.</p>

<pre><code>public class GamePanel extends View implements GestureDetector.OnGestureListener{

private Context context;

//Screen height and width in pixels
private static int width;
private static int height;

private MainThread thread;

private Rect paddle1;
private Rect paddle2;

private Ball ball;

private Paint paint;

//Starting position paddle1
private int xPos1;
private int yPos1;

// Starting position paddle2
private int xPos2;
private int yPos2;

//Width and height of paddles
private int pWidth;
private int pHeight;

private GestureDetectorCompat gestureDetector;

public GamePanel(Context context) {

    super(context);

    this.context = context;

    //Information we will need for positioning our objects inside the panel
    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();

    width = displayMetrics.widthPixels;
    height = displayMetrics.heightPixels;

    //Make the GamePanel focusable
    setFocusable(true);

    // Thread needs information about the game panel
    thread = new MainThread(this);

    pWidth = 100;
    pHeight = height/2;

    xPos1 = width/15;
    yPos1 = 0;

    xPos2 = width - xPos1 - pWidth;
    yPos1 = 0;

    paddle1 = new Rect(xPos1, yPos1, xPos1 + pWidth, yPos1 + pHeight);
    paddle2 = new Rect(xPos2, yPos2, xPos2 + pWidth, yPos2 + pHeight);

    paint = new Paint();
    paint.setColor(Color.WHITE);

    ball = new Ball(context, 300, 300, 300);

    setBackgroundColor(Color.BLACK);

    this.gestureDetector = new GestureDetectorCompat(context, this);

    thread.setRunning(true);
    thread.start();
}


@Override
protected void onDraw(Canvas canvas) {

    canvas.drawRect(paddle1, paint);
    canvas.drawRect(paddle2, paint);

}
</code></pre>

<p>I tried calling invalidate() and postInvalidate() inside my MainThread thread, in the constructor of GamePanel and in the constructor of Ball. The ball is never drawn onto the screen. </p>

<p>As you can see I already faced this problem with the paddles in Pong therefore I created two Rectangles inside GamePanel which is very ugly. </p>

<p>How do I encapsulate the rectangle and the circle (ball) so that it can still be drawn on a Canvas? </p>