Android: Dibuja un círculo con texto dentro

Necesito dibujar tres círculos en mi fragmento, los círculos difieren en tamaño, remito este enlace. El resultado que obtuve es este

enter image description here

Este es mi código XML: ACTUALIZADO

      

Pero lo que necesito debe ser es así enter image description here

Puedes ver que los círculos deben permanecer juntos, pero cuando uso la vista XML no puedo lograr esto. ¿Cómo puedo lograr esto, necesito onClickListeners en mi círculo? Es por eso que uso views

¿Esto se puede lograr a través del dibujo de Lienzo? He oído que el canvas no se ve, así que esto me impedirá darles clic, corrígeme si estoy equivocado.

ACTUALIZAR:

Cumplo con mi necesidad a través del enfoque XML, ¿hay alguna manera de lograr esto a través del dibujo del canvas? ¿Debería publicar otra pregunta para eso?

Prueba esto

        

Guardar en bg_red.xml

        

Código editado

        

Uso de RestraintLayout para el recuento de distintivos.

enter image description here

      

Prueba esto

 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; public class CircularTextView extends TextView { private float strokeWidth; int strokeColor,solidColor; public CircularTextView(Context context) { super(context); } public CircularTextView(Context context, AttributeSet attrs) { super(context, attrs); } public CircularTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void draw(Canvas canvas) { Paint circlePaint = new Paint(); circlePaint.setColor(solidColor); circlePaint.setFlags(Paint.ANTI_ALIAS_FLAG); Paint strokePaint = new Paint(); strokePaint.setColor(strokeColor); strokePaint.setFlags(Paint.ANTI_ALIAS_FLAG); int h = this.getHeight(); int w = this.getWidth(); int diameter = ((h > w) ? h : w); int radius = diameter/2; this.setHeight(diameter); this.setWidth(diameter); canvas.drawCircle(diameter / 2 , diameter / 2, radius, strokePaint); canvas.drawCircle(diameter / 2, diameter / 2, radius-strokeWidth, circlePaint); super.draw(canvas); } public void setStrokeWidth(int dp) { float scale = getContext().getResources().getDisplayMetrics().density; strokeWidth = dp*scale; } public void setStrokeColor(String color) { strokeColor = Color.parseColor(color); } public void setSolidColor(String color) { solidColor = Color.parseColor(color); } } 

https://stackoverflow.com/a/34685568/2809351

       

puede establecer directamente backroud o drawable a la vista de texto. puedes usar drawablepadding, etc …..

o puede usar: android: drawableLeft = “@ drawable / ic_cab_done_holo_dark”

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView tv = (TextView) findViewById(R.id.tv); Button btn = (Button) findViewById(R.id.btn); GradientDrawable gd = new GradientDrawable(); gd.setShape(GradientDrawable.OVAL); gd.setColor(Color.TRANSPARENT); gd.setStroke(5, Color.BLUE); gd.setSize(getTextViewHeight(tv),getTextViewHeight(tv)); tv.setBackground(gd); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { GradientDrawable gd = new GradientDrawable(); gd.setShape(GradientDrawable.OVAL); gd.setColor(Color.TRANSPARENT); gd.setStroke(5, Color.BLUE); gd.setSize(tv.getHeight(),tv.getHeight()); Log.d("DB121","Width "+tv.getHeight()+ "Height ="+tv.getHeight()); tv.setBackground(gd); } }); } public static int getTextViewHeight(TextView textView) { WindowManager wm = (WindowManager) textView.getContext().getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int deviceWidth; if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ Point size = new Point(); display.getSize(size); deviceWidth = size.x; } else { deviceWidth = display.getWidth(); } int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(deviceWidth, View.MeasureSpec.AT_MOST); int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); textView.measure(widthMeasureSpec, heightMeasureSpec); return textView.getMeasuredHeight(); } 

Pruebe este código para crear círculos dinámicamente con textview

 RelativeLayout main_rel_layout = findViewById(R.id.main_rel_layout); TextView textView = new TextView(this); RelativeLayout relativeLayout = new RelativeLayout(this); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.CENTER_IN_PARENT); textView.setText("Hello "); textView.setTextSize(100); textView.setLayoutParams(params); textView.setGravity(Gravity.CENTER); final FrameLayout frameLayout = new FrameLayout(this); FloatingActionButton floatingActionButton = new FloatingActionButton(this); floatingActionButton.setCustomSize(400); frameLayout.addView(floatingActionButton); relativeLayout.addView(frameLayout); relativeLayout.addView(textView); main_rel_layout.addView(relativeLayout);