【发布时间】:2019-05-20 19:24:18
【问题描述】:
基本上我正在实现一个绘画应用程序,所以我制作了一个自定义视图来处理事件并在画布上绘图。现在我想实时显示在 TextView 上绘制的点的坐标。所以我正在尝试使用带有 LiveData 的 ViewModel 来进行更新。但是我想不出一种将自定义视图中的信息提供给 ViewModel 的方法。你会怎么做?我也尝试过使用 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 data binding view.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
}
})
}
【问题讨论】:
-
您的视图的
Context应该是它所在的活动,或者是包装该活动的ContextWrapper。因此,您可以将getContext()转换为FragmentActivity并将其传递给ViewModelProviders.of()以获取视图模型对象的句柄。