Делаю разделитель 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 для новых атрибутов, цвета, кол-ва или изменить логику.
Комментариев нет:
Отправить комментарий