it-swarm.com.de

Wie zeichnet man einen Kreis nach Leinwand in Android?

Ich möchte einen Kreis nach Leinwand zeichnen. Hier ist mein Code:

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

Ich habe also nur einen schwarzen Bildschirm ohne Kreis ... Warum funktioniert es nicht? Wie man es repariert?

59
pvl

Sie können die onDraw-Methode Ihrer Ansicht überschreiben und den Kreis zeichnen.

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

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

}

Weitere Informationen zum Zeichnen von benutzerdefinierten Ansichten finden Sie in der offiziellen Android-Dokumentation.

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

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

Edit , Wenn Sie einen Kreis in der Mitte zeichnen möchten. Sie können auch die gesamte Leinwand in die Mitte übersetzen und dann in der Mitte einen Kreis zeichnen 

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

Diese beiden Links helfen auch

http://www.compiletimeerror.com/2013/09/einführung-nach-2d-ziehen-in-Android.html#.VIg_A5SSy9o

http://Android-coding.blogspot.com/2012/04/draw-circle-on-canvas-canvasdrawcirclet.html

28
Xar E Ahmer
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-Beispiel: erzeugt einen Kreis von 5 dB

 <com.example.CircleView
        Android:layout_width="10dp"
        Android:layout_height="10dp"/>
9
Tobrun
@Override
public void onDraw(Canvas canvas){
    canvas.drawCircle(xPos, yPos,radius, Paint);
}

Oben ist der Code zum Rendern eines Kreises. Passen Sie die Parameter an Ihre Anforderungen an.

3
jonney

Wenn Sie Ihre eigene CustomView-erweiterende View-Klasse verwenden, müssen Sie die canvas.invalidate () - Methode aufrufen, die intern die onDraw-Methode aufruft. Sie können die Standard-API für die Leinwand verwenden, um einen Kreis zu zeichnen. Die XY-Koordinate definiert den Mittelpunkt des Kreises. Sie können Farbe und Stil auch in Paint definieren und das Paint-Objekt übergeben.

public class CustomView extends View {

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

Definieren Sie die Standard-Paint-Einstellungen und die Zeichenfläche (Initialisieren Sie Paint im Konstruktor, damit Sie dasselbe Objekt überall wiederverwenden und nur bestimmte Einstellungen ändern können, wenn dies erforderlich ist.)

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

Und initialisieren Sie das Leinwandobjekt

private Canvas canvas;

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

Schließlich müssen Sie für jede Ansichtsaktualisierung oder neue Zeichnung auf dem Bildschirm die invalidate-Methode aufrufen. Denken Sie daran, dass Ihre gesamte Ansicht neu gezeichnet wird. Dies ist also ein teurer Anruf. Stellen Sie sicher, dass Sie nur die erforderlichen Vorgänge in onDraw ausführen

canvas.invalidate();

Weitere Informationen zum Zeichnen auf der Leinwand finden Sie unter https://medium.com/@mayuri.k18/Android-canvas-for-drawing-and-custom-views-e1a3e90d468b

0
mayuri

Versuche dies 

 enter image description here

Den gesamten Code zum Zeichnen eines Kreises oder Herunterladen von Projektquellcode und Testen Sie ihn in Ihrem Android-Studio. Zeichne einen Kreis programmatisch auf die Leinwand.

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;
            }
0
Daniel Nyamasyo

Hier ist ein Beispiel zum Zeichnen eines Strichkreises

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

Ergebnis

Beispiel zum Zeichnen von Vollkreis-Canvas

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

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

Ergebnis

Hoffe es hilft

0
Phan Van Linh