如何在视图上绘制自定义视图(例如圆形)?
How do you draw a custom view(e.g. Circle) on a View?
对于我的 Pong 克隆,我正在尝试从 class Ball 绘制一个自定义视图到我在 class GamePanel 中的视图上。
但是,在运行时屏幕上看不到它。
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);
}
现在这是我的 class 游戏面板。
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);
}
我尝试在我的 MainThread 线程、GamePanel 的构造函数和 Ball 的构造函数中调用 invalidate() 和 postInvalidate()。球永远不会被绘制到屏幕上。
正如您所看到的,我已经在 Pong 中遇到了这个问题,因此我在 GamePanel 中创建了两个非常难看的矩形。
如何封装矩形和圆形(球),使其仍然可以绘制在 Canvas 上?
您正在 GamePanel 视图中创建 Ball(circle) 视图。仅仅因为您正在创建一个视图并不意味着它会被绘制在屏幕上。您需要将视图附加到布局。
简单的解决方案是将 GamePanel 扩展为 Ball
public class GamePanel extends Ball {
}
然后在GamePanel
的onDraw()函数中添加super.onDraw();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(); //Will draw the circle before drawing rectangle
canvas.drawRect(paddle1, paint);
canvas.drawRect(paddle2, paint);
}
如果将 super.onDraw()
放在 drawRect
下方,则在绘制矩形后绘制圆。
You also need to understand the basic concept of adding the view to
layout.
对于我的 Pong 克隆,我正在尝试从 class Ball 绘制一个自定义视图到我在 class GamePanel 中的视图上。 但是,在运行时屏幕上看不到它。
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);
}
现在这是我的 class 游戏面板。
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);
}
我尝试在我的 MainThread 线程、GamePanel 的构造函数和 Ball 的构造函数中调用 invalidate() 和 postInvalidate()。球永远不会被绘制到屏幕上。
正如您所看到的,我已经在 Pong 中遇到了这个问题,因此我在 GamePanel 中创建了两个非常难看的矩形。
如何封装矩形和圆形(球),使其仍然可以绘制在 Canvas 上?
您正在 GamePanel 视图中创建 Ball(circle) 视图。仅仅因为您正在创建一个视图并不意味着它会被绘制在屏幕上。您需要将视图附加到布局。 简单的解决方案是将 GamePanel 扩展为 Ball
public class GamePanel extends Ball {
}
然后在GamePanel
的onDraw()函数中添加super.onDraw();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(); //Will draw the circle before drawing rectangle
canvas.drawRect(paddle1, paint);
canvas.drawRect(paddle2, paint);
}
如果将 super.onDraw()
放在 drawRect
下方,则在绘制矩形后绘制圆。
You also need to understand the basic concept of adding the view to layout.