在android中的视图下绘制线
Posted
技术标签:
【中文标题】在android中的视图下绘制线【英文标题】:Drawing line under view in 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 来满足您的需求。检查***.com/questions/6637690/… 我使用的是相对布局,需要在运行时画线。 画线然后只使按钮无效。不要添加/删除.. 我尝试了 invalidate() 和 bringToFront() 都没有成功。 你有没有试过在画完线后打电话给super.dispatchDraw(canvas);
?不要在那里添加/删除按钮..
【参考方案1】:
您正在尝试重新发明***。 Z-ordering 已经在窗口管理子系统中实现,您可以使用它。
-
创建一个您想要绘制的自定义视图。
使用
android:clickable="false"
或setClickable(false)
使其不可点击。
使其背景透明并实现dispatchDraw()
。
将所有不想在其上绘制的视图放在视图层次结构中此视图的上方。
【讨论】:
我希望视图可以点击。我正在尝试在列表视图上绘图。 那你到底想做什么? 我正在尝试在列表视图和按钮下方画一条线。我希望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()。 添加更多代码,例如布局。它会让每个人都有更多的想法。以上是关于在android中的视图下绘制线的主要内容,如果未能解决你的问题,请参考以下文章
Android视图的绘制流程(下)——View的Layout与Draw过程
如何在 JVM 分析器中获得类似于 android 的 Traceview 中的“时间线面板”的视图?