【发布时间】:2013-01-07 10:08:20
【问题描述】:
我想知道是否有办法让视图绘制在所有其他视图之上,即使它属于被其他视图覆盖的视图组?谢谢。
【问题讨论】:
标签: android android-layout android-view
我想知道是否有办法让视图绘制在所有其他视图之上,即使它属于被其他视图覆盖的视图组?谢谢。
【问题讨论】:
标签: android android-layout android-view
我找到了解决我的情况的方法,但它仍然会在超出其边界的视图周围绘制一些黑色像素。看来我必须将这些视图移动到覆盖我需要的区域的父视图......无论如何,如果有人想尝试它,我会这样做:
@Override protected void dispatchDraw(Canvas canvas)
{
Rect clip=new Rect(); getDrawingRect(clip);
int saveCount=canvas.save(Canvas.CLIP_SAVE_FLAG);
canvas.clipRect(clip,Region.Op.REPLACE);
super.dispatchDraw(canvas);
canvas.restoreToCount(saveCount);
}
该函数属于包含我要在其父项强制执行的原始边界之外绘制的子视图的视图组。如果您想为视图使用不同的边界,可以将剪辑区域更改为任何内容。
【讨论】:
canvas.restoreToCount(saveCount);之前画出我需要越界的东西。我也在onDraw 方法中使用它,而不是在dispatchDraw
使用ViewGroup.bringChildToFront(View child)。虽然这在LinearLayout 中没有达到预期的效果,因为 Z 顺序直接与排序顺序相关联,因此在这种情况下,它只会将 View 移动到底部。
【讨论】:
我之前和你有同样的问题,现在我从这个帖子中得到了答案。 What is android.widget.FrameLayout
Android 会将应用程序放置到一个框架布局中(它的 id 是 android.R.id.content),我们可以将其称为 ContentView。你可以通过'hierarchyviewer'看到它,它是一个工具 /android-sdk/tools/ 允许检查视图层次结构。您可以看到您的应用程序被放置在 FrameLayout 中。
您可以从其当前视图组中删除任何视图并添加到 ContentView。因此它将放置在所有其他视图之上。
你可以这样做:
//Remove view from current viewgroup
WebView mWebView = (WebView)findViewById(id);
ViewGroup currentParent = (ViewGroup)mWebView.getParent();
currentParent.removeView(mWebView);
//Add the view to ContentView(android.R.id.content)
FrameLayout contentView = (FrameLayout)this.getDecorView().findViewById(android.R.id.content);
FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(MATCH_PARENT,MATCH_PARENT);
contentView.addView(mWebView,fl);
希望这有帮助。
【讨论】: