Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在视图上绘制自定义视图(如圆形)?_Android_Android Studio_Canvas_Draw_Android Custom View - Fatal编程技术网

Android 如何在视图上绘制自定义视图(如圆形)?

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){

对于我的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){
    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类,让它们使用自己计算的位置进行绘制。非常感谢。我现在明白了。