有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在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);
    }
}

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


共 (6) 个答案

  1. # 1 楼答案

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

    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);
    }
    

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

    canvas.invalidate();
    

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

  2. # 2 楼答案

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

    上面是渲染圆的代码。根据你的衣服调整参数

  3. # 3 楼答案

    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);
            }
        }
    }
    

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

     <com.example.CircleView
            android:layout_width="10dp"
            android:layout_height="10dp"/>
    
  4. # 4 楼答案

    试试这个

    enter image description here

    绘制圆的完整代码或下载项目源代码并在android studio上进行测试Draw circle on canvas programmatically.

    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;
                }
    
  5. # 6 楼答案

    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