По сути, я реализую приложение рисования, поэтому я создал собственный вид для обработки события и рисования на холсте. Теперь я хотел бы отобразить координаты точек, нарисованных на TextView в режиме реального времени. Поэтому я пытаюсь использовать ViewModel с LiveData для обновления. Но я не могу найти способ передать информацию из моего пользовательского представления в модель представления. Как бы Вы это сделали ? Я также пытался использовать BindingAdapter, но не могу найти способ сделать это.
Вот код для моего кастомного просмотра:
class PaintView(context: Context, attrs: AttributeSet): View(context,attrs) {
var params: LayoutParams
private val path : Path = Path()
private val brush: Paint = Paint()
init {
params = LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT)
brush.isAntiAlias = true
brush.color = Color.BLACK
brush.style = Paint.Style.STROKE
brush.strokeJoin = Paint.Join.ROUND
brush.strokeWidth = 8f
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val pointX = event.x
val pointY = event.y
when (event.action) {
MotionEvent.ACTION_DOWN -> {
path.moveTo(pointX, pointY)
return true
}
MotionEvent.ACTION_MOVE -> {
path.lineTo(pointX, pointY)
}
else -> return false
}
postInvalidate()
return false
}
fun clearPath(){
path.reset()
invalidate()
}
public override fun onDraw(canvas: Canvas) {
canvas.drawPath(path, brush)
}
}
Вот адаптер привязки, который я нашел после этого поста: Представление привязки данных Android. OnTouchListener . Я могу записать координаты точек, но я не могу отправить их в свою ViewModel, поэтому сейчас она совершенно пуста.
@BindingAdapter("touchListener")
fun setTouchListener(self: View, bool: Boolean) {
self.setOnTouchListener(
object : View.OnTouchListener {
override fun onTouch(view: View, event: MotionEvent): Boolean {
val pointX = event.x
val pointY = event.y
when (event.action) {
MotionEvent.ACTION_DOWN -> {
Log.i("Points", " ($pointX, $pointY)")
}
MotionEvent.ACTION_MOVE -> {
Log.i("Points", " ($pointX, $pointY)")
}
MotionEvent.ACTION_UP -> {
Log.i("Points", " ($pointX, $pointY)")
}
}
return false
}
})
}