web-dev-qa-db-fra.com

Comment dessiner un cercle par la toile dans Android?

Je veux dessiner un cercle sur une toile. Voici mon 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);
    }
}

Donc, je viens d'avoir un écran noir sans cercle . Pourquoi cela ne fonctionne pas? Comment le réparer?

59
pvl

Vous pouvez remplacer la méthode onDraw de votre vue et dessiner le cercle.

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

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

}

Pour une meilleure référence sur le dessin de vues personnalisées, consultez la documentation officielle d'Android.

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

Éditer Si vous voulez dessiner un cercle au centre. Vous pouvez également traduire votre toile entière en son centre, puis tracer un cercle en son centre. 

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

Ces deux liens aident aussi

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

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

Exemple Xml: produira un cercle de 5dp

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

Ci-dessus est le code pour rendre un cercle. Ajustez les paramètres à votre convenance.

3
jonney

Si vous utilisez votre propre classe de vue extensible CustomView, vous devez appeler la méthode canvas.invalidate () qui appellera en interne la méthode onDraw. Vous pouvez utiliser l'API par défaut pour le canevas pour dessiner un cercle. Les coordonnées x, y définissent le centre du cercle. Vous pouvez également définir la couleur et le style dans Paint et transmettre l'objet Paint.

public class CustomView extends View {

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

Définissez les paramètres de peinture et le canevas par défaut (Initialisez Paint dans le constructeur pour pouvoir réutiliser le même objet partout et ne modifier que des paramètres spécifiques, le cas échéant).

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

Et initialise l'objet canvas

private Canvas canvas;

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

Et enfin, pour chaque rafraîchissement de vue ou nouveau dessin à l'écran, vous devez appeler la méthode invalidate. Rappelez-vous que votre vue entière est redessinée, il s'agit donc d'un appel coûteux. Assurez-vous de ne faire que les opérations nécessaires dans onDraw

canvas.invalidate();

Pour plus de détails sur le dessin sur toile, consultez https://medium.com/@mayuri.k18/Android-canvas-for-drawing-and-custom-views-e1a3e90d468b

0
mayuri

Essaye ça 

 enter image description here

L'ensemble du code permettant de dessiner un cercle ou de télécharger le code source du projet et de le tester sur votre studio Android. Dessine un cercle sur la toile par programmation.

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

Voici un exemple pour dessiner une toile de cercle à traits

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

Résultat

Exemple pour dessiner une toile de cercle solide

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

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

Résultat

J'espère que ça aide

0
Phan Van Linh