如何在Android中用画布绘制圆圈?

pvl*_*pvl 64 java android android-canvas

我想用画布绘制圆圈.这是我的代码:

[MyActivity.java]:

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

}
Run Code Online (Sandbox Code Playgroud)

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我只有黑色的屏幕没有圆圈.为什么它不起作用?怎么解决?

Dej*_*tic 74

您可以覆盖视图的onDraw方法并绘制圆.

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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


Xar*_*mer 30

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);
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

如果要在中心绘制圆圈,请进行编辑.您也可以将整个画布转换为居中,然后在center.using中绘制圆圈

canvas.translate(getWidth()/2f,getHeight()/2f);
canvas.drawCircle(0,0, radius, paint);
Run Code Online (Sandbox Code Playgroud)

这两个链接也有帮助

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


Tob*_*run 9

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Xml示例:将生成一个5dp的圆

 <com.example.CircleView
        android:layout_width="10dp"
        android:layout_height="10dp"/>
Run Code Online (Sandbox Code Playgroud)


May*_*ara 6

如果您使用自己的 CustomView 扩展 View 类,则需要调用 canvas.invalidate() 方法,该方法将在内部调用 onDraw 方法。您可以使用canvas的默认API来绘制圆。x、y 坐标定义圆的中心。您还可以在绘画中定义颜色和样式并传递绘画对象。

public class CustomView extends View {

    public CustomView(Context context,  AttributeSet attrs) {
        super(context, attrs);
        setupPaint();
    }
}
Run Code Online (Sandbox Code Playgroud)

定义默认绘画设置和画布(在构造函数中初始化绘画,以便您可以在任何地方重用相同的对象,并在需要时仅更改特定设置)

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);
}
Run Code Online (Sandbox Code Playgroud)

并初始化画布对象

private Canvas canvas;

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

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

canvas.invalidate();
Run Code Online (Sandbox Code Playgroud)

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