customView с различными размерами - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть 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>

Но это не работает, а ключи только обертывают содержимое. Я пытался изменить размеры кода, но все равно не повезло.

...