【问题标题】:Drawing line under view in android在android中的视图下绘制线
【发布时间】:2011-09-20 18:43:26
【问题描述】:

我正在使用 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);
}

【问题讨论】:

  • 使用RelativeLayout 来满足您的需求。检查stackoverflow.com/questions/6637690/…
  • 我使用的是相对布局,需要在运行时画线。
  • 画线然后只使按钮无效。不要添加/删除..
  • 我尝试了 invalidate() 和 bringToFront() 都没有成功。
  • 你有没有试过在画完线后打电话给super.dispatchDraw(canvas);?不要在那里添加/删除按钮..

标签: android view line android-canvas z-order


【解决方案1】:

您正在尝试重新发明轮子。 Z-ordering 已经在窗口管理子系统中实现,您可以使用它。

  1. 创建一个您想要绘制的自定义视图。
  2. 使用android:clickable="false"setClickable(false) 使其不可点击。
  3. 使其背景透明并实现dispatchDraw()
  4. 将所有不想在其上绘制的视图放在视图层次结构中此视图的上方。

【讨论】:

  • 我希望视图可以点击。我正在尝试在列表视图上绘图。
  • 那你到底想做什么?
  • 我正在尝试在列表视图和按钮下方画一条线。我希望listview是底层,line是中间层,button是顶层。
  • 按钮是列表子视图的一部分吗?我认为你最好把它写在你的问题中。
  • 按钮不是列表视图的子项。
【解决方案2】:

画线后拨打super.dispatchDraw()。 dispatchDraw 由viewgroup 调用以绘制其子级,因此在您的情况下,调用super.dispatchDraw() 将首先绘制按钮,然后在其上绘制线条。这样做dispatchDraw这样:

更新代码

class myListViewWithLine extends ListView {
....
    @Override
    protected void dispatchDraw(Canvas canvas) {

         Paint p = new Paint();
         p.setColor(Color.Black);
         canvas.drawLine(0,0,100,100,p);

         super.dispatchDraw(canvas);
    }
....
}

【讨论】:

  • 这段代码在ListView下画了一条线。我希望该行位于 ListView 上方,但位于 Button 下方。
  • 然后在 listview 扩展类中覆盖它。这比具有多层布局更简单更好。不要害怕重构代码,因为那是软件生命周期的一部分。你必须在某个时候改进它。
  • 覆盖 ListView 也可以。我按照 Pixie 的建议重构了我的代码,只是覆盖了 View 类。我将自定义视图放在 ListView 顶部和按钮下方。这些线在 z 轴上的位置适当,我仍然可以单击 ListView 上的项目。
【解决方案3】:

另一种方法是在按钮下方添加一个具有 1 dip 作为高度和背景颜色的视图。它应该看起来像一条线。

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 像素,视图也会有不同的宽度。我特别需要使用 canvas.drawLine()。
  • 添加更多代码,例如布局。它会让每个人都有更多的想法。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多