Программное рисование овала с рамкой (радиус угла) на Android

Я пытаюсь нарисовать пользовательский ShapeDrawable с помощью OvalShape, заполненный белым и с серой рамкой. Я создал рисунок следующим образом:

ShapeDrawable drawable = new ShapeDrawable(new OvalShape());
drawable.getPaint().setColor(Color.GRAY);
drawable.getPaint().setStyle(Style.STROKE);
drawable.getPaint().setStrokeWidth(getPixels(5));
drawable.getPaint().setAntiAlias(true);

Но результатом этого было: проблема с углами

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

Идея состоит в том, чтобы программно создать фигуру, подобную этой, но с разными цветами:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval">
<corners android:radius="10dip"/>
<stroke android:color="#FF0000" android:width="5dip"/>
<solid android:color="@android:color/transparent"/>
</shape>

Как это можно исправить?


person L3K0V    schedule 06.03.2013    source источник
comment
Вы говорите, что проблема заключается в обрезании границы, показанной на этом связанном изображении?   -  person Todd Sjolander    schedule 06.03.2013
comment
Да! Нет проблем, если ширина штриха равна 0 (линия роста волос), но для меня это не решение. Кстати, метод getPixels() возвращает пиксели для заданного провала... но я думаю, что проблема не в этом.   -  person L3K0V    schedule 06.03.2013
comment
Я думаю, проблема в размере вашего рисунка. Вам нужно уменьшить размер настолько, чтобы он соответствовал ширине границы.   -  person Todd Sjolander    schedule 06.03.2013
comment
Кстати, в документации сказано, что границы применяются только к прямоугольникам, а не к овалам.   -  person rkapl    schedule 06.03.2013
comment
Тогда есть ли простой способ создать границу для овала, и когда ширина штриха равна 0, есть граница, но супер-мега крошечная...   -  person L3K0V    schedule 06.03.2013
comment
Можно увидеть это для идеального решения клипа "> stackoverflow.com/questions/18693721/   -  person Akhil Dad    schedule 15.10.2014
comment
Просто добавьте отступы, используя drawable.setPadding(4,4,4,4)   -  person Rahul Mandaliya    schedule 03.02.2017


Ответы (2)


это новое решение:

 RoundedBitmapDrawable RBD = RoundedBitmapDrawableFactory.create(mContext.getResources(),YourBitmap);
            RBD.setCornerRadius(20);
            RBD.setAntiAlias(true);

            wholeRel.setBackground(RBD);
person babak    schedule 12.12.2017

Я нашел способ обойти создание новых рисунков!

A определил круг с границей из Android XML следующим образом:

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval">
<corners android:radius="10dip"/>
<stroke android:color="#FF0000" android:width="5dip"/>
<solid android:color="@android:color/transparent"/>
</shape>

Затем, когда я хочу изменить цвет рисования, я применяю ColorFilter. Например, если я хочу изменить красный цвет drawable на синий, я делаю это:

Drawable drawable = context.getResources().getDrawable(R.drawable.name);
drawable.setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);

Если мы хотим использовать StateListDrawable для создания настраиваемых селекторов из кода, имейте в виду - StateListDrawable очищает примененные к фильтрам drawables... примените фильтр ко всему селектору, selector.setColorFilter... устранив проблему.

person L3K0V    schedule 07.03.2013
comment
Столкнулся с проблемой: невозможно сделать LinearLayout.addView(drawable, new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1.0f)); - person Someone Somewhere; 22.10.2013
comment
Вы пытаетесь добавить возможность рисования в макет вместо представления... Создайте представление изображения или кнопку изображения, затем установите возможность рисования в представление, прежде чем добавлять его в макет, и, конечно же, добавьте в макет. - person L3K0V; 23.10.2013
comment
Знаете ли вы, как я могу программно изменить цвет фона? - person Simon Rolin; 18.12.2013
comment
Это было так просто: GradientDrawable bgShape = (GradientDrawable) btn.getBackground(); bgShape.setColor(Цвет.ЧЕРНЫЙ); - person Simon Rolin; 18.12.2013
comment
Это обновляет цвет stroke или цвет solid? - person tir38; 12.10.2015
comment
В данном случае - только stroke цвет, т.к. я установил сплошной на прозрачный. - person L3K0V; 13.11.2015