在android中绘制视图下的线条

在android中绘制视图下的线条,android,view,line,android-canvas,z-order,Android,View,Line,Android Canvas,Z Order,我正在使用onDispatchDraw(Canvas Canvas)方法在视图中绘制线条。当我调用canvas.drawLine()时,它总是在我所有视图的顶部绘制线条。是否有任何方法可以使用canvas.drawLine()在我的布局中的一个按钮下但在另一个视图上绘制线 我尝试了以下方法,但它仍然在按钮上画了线 Button b; RelativeLayout r; @Override protected void dispatchDraw(Canvas canvas) { supe

我正在使用onDispatchDraw(Canvas Canvas)方法在视图中绘制线条。当我调用canvas.drawLine()时,它总是在我所有视图的顶部绘制线条。是否有任何方法可以使用canvas.drawLine()在我的布局中的一个按钮下但在另一个视图上绘制线

我尝试了以下方法,但它仍然在按钮上画了线

Button b;
RelativeLayout r;
@Override
protected void dispatchDraw(Canvas canvas) {
     super.dispatchDraw(canvas);

     Paint p = new Paint();
     p.setColor(Color.Black);

     canvas.drawLine(0,0,100,100,p);

     r.removeView(b);
     r.addView(b);
}

另一种方法是,只需在按钮下添加一个高度为1度、背景色为任意颜色的视图。它应该看起来像一条线

View v = new View(this);
ViewGroup.LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,1);
v.setLayoutParams(lp);
v.setBackgroundColor(Color.WHITE);

addView(v,INDEX NUMBER AFTER THE BUTTON);

另一种方法是,只需在按钮下添加一个高度为1度、背景色为任意颜色的视图。它应该看起来像一条线

View v = new View(this);
ViewGroup.LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,1);
v.setLayoutParams(lp);
v.setBackgroundColor(Color.WHITE);

addView(v,INDEX NUMBER AFTER THE BUTTON);

你想重新发明轮子。窗口管理子系统中已经实现了Z排序,您可以使用它

  • 创建要在其上绘制的自定义视图
  • 使用android:clickable=“false”或
    setClickable(false)
    使其不可点击
  • 使其背景透明并实现
    dispatchDraw()
  • 将所有不希望绘制的视图放在视图层次结构中此视图的上方

  • 你想重新发明轮子。窗口管理子系统中已经实现了Z排序,您可以使用它

  • 创建要在其上绘制的自定义视图
  • 使用android:clickable=“false”或
    setClickable(false)
    使其不可点击
  • 使其背景透明并实现
    dispatchDraw()
  • 将所有不希望绘制的视图放在视图层次结构中此视图的上方

  • 画完线后调用super.dispatchDraw()。dispatchDraw由
    viewgroup
    调用以绘制其子项,因此在您的情况下,调用
    super.dispatchDraw()
    将首先绘制按钮,然后在其上绘制线。按以下方式执行
    dispatchDraw

    更新代码
    画完线后调用super.dispatchDraw()。dispatchDraw由
    viewgroup
    调用以绘制其子项,因此在您的情况下,调用
    super.dispatchDraw()
    将首先绘制按钮,然后在其上绘制线。按以下方式执行
    dispatchDraw

    更新代码

    使用RelativeLayout满足您的需求。检查我使用的是相对布局,我需要在运行时绘制线条。绘制线条,然后仅使按钮无效。不要添加/删除..我尝试了invalidate()和bringToFront()都没有成功。您是否尝试调用
    super.dispatchDraw(canvas)画线之后?不要在那里添加/删除按钮。请使用RelativeLayout以满足您的需要。检查我使用的是相对布局,我需要在运行时绘制线条。绘制线条,然后仅使按钮无效。不要添加/删除..我尝试了invalidate()和bringToFront()都没有成功。您是否尝试调用
    super.dispatchDraw(canvas)画线之后?不要在那里添加/删除按钮。这种方法的问题是整个布局经常被重新绘制。有时,重新绘制视图时,视图的宽度不同,即使它们始终设置为1像素。我特别需要使用canvas.drawLine()。添加更多类似布局的代码。这种方法的问题是整个布局经常被重新绘制。有时,重新绘制视图时,视图的宽度不同,即使它们始终设置为1像素。我特别需要使用canvas.drawLine()。添加更多类似布局的代码。这会让每个人都有更多的想法。我希望视图是可点击的。我试图在列表视图的顶部绘制。那么您到底想做什么呢?我试图在列表视图和按钮下面绘制一条线。我希望listview是底层,line是中间层,button是顶层。button是列表子视图的一部分吗?我想你最好把它写在你的问题里。按钮不是listview的子项。我希望视图是可点击的。我试图在列表视图的顶部绘制。那么您到底想做什么呢?我试图在列表视图和按钮下面绘制一条线。我希望listview是底层,line是中间层,button是顶层。button是列表子视图的一部分吗?我认为你最好把它写在你的问题中。按钮不是listview的子项。这段代码在listview下面画了一条线。我希望该行位于ListView上方,但位于按钮下方。然后在ListView扩展类中重写它。这比多层布局更简单、更好。不要害怕重构代码,因为这是软件生命周期的一部分。您必须在某个时候对其进行改进。重写ListView也可以。我按照Pixie的建议重新分解了我的代码,只是覆盖了View类。我将自定义视图放在ListView的顶部和按钮的下方。这些线被正确地定位在z轴上,我仍然能够在我的ListView上单击项目。我希望该行位于ListView上方,但位于按钮下方。然后在ListView扩展类中重写它。这比多层布局更简单、更好。不要害怕重构代码,因为这是软件生命周期的一部分。您必须在某个时候对其进行改进。重写ListView也可以。我按照Pixie的建议重新分解了我的代码,只是覆盖了View类。我将自定义视图放在ListView的顶部和按钮的下方。这些线被正确地定位在z轴上,我仍然能够在我的ListView上单击项目。