Android 如何在视图上绘制自定义视图(如圆形)?
对于我的Pong克隆,我正在尝试将自定义视图从类Ball绘制到类GamePanel中的视图上。 然而,在运行时屏幕上看不到它Android 如何在视图上绘制自定义视图(如圆形)?,android,android-studio,canvas,draw,android-custom-view,Android,Android Studio,Canvas,Draw,Android Custom View,对于我的Pong克隆,我正在尝试将自定义视图从类Ball绘制到类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){
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);
}
这是我的班级游戏面板
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);
}
我尝试在主线程、GamePanel的构造函数和Ball的构造函数中调用invalidate()和postInvalidate()。球永远不会被吸引到屏幕上
正如你们所看到的,我已经在乒乓球中遇到了这个问题,所以我在游戏面板中创建了两个矩形,非常难看
如何封装矩形和圆形(球),使其仍然可以在画布上绘制 您正在游戏面板内创建球(圆)视图。仅仅因为您正在创建一个视图,并不意味着它将被绘制在屏幕上。您需要将视图附着到布局。 简单的解决方案是将游戏面板扩展到球
public class GamePanel extends Ball {
}
然后在GamePanel的onDraw()函数中添加super.onDraw()代码>
如果将super.onDraw()
放置在drawRect
下方,则在绘制rect之后将绘制圆
您还需要了解将视图添加到的基本概念
布局
您正在游戏面板内创建球(圆)视图。仅仅因为您正在创建一个视图,并不意味着它将被绘制在屏幕上。您需要将视图附着到布局。
简单的解决方案是将游戏面板扩展到球
public class GamePanel extends Ball {
}
然后在GamePanel的onDraw()函数中添加super.onDraw()代码>
如果将super.onDraw()
放置在drawRect
下方,则在绘制rect之后将绘制圆
您还需要了解将视图添加到的基本概念
布局
谢谢你的回答。我理解你的方法。问题:如果我想添加多个自定义视图并在GamePanel中绘制它们,该怎么办?所以我的意思是,如果我也将矩形封装到它自己的类中,比如球,会怎么样?我会让GamePanel从视图组或布局类型扩展并将自定义视图添加到其中吗?让我列出案例。如果您不打算移动这些形状,那么最好将GamePanel扩展到ViewGroup,并像创建“球”一样创建单独视图的形状,然后将这些视图添加到GmePanel。但是,如果您要将矩形和圆形等形状动态移动或转换到GamePanel中的任何位置,那么最好将它们的功能移动到另一个类(而不是单独的视图)中,并在GamePanel中初始化。查看此项目库,例如Ok,我看到了。如你所知,我已经把球分到了一个单独的班级。我不能将它们放入视图组,因为它们需要是动态的。它现在需要扩展哪个类?我应该在GamePanel中在哪里初始化它/我应该告诉它在GamePanel中在哪里画球?抱歉问了这么多基本的问题。我是Android开发的新手,几天来我一直在研究如何封装矩形和球形。这看起来很简单,但我不知怎么搞不懂。感谢您对meNo问题的帮助:)您需要扩展GamePanel以查看,其他形状类不应扩展任何内容。初始化游戏面板构造函数中的所有类(球)。然后计算绘制所有形状的位置。如果使用触摸作为输入,则将触摸事件传递给所有shapes类。他们应该计算他们的绘图位置。在同样的方式中,当调用游戏面板的onDraw时,将canvas对象传递给所有其他shape类,让它们使用自己计算的位置进行绘制。非常感谢。我现在明白了,非常感谢你的回答。我理解你的方法。问题:如果我想添加多个自定义视图并在GamePanel中绘制它们,该怎么办?所以我的意思是,如果我也将矩形封装到它自己的类中,比如球,会怎么样?我会让GamePanel从视图组或布局类型扩展并将自定义视图添加到其中吗?让我列出案例。如果您不打算移动这些形状,那么最好将GamePanel扩展到ViewGroup,并像创建“球”一样创建单独视图的形状,然后将这些视图添加到GmePanel。但是,如果您要将矩形和圆形等形状动态移动或转换到GamePanel中的任何位置,那么最好将它们的功能移动到另一个类(而不是单独的视图)中,并在GamePanel中初始化。查看此项目库,例如Ok,我看到了。如你所知,我已经把球分到了一个单独的班级。我不能将它们放入视图组,因为它们需要是动态的。它现在需要扩展哪个类?我应该在GamePanel中在哪里初始化它/我应该告诉它在GamePanel中在哪里画球?抱歉问了这么多基本的问题。我是Android开发的新手,几天来我一直在研究如何封装矩形和球形。这看起来很简单,但我不知怎么搞不懂。感谢您对meNo问题的帮助:)您需要扩展GamePanel以查看,其他形状类不应扩展任何内容。初始化游戏面板构造函数中的所有类(球)。然后计算绘制所有形状的位置。如果使用触摸作为输入,则将触摸事件传递给所有shapes类。他们应该计算他们的绘图位置。在同样的方式中,当调用游戏面板的onDraw时,将canvas对象传递给所有其他shape类,让它们使用自己计算的位置进行绘制。非常感谢。我现在明白了。