Как сделать круговую рисование с помощью штриха программным способом?

Фон

Я пытаюсь получить закрашенный круг с мазком определенного цвета и ширины и изображением внутри.

Это легко сделать в XML как таковом (это всего лишь пример):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <size
                android:width="120dp" android:height="120dp"/>
            <solid android:color="#ffff0000"/>
            <stroke
                android:width="3dp" android:color="#ff00ff00"/>
        </shape>
    </item>
    <item
        android:width="60dp" android:height="60dp" android:drawable="@android:drawable/btn_star"
        android:gravity="center"/>
</layer-list>

Эта проблема

Мне нужно иметь определенные свойства, описанные выше, для программного изменения, поэтому я не могу использовать файл XML, но идея остается той же.

Дело в том, что я не могу найти простой способ сделать обводку для рисования OvalShape, как это делается в XML. Я не могу найти функцию, чтобы сделать это.

Что я пробовал

Здесь есть решения для Stackru, но я не смог найти подходящего. Здесь только один, который я нашел, но его линия удара обрезается.

Однако мне частично удалось решить эту проблему, используя XML только для самого штриха:

stroke_drawable.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <stroke
        android:width="4dp" android:color="@android:color/white"/>
</shape>

код:

    final int strokeDrawableResId = R.drawable.stroke_drawable;
    Drawable innerDrawable = ResourcesCompat.getDrawable(getResources(), ..., null);
    final Drawable strokeDrawable = ResourcesCompat.getDrawable(getResources(), strokeDrawableResId, null);
    ShapeDrawable biggerCircle = new ShapeDrawable(new OvalShape());
    int size = ...;
    biggerCircle.setIntrinsicHeight(size);
    biggerCircle.setIntrinsicWidth(size);
    biggerCircle.getPaint().setColor(0xffff0000);
    biggerCircle.setBounds(new Rect(0, 0, size, size));
    LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{biggerCircle, strokeDrawable, innerDrawable});

    ImageView imageView = findViewById(R.id.imageView);
    imageView.setImageDrawable(layerDrawable);

Это работает, но не полностью программно (обводка определена в XML).

Вопрос

Как изменить код, чтобы он был полностью программным?


РЕДАКТИРОВАТЬ: я попробовал то, что было предложено здесь, но вместо дополнительного рисования для фона, так как мне нужно было все это в одном рисовании, я использовал LayerDrawable:

    Drawable innerDrawable = ResourcesCompat.getDrawable(getResources(), android.R.drawable.btn_star, null);
    int strokeWidth = 5;
    int strokeColor = Color.parseColor("#ff0000ff");
    int fillColor = Color.parseColor("#ffff0000");
    GradientDrawable gD = new GradientDrawable();
    gD.setColor(fillColor);
    gD.setShape(GradientDrawable.OVAL);
    gD.setStroke(strokeWidth, strokeColor);
    LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{gD, innerDrawable});
    ImageView imageView = findViewById(R.id.imageView);
    imageView.setImageDrawable(layerDrawable);

Это работает, но по какой-то причине внутренняя часть (звезда) растягивается:

1 ответ

Вы можете сделать это программно как
В YourActivity.XMlНастройте ImageView по-прежнему.

<ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:id="@+id/id1"
            android:src="@mipmap/ic_launcher_round"                                
            android:padding="15dp"/>

И в твоем MainActivity.java

    ImageView iV = (ImageView) findViewById(R.id.id1);
    int strokeWidth = 5;
    int strokeColor = Color.parseColor("#03dc13");
    int fillColor = Color.parseColor("#ff0000");
    GradientDrawable gD = new GradientDrawable();
    gD.setColor(fillColor);
    gD.setShape(GradientDrawable.OVAL);
    gD.setStroke(strokeWidth, strokeColor);
    iV.setBackground(gD);

setColor здесь устанавливает цвет фона и setStroke устанавливает ширину и цвет обводки.
Я создал несколько локальных переменных для цвета, ширины и т. Д., Чтобы их было легче понять.
Результат
введите описание изображения здесь
Чем больше вы увеличиваете отступ, тем больше будет увеличиваться размер круга.

Другие вопросы по тегам