У меня День Класса Kotlin.Это расширяет ViewGroup.Это функция Init.
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import timber.log.Timber
import java.util.*
class Day: ViewGroup {
val date : Date;
val dayView: View
var color: Int = Color.TRANSPARENT
constructor(context: Context?, date: Date) : super(context) {
this.date = date
}
constructor(context: Context?, attrs: AttributeSet?, date: Date) : super(context, attrs) {
this.date = date
}
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, date: Date) : super(
context,
attrs,
defStyleAttr
) {
this.date = date
}
constructor(
context: Context?,
attrs: AttributeSet?,
defStyleAttr: Int,
defStyleRes: Int,
date: Date
) : super(context, attrs, defStyleAttr, defStyleRes) {
this.date = date
}
init {
dayView = TextView(this.context)
dayView.text = "test"
dayView.visibility = View.VISIBLE
dayView.layout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
this.addView(dayView)
this.setBackgroundColor(Color.CYAN)
}
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
val paint = Paint();
Timber.i("on draw")
paint.strokeWidth = 5F
paint.style = Paint.Style.FILL_AND_STROKE
paint.color = this.color
val pos = IntArray(2)
this.getLocationOnScreen(pos)
canvas?.drawArc(
RectF(pos[0].toFloat() / 10, pos[1].toFloat() / 10, pos[0].toFloat() / 10 + 100, pos[1].toFloat() / 10 + 100),-90F, 180F, false, paint)
}
}
После успешного построения я добавляю объект в линейный макет.
val day = Day(context, Date())
this.layout.addView(day)
this.layout.requestLayout()
И это определение макета.
<LinearLayout
android:orientation="vertical"
android:id="@+id/calendarContainer"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="@color/colorAccent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="0dp"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintVertical_weight="1">
Но результат не такой, как ожидалось.Потому что я ожидаю, что TextView такой же высокий и широкий, как родительский, но текстовое представление не отображается.И нарисованный круг показывает только одно.
Новая реализация onLayout.
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
this.children.forEach {
it.left = left
it.top = top
if(it.layoutParams.width == LayoutParams.MATCH_PARENT){
it.right = right
}
if(it.layoutParams.height == LayoutParams.MATCH_PARENT){
it.bottom = bottom
}
it.textAlignment = View.TEXT_ALIGNMENT_CENTER
it.layoutParams = LayoutParams(right,bottom)
Timber.i("right: " + right)
Timber.i("height: " + it.width.toString())
Timber.i("width: " + it.height.toString())
}
}