У меня есть customView, который я хочу использовать в качестве настраиваемой кнопки. XML выглядит следующим образом:
//customButton.xml
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/custom_button"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/CB_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:textAlignment="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</android.support.constraint.ConstraintLayout>
Это завышено в моем классе costumButton, где я могу создать кнопки с закругленными углами или круглую кнопку с желаемым цветом:
private var rectF: RectF? = null
private fun initView(context: Context, attrs: AttributeSet?) {
this.setWillNotDraw(false)
this.attrs = attrs
val view = View.inflate(context, R.layout.custom_button, null)
val a = context.theme
.obtainStyledAttributes(attrs, R.styleable.CustomizedButton, 0, 0)
addView(view)
this.rectF = RectF()
try {
this.placeInGroup = a.getInt(R.styleable.CustomizedButton_CB_place_in_group, 0)
this.shape = a.getString(R.styleable.CustomizedButton_CB_shape)
this.radius = a.getFloat(R.styleable.CustomizedButton_CB_radius, 0f)
this.textColor = a.getColor(R.styleable.CustomizedButton_CB_text_color, Color.BLACK)
CB_text.setTextColor(textColor)
CB_text.textSize = a.getDimension(R.styleable.CustomizedButton_CB_text_size, 10f)
this.strokeColor = a.getColor(R.styleable.CustomizedButton_CB_strokeColor,-1)
this.fillColor = a.getColor(R.styleable.CustomizedButton_CB_fillColor, -1)
this.fill = a.getBoolean(R.styleable.CustomizedButton_CB_fill, false)
this.strokeWidth = a.getFloat(R.styleable.CustomizedButton_CB_strokeWidth, 0f)
CB_text.text = a.getText(R.styleable.CustomizedButton_CB_text)?: ""
} finally {
a.recycle()
}
}
val brush1 = Paint()
val offset = 0f
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val widthVar = width
val hieghtVar = height
brush1.color = if (fillColor!=-1) fillColor else if (strokeColor!=-1) strokeColor else resources.getColor(neutralBackground)
brush1.strokeWidth = strokeWidth
brush1.style = if (fill) Paint.Style.FILL else Paint.Style.STROKE
if (shape == "Circle"){
canvas.drawCircle(((widthVar / 2)).toFloat(), (hieghtVar / 2).toFloat(), (hieghtVar-brush1.strokeWidth)/2f, brush1)
}else{
rectF?.let{
it.set(offset, offset, width-offset,height-offset)
canvas.drawRoundRect(rectF,radius, radius, brush1)
}
}
}
Атрибуты приведены здесь в отдельном XML, где я использую тег customButton. Я хочу, чтобы размеры также были определены в теге customButton. Например, в случае клавиатуры, клавиши должны быть круглыми, следовательно, ширина и высота должны иметь соотношение 1: 1, в то время как в других случаях это не в пользу. Ниже xml используется для программного создания 9 клавиш клавиатуры, которые должны быть добавлены в customButtonGroup в моем фрагменте.
//keyboard.xml
<assa.ux.CustomButton
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintDimensionRatio="1:1"
android:clickable="true"
android:focusable="true"
android:visibility="visible"
app:CB_text_size="24dp"
app:CB_shape = "Circle"
app:CB_strokeWidth="10"
app:CB_strokeColor="#a2d032">
</assa.ux.CustomButton>
Но это не работает, а ключи только обертывают содержимое. Я пытался изменить размеры кода, но все равно не повезло.