Программное рисование круга с помощью Android ShapeDrawable

У меня есть требование в моем проекте динамически рисовать круг во время выполнения. Поэтому для этой цели я использую ShapeDrawable для программного создания круга, но, к сожалению, я не смог найти какой-либо класс или методы внутри ShapeDrawable для CircleShape, вместо этого я нашел только OvalShape(). Пожалуйста, помогите мне нарисовать круг через ShapeDrawable, просто передав диаметр или радиус круга. Заранее спасибо. Любая настройка была бы полезна для меня, чтобы исправить мое решение.

Код, который я использую для ShapeDrawable,

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

Код, используемый в 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 для TextView txtCount в моем проекте для 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>

Но все равно не повезло даже после установки той же ширины и высоты, что и 50. Свойство по-прежнему ведет себя как овал.


person Chandru    schedule 22.07.2015    source источник
comment
если width == height, то овал должен быть кругом?   -  person Blackbelt    schedule 22.07.2015
comment
Но я не получаю круг. Например, если я передаю ширину как 42 и высоту как 23, я получаю круг.   -  person Chandru    schedule 22.07.2015
comment
Покажите код, который использует этот ShapeDrawable. Каков размер представления, которое его использует?   -  person Karakuri    schedule 22.07.2015


Ответы (2)


Дайте одинаковую высоту и ширину вашему 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"
            />
person dharam    schedule 23.07.2015
comment
каковы родители txtCount? - person dharam; 23.07.2015
comment
Вы должны указать одинаковую высоту и ширину для вашего Textview - person dharam; 23.07.2015
comment
Спасибо, это сработало! Действительно полезно исправить мою глупую ошибку в xml. Я принимаю это решение - person Chandru; 23.07.2015

Слишком поздно отвечать, но надеюсь, что это поможет кому-то еще. Если вы хотите нарисовать такой круг, не беспокойтесь о 46,0%, так как это только текстовое представление.

введите описание изображения здесь.

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


}

}

Поэтому используйте этот класс в своем XML-файле, поскольку это класс представления.

person Abhishek Joshi    schedule 12.06.2017