自定义视图组未显示其子自定义视图

时间:2018-02-24 20:54:45

标签: java android android-layout android-studio kotlin

路径视图中的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)

1 个答案:

答案 0 :(得分:0)

1)画线

要强制绘制视图,请致电invalidate()

void invalidate()

  

使整个视图无效。如果视图可见,将来会在某个时间点调用onDraw(android.graphics.Canvas)

void invalidate(int l,int t,int r,int b)

  

将rect(l,t,r,b)定义的区域标记为需要绘制。脏rect的坐标是相对于视图的。如果视图可见,将来会在某个时间点调用onDraw(android.graphics.Canvas)

2)绘制点

由于您延长了ViewGroup,因此您负责衡量和布置子视图。

也许您应该扩展AbsoluteLayout,而已经编程了测量和布局逻辑。然后你可以这样设置坐标:

val lp = layoutParams as AbsoluteLayout.LayoutParams
lp.x = event.x
lp.y = event.y
requestLayout()

或许您应该扩展View并以与线条相同的方式绘制点数。这应该是最有效的。您不需要绘制子视图,只需要画布。

  • 覆盖onTouchEvent以倾听并做出反应。
  • 通过调用setBounds(告诉它在哪里绘制)和draw将drawable绘制到画布上。