#android #xml
Делаю разделитель divider, фоном которого должны быть простые кружочки. Если этот фон делаю через Bitmap, то в нем выставляю tileMode=Repeat и работает как надо, но т.к это кружочек из картинки файла, то выглядит он нечетко. Ввиду этого решил сделать кружок векторным:Но Bitmap не принимает в качестве источника такую фигуру, а кроме как у Bitmap я больше нигде не нашел tileMode=Repeat, а без этого режима один такой кружок-фигуру растягивает на всю длину разделителя. Подскажите, как это осуществить с фигурой?
Ответы
Ответ 1
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 для новых атрибутов, цвета, кол-ва или изменить логику.
Комментариев нет:
Отправить комментарий