在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中绘制之前测量所有视图层次结构

Android视图的绘制流程(下)——View的Layout与Draw过程

Android:在绘制之前获取视图的高度

如何在 JVM 分析器中获得类似于 android 的 Traceview 中的“时间线面板”的视图?

如何在android中为pdf查看器制作注释,如突出显示、删除线、下划线、绘制、添加文本等?

Android GNSS 可视卫星星空图/卫星天顶图 原理及画法介绍