Java 使用Canvas和Framelayout android绘制圆

Java 使用Canvas和Framelayout android绘制圆,java,android,xml,canvas,Java,Android,Xml,Canvas,我正在尝试创建一个应用程序,每次单击按钮时都会显示一个圆圈。我的布局看起来很棒,但当我点击按钮(圆圈)在屏幕上显示一个圆圈时,什么也没有发生。我不相信我的画圈课在我的主要活动中被正确调用。下面是我的代码 package com.example.randomcircles; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Canvas; import

我正在尝试创建一个应用程序,每次单击按钮时都会显示一个圆圈。我的布局看起来很棒,但当我点击按钮(圆圈)在屏幕上显示一个圆圈时,什么也没有发生。我不相信我的画圈课在我的主要活动中被正确调用。下面是我的代码

 package com.example.randomcircles;

 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.Button;
 import android.widget.FrameLayout;

public class DisplayRandomCircles extends Activity
{
  DrawCircle c;
  Canvas d;
  @Override
public void onCreate(Bundle b)
{
    super.onCreate(b);
    setContentView(R.layout.activity_display_random_circles);
    Button btn1 = (Button) findViewById(R.id.btn1);
    Button btn2 = (Button) findViewById(R.id.btn2);
    c = new DrawCircle(getApplicationContext());
    d = new Canvas();
    FrameLayout f1 = (FrameLayout) findViewById(R.id.frame);

}
@SuppressLint("WrongCall")
public void doit(View v)
{
    switch (v.getId())
    {
        case (R.id.btn1):
            c.onDraw(d);
            break;

        case (R.id.btn2):
            break;
    }
}
}
这是我的DrawCircle课程

package com.example.randomcircles;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class DrawCircle extends View
{
public DrawCircle(Context con)
{
    super(con);
}
@Override
protected void onDraw(Canvas c)
{
    super.onDraw(c);
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
    p.setAntiAlias(true);
    p.setStyle(Paint.Style.STROKE);
    p.setStrokeWidth(100);
    p.setColor(Color.RED);
    p.setStyle(Paint.Style.FILL);
    c.drawCircle(75, 75, 100, p);
}
}
和我的布局xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<FrameLayout
    android:id="@+id/frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight=".75"
    android:orientation="vertical" >


</FrameLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight=".25"
    android:gravity="bottom|center"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start|bottom"
        android:layout_weight=".50"
        android:onClick="doit"
        android:text="@string/Circle" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight=".50"
        android:layout_gravity="end|bottom"
        android:onClick="doit"
        android:text="@string/Clear" />
</LinearLayout>

</LinearLayout>

好的,下面是我对此所做的一些更改。我不确定你想做什么,但这会让事情变得更容易

首先,将您的类“DrawCircle”更改为:

 public class DrawCircle extends View
{
  final Paint circlePaint;

  {
      circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
      circlePaint.setAntiAlias(true);
      circlePaint.setStyle(Paint.Style.STROKE);
      circlePaint.setStrokeWidth(100);
      circlePaint.setColor(Color.RED);
      circlePaint.setStyle(Paint.Style.FILL);
  }

  public DrawCircle(Context con)
  {
     super(con);
  }

  public DrawCircle(Context con, AttributeSet set) 
  {
     super(con, set);
  }

  public DrawCircle(Context con, AttributeSet set, int style)
  {
     super(con, set, style);
  }

  @Override
  protected void onDraw(Canvas c)
  {
    super.onDraw(c);
    c.drawCircle(75, 75, 100, circlePaint);
  }
}
这将允许您在每次绘制时重复使用相同的
Paint
对象,因为
onDraw()
方法可以被调用数百次,并且不需要为此降低程序的速度

其次,通过添加其他构造函数,可以通过xml将视图添加到框架布局中

<FrameLayout
    android:id="@+id/frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

  <com.example.randomCircles.DrawCircle
     android:id="@+id/circleFrame"
     android:layout_width="match_parent"
     android:layout_height="match_parent" />

</FrameLayout>

接下来,要填充屏幕,需要循环onDraw方法。想象一下在画布上画一张邮票。每次绘制时,都会在上一次绘制顶部指定的位置标记图像

所以

受保护的void onDraw(画布c)
{
super.onDraw(c);
对于(int i=0;i<10;i++)
{
c、 画圈(i*100,75,100,画圈);
}
} 

这将在屏幕顶部绘制10个半径为100像素的圆圈。

您没有将DrawCircle视图添加到任何框架布局中。您永远不必手动调用draw或onDraw。视图层次结构将为您完成此操作。如何将DrawCircle视图添加到FrameLayout?您可以使用
View\addView()
方法。它会放在左上角。如果你想移动它,你必须使用边距和/或重力。谢谢你的工作。但如果我再次单击圆圈按钮,应用程序将关闭。我希望能够用圆圈填充屏幕。我需要把我的ondraw方法放在一个循环中吗?非常感谢。它就像一个符咒。我正在动态添加。我有一个FrameLayout元素主体。在java文件中动态添加:body.addView(newDrawCircle(this));
protected void onDraw(Canvas c) 
{
  super.onDraw(c);
  for(int i = 0; i < 10; i++)
  {
     c.drawCircle(i*100, 75, 100, circlePaint);
  }
}