web-dev-qa-db-fra.com

Dessin de cercle par programme à l'aide d'Android ShapeDrawable

Dans mon projet, j'ai l'obligation de dessiner un cercle de manière dynamique. Donc, dans ce but, j'utilise ShapeDrawable pour créer un cercle par programme, mais malheureusement, je n'ai trouvé aucune classe ni méthode à l'intérieur de ShapeDrawable pour CircleShape. Au lieu de cela, je n'ai trouvé que OvalShape(). Si gentiment, aidez-moi à dessiner un cercle dans ShapeDrawable en passant juste du diamètre ou du rayon du cercle. Merci d'avance. Tout type de personnalisation me serait utile pour réparer ma solution. 

Le code que j'utilise pour ShapeDrawable est 

public static ShapeDrawable drawCircle (Context context, int width, int height, int color) {

        //////Drawing oval & Circle programmatically /////////////

        ShapeDrawable oval = new ShapeDrawable (new OvalShape ());
        oval.setIntrinsicHeight (height);
        oval.setIntrinsicWidth (width);
        oval.getPaint ().setColor (color);
        return oval;
    }

Code utilisant dans MainActivity.Java

if(Build.VERSION.SDK_INT >= 16) {
            txtCount.setBackground (Util.drawCircle (MainActivity.this, 50, 50, getResources ().getColor (R.color.yellow)));
            txtHotelCount.setText ("20");
        }else{
            txtCount.setBackgroundDrawable (Util.drawCircle (MainActivity.this, 50, 50, getResources ().getColor (R.color.yellow)));
            txtHotelCount.setText ("20");

        }

xml utiliser pour TextView txtCount dans mon projet pour is 

<LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:padding="10dp"
        Android:background="@color/white">

        <TextView
            Android:id="@+id/txt_count"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="@color/text_grey"
            Android:gravity="center"
            Android:textSize="12sp"
            Android:padding="2dp"
            />

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textColor="@color/text_grey"
            Android:text="AVAILABLE"
            Android:layout_marginLeft="10dp"
            Android:gravity="center"
            />
    </LinearLayout>

Mais toujours pas de chance, même après la définition de la même largeur et hauteur que 50. La propriété se comporte toujours comme ovale. 

8
Chandru

Donnez la même hauteur et la même largeur à votre TextView

<TextView
            Android:id="@+id/txt_count"
            Android:layout_width="50dp"
            Android:layout_height="50dp"
            Android:textColor="@color/text_grey"
            Android:gravity="center"
            Android:textSize="12sp"
            Android:padding="2dp"
            />
2
dharam

Il est trop tard pour répondre, mais espérons que cela aidera quelqu'un d'autre. Si vous voulez dessiner un cercle comme celui-ci, ne vous embêtez pas avec 46,0% car il ne s'agit que d'une vue texte.

 enter image description here

public class Circle extends View {

private Paint mCircleYellow;
private Paint mCircleGray;

private float mRadius;
private RectF mArcBounds = new RectF();

public Circle(Context context) {
    super(context);

    // create the Paint and set its color

}

public Circle(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    initPaints();
}

public Circle(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

private void initPaints() {
    mCircleYellow = new Paint(Paint.ANTI_ALIAS_FLAG);
    mCircleYellow.setStyle(Paint.Style.FILL);
    mCircleYellow.setColor(Color.YELLOW);
    mCircleYellow.setStyle(Paint.Style.STROKE);
    mCircleYellow.setStrokeWidth(15 * getResources().getDisplayMetrics().density);
    mCircleYellow.setStrokeCap(Paint.Cap.SQUARE);
    // mEyeAndMouthPaint.setColor(getResources().getColor(R.color.colorAccent));
    mCircleYellow.setColor(Color.parseColor("#F9A61A"));

    mCircleGray = new Paint(Paint.ANTI_ALIAS_FLAG);
    mCircleGray.setStyle(Paint.Style.FILL);
    mCircleGray.setColor(Color.GRAY);
    mCircleGray.setStyle(Paint.Style.STROKE);
    mCircleGray.setStrokeWidth(15 * getResources().getDisplayMetrics().density);
    mCircleGray.setStrokeCap(Paint.Cap.SQUARE);
    // mEyeAndMouthPaint.setColor(getResources().getColor(R.color.colorAccent));
    mCircleGray.setColor(Color.parseColor("#76787a"));

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    mRadius = Math.min(w, h) / 2f;

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int w = MeasureSpec.getSize(widthMeasureSpec);
    int h = MeasureSpec.getSize(heightMeasureSpec);

    int size = Math.min(w, h);
    setMeasuredDimension(size, size);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    Float drawUpto = 46f;


    float mouthInset = mRadius / 3f;
    mArcBounds.set(mouthInset, mouthInset, mRadius * 2 - mouthInset, mRadius * 2 - mouthInset);
    canvas.drawArc(mArcBounds, 0f, 360f, false, mCircleGray);

    canvas.drawArc(mArcBounds, 270f, drawUpto, false, mCircleYellow);


}

}

Utilisez donc cette classe dans votre fichier xml car il s’agit d’une classe de vue.

6
Abhishek Joshi