路径视图中的draggablepointviews不显示。我在PathView中添加了addView,但仍然没有渲染点视图。我错过了什么吗?我认为addView足够了,可以让孩子们渲染。
PathView.kt
class PathView(context: Context) : ViewGroup(context)
{
private val pointA = DraggablePointView(context)
private val pointB = DraggablePointView(context)
private val paint = Paint().apply {
strokeWidth = 15f
color = Color.WHITE
}
init
{
pointA.x = 50f
pointA.y = 50f
pointB.x = 330f
pointB.y = 330f
addView(pointA, 100, 100)
addView(pointB, 100, 100)
setWillNotDraw(false)
}
override fun onDraw(canvas: Canvas?)
{
if (canvas == null)
return
// Draw a line between pointA and pointB
canvas.drawLine(pointA.x, pointA.y, pointB.x, pointB.y, paint)
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int)
{
}
}
DraggablePointView.kt
class DraggablePointView(context: Context) : ImageView(context)
{
init
{
setImageResource(R.drawable.point)
setWillNotDraw(false)
}
override fun onDragEvent(event: DragEvent?): Boolean
{
println("DRAG EVENT")
if (event == null)
return false
x = event.x
y = event.y
return true
}
}
然后:
val pathView = PathView(context)
frameLayout.addView(pathView)
答案 0 :(得分:0)
要强制绘制视图,请致电invalidate()
。
使整个视图无效。如果视图可见,将来会在某个时间点调用
onDraw(android.graphics.Canvas)
。
将rect(l,t,r,b)定义的区域标记为需要绘制。脏rect的坐标是相对于视图的。如果视图可见,将来会在某个时间点调用
onDraw(android.graphics.Canvas)
。
由于您延长了ViewGroup
,因此您负责衡量和布置子视图。
也许您应该扩展AbsoluteLayout
,而已经编程了测量和布局逻辑。然后你可以这样设置坐标:
val lp = layoutParams as AbsoluteLayout.LayoutParams
lp.x = event.x
lp.y = event.y
requestLayout()
或许您应该扩展View
并以与线条相同的方式绘制点数。这应该是最有效的。您不需要绘制子视图,只需要画布。
onTouchEvent
以倾听并做出反应。setBounds
(告诉它在哪里绘制)和draw
将drawable绘制到画布上。