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.
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"
/>
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.
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.