Страницы

Поиск по вопросам

понедельник, 18 марта 2019 г.

Repeat mode для фигуры для фона

Делаю разделитель divider, фоном которого должны быть простые кружочки. Если этот фон делаю через Bitmap, то в нем выставляю tileMode=Repeat и работает как надо, но т.к это кружочек из картинки файла, то выглядит он нечетко.

Ввиду этого решил сделать кружок векторным:



Но Bitmap не принимает в качестве источника такую фигуру, а кроме как у Bitmap я больше нигде не нашел tileMode=Repeat, а без этого режима один такой кружок-фигуру растягивает на всю длину разделителя. Подскажите, как это осуществить с фигурой?


Ответ

Kotlin:
class DotsDivider : View {
private val numberOfCircles = 20f private val paint: Paint = Paint(Paint.ANTI_ALIAS_FLAG)
init { paint.color = Color.LTGRAY paint.style = Paint.Style.STROKE paint.strokeCap = Paint.Cap.ROUND }
constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onDraw(canvas: Canvas) { super.onDraw(canvas)
val width = canvas.width paint.strokeWidth = canvas.height/2f paint.pathEffect = getDashPathEffect(width) canvas.drawLine(width/numberOfCircles/2f, canvas.height/2f, canvas.width.toFloat(), canvas.height/2f, paint) }
private fun getDashPathEffect(width: Int): DashPathEffect{ return DashPathEffect(floatArrayOf(0f, width/numberOfCircles), width/numberOfCircles*2) } }
Java:
public class DotsDivider extends View {
private final float numberOfCircles = 20f; private final Paint paint;
{ paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.LTGRAY); paint.setStyle(Paint.Style.STROKE); paint.setStrokeCap(Paint.Cap.ROUND); }
public DotsDividerJava(Context context) { super(context); }
public DotsDividerJava(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }
public DotsDividerJava(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);
int width = canvas.getWidth(); paint.setStrokeWidth(canvas.getHeight() / 2); paint.setPathEffect(getDashPathEffect(width)); canvas.drawLine( width/numberOfCircles / 2f, canvas.getHeight() / 2f, canvas.getWidth(), canvas.getHeight() / 2f, paint); } private DashPathEffect getDashPathEffect(int width){ return new DashPathEffect(new float[]{0f, width/numberOfCircles}, width/numberOfCircles*2); } }
в xml

В итоге:
Ps: этот пример можно улучшить, можно создать свои reference для новых атрибутов, цвета, кол-ва или изменить логику.

Комментариев нет:

Отправить комментарий