如何在 Android 中用画布画圆?

我想用画布画圆,这是我的代码:

[ MyActivity.java ] :

public class MyActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
...
setContentView(new View(this,w,h));
}
        

}

[ View.java ] :

public class View extends SurfaceView
{
public View(Context context, int w, int h)
{
super(context);
Canvas grid = new Canvas(Bitmap.createBitmap(h,w, Bitmap.Config.ARGB_8888));
grid. drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
grid.drawCircle(w/2, h/2 , w/2, paint);
}
}

所以我只有没有圆圈的黑屏。 为什么它不工作? 如何修复它?

242517 次浏览
@Override
public void onDraw(Canvas canvas){
canvas.drawCircle(xPos, yPos,radius, paint);
}

上面是呈现圆形的代码。调整适合您的参数。

可以重写视图的 onDraw 方法并绘制圆。

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);


canvas.drawCircle(x, y, radius, paint);


}

有关绘制自定义视图的更好参考,请查看官方 Android 文档。

Http://developer.android.com/training/custom-views/custom-drawing.html

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends Activity
{


@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}


public class MyView extends View
{
Paint paint = null;
public MyView(Context context)
{
super(context);
paint = new Paint();
}


@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
int x = getWidth();
int y = getHeight();
int radius;
radius = 100;
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
canvas.drawPaint(paint);
// Use Color.parseColor to define HTML colors
paint.setColor(Color.parseColor("#CD5C5C"));
canvas.drawCircle(x / 2, y / 2, radius, paint);
}
}
}

剪辑 如果你想在中心画圆。你也可以将你的整个画布转换到中心,然后在中心画圆

canvas.translate(getWidth()/2f,getHeight()/2f);
canvas.drawCircle(0,0, radius, paint);

这两个环节也有帮助

Http://www.compiletimeerror.com/2013/09/introduction-to-2d-drawing-in-android.html#.vig_a5ssy9o

Http://android-coding.blogspot.com/2012/04/draw-circle-on-canvas-canvasdrawcirclet.html

public class CircleView extends View {


private static final String COLOR_HEX = "#E74300";
private final Paint drawPaint;
private       float size;


public CircleView(final Context context, final AttributeSet attrs) {
super(context, attrs);
drawPaint = new Paint();
drawPaint.setColor(Color.parseColor(COLOR_HEX));
drawPaint.setAntiAlias(true);
setOnMeasureCallback();
}


@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(size, size, size, drawPaint);
}


private void setOnMeasureCallback() {
ViewTreeObserver vto = getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
removeOnGlobalLayoutListener(this);
size = getMeasuredWidth() / 2;
}
});
}


@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener listener) {
if (Build.VERSION.SDK_INT < 16) {
getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
}

将生成一个5dp 的圆

 <com.example.CircleView
android:layout_width="10dp"
android:layout_height="10dp"/>

试试这个

enter image description here

绘制一个圆圈或下载项目源代码的整个代码,并在您的 android 工作室测试它

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.widget.ImageView;




public class Shape {


private Bitmap bmp;
private ImageView img;
public Shape(Bitmap bmp, ImageView img) {


this.bmp=bmp;
this.img=img;
onDraw();
}


private void onDraw(){
Canvas canvas=new Canvas();
if (bmp.getWidth() == 0 || bmp.getHeight() == 0) {
return;
}


int w = bmp.getWidth(), h = bmp.getHeight();


Bitmap roundBitmap = getRoundedCroppedBitmap(bmp, w);


img.setImageBitmap(roundBitmap);


}


public static Bitmap getRoundedCroppedBitmap(Bitmap bitmap, int radius) {
Bitmap finalBitmap;
if (bitmap.getWidth() != radius || bitmap.getHeight() != radius)
finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius,
false);
else
finalBitmap = bitmap;
Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(),
finalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);


final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, finalBitmap.getWidth(),
finalBitmap.getHeight());


paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.parseColor("#BAB399"));
canvas.drawCircle(finalBitmap.getWidth() / 2 + 0.7f, finalBitmap.getHeight() / 2 + 0.7f, finalBitmap.getWidth() / 2 + 0.1f, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(finalBitmap, rect, rect, paint);


return output;
}

如果您正在使用自己的 CustomView 扩展 View 类,则需要调用将在内部调用 onDraw 方法的虚化()方法。您可以使用画布的默认 API 来绘制一个圆。X,y 坐标定义了圆的中心。你也可以定义颜色和样式在油漆和通过油漆对象。

public class CustomView extends View {


public CustomView(Context context,  AttributeSet attrs) {
super(context, attrs);
setupPaint();
}
}

定义默认的油漆设置和画布(在构造函数中初始化油漆,这样你就可以在任何地方重复使用相同的对象,并且只在需要的地方改变特定的设置)

private Paint drawPaint;


// Setup paint with color and stroke styles
private void setupPaint() {
drawPaint = new Paint();
drawPaint.setColor(Color.BLUE);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(5);
drawPaint.setStyle(Paint.Style.FILL_AND_STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
}

初始化画布对象

private Canvas canvas;


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.canvas = canvas;
canvas.drawCircle(xCordinate, yCordinate, RADIUS, drawPaint);
}

最后,对于屏幕上的每个视图刷新或新绘制,您需要调用无效方法。记住您的整个视图都是重绘的,因此这是一个代价高昂的调用。确保只在 onDraw 中执行必要的操作

canvas.invalidate();

有关画布绘图的详细信息,请参阅 https://medium.com/@mayuri.k18/android-canvas-for-drawing-and-custom-views-e1a3e90d468b

下面是画笔画圆画布的例子

val paint = Paint().apply {
color = Color.RED
style = Paint.Style.STROKE
strokeWidth = 10f
}


override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.drawCircle(200f, 100f, 100f, paint)
}

结果

绘制实心圆画布的示例

val paint = Paint().apply {
color = Color.RED
}


override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.drawCircle(200f, 100f, 100f, paint)
}

结果

希望能有帮助

    private Paint green = new Paint();


private int greenx , greeny;




green.setColor(Color.GREEN);


green.setAntiAlias(false);


canvas.drawCircle(greenx,greeny,20,green);