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

问题描述 投票:0回答:1

pathview中的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)
java android android-layout android-studio kotlin
1个回答
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绘制到画布上。
© www.soinside.com 2019 - 2024. All rights reserved.