我的主视图在屏幕右上方的垂直Button
中有3 LinearLayout
个。每个按钮都会显示Fragment
内托管的DrawerLayout
个Button
。像这样:
当我点击任何按钮时,我希望从右侧显示DrawerLayout,并将此按钮与其一起翻译。像这样:
我设法用抽屉移动<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include layout="@layout/content_main"/>
<LinearLayout ... >
<ImageButton ... />
<ImageButton ... />
<ImageButton ... />
</LinearLayout>
<FrameLayout
android:id="@+id/fragment_secondary_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="right"
tools:context="..."/>
</android.support.v4.widget.DrawerLayout>
</android.support.design.widget.CoordinatorLayout>
,但我的问题是抽屉的阴影也会影响按钮。我希望它像抽屉的内容(同样的高度)一样明亮,但我也希望其他按钮留在抽屉后面。
这是我的 activity_main.xml 文件:
DrawerLayout
使用 using System;
using HtmlAgilityPack;
using System.Xml;
public class Program
{
public static void Main()
{
string html = "<html><body><h3><a style=\"display:none\" href=\"/aclk?sa=L&ai=DChcSEwimnPnc5OvQAhWRl70KHcxqCEAYABAA&ei=9hZNWLqlCIyY8gXA04vACg&sig=AOD64_3SZuXd57_-qOs8nnhn8rqw8GlIgw&q=&sqi=2&ved=0ahUKEwi6-PTc5OvQAhUMjLwKHcDpAqgQ0QwIGA&adurl=\" id=\"s0p1c0\"></a><a href=\"https://www.google.co.jp/aclk?sa=L&ai=DChcSEwimnPnc5OvQAhWRl70KHcxqCEAYABAA&ei=9hZNWLqlCIyY8gXA04vACg&sig=AOD64_3SZuXd57_-qOs8nnhn8rqw8GlIgw&q=&sqi=2&ved=0ahUKEwi6-PTc5OvQAhUMjLwKHcDpAqgQ0QwIGA&adurl=\" id=\"vs0p1c0\" onmousedown=\"return google.arwt(this)\" data-preconnect-urls=\"http://www.hundsun.co.jp/\" jsl=\"$t t-zxXzjt1d4B0;$x 0;\" class=\"r-iA_xzYkgkx2Y\">ブリッジSE募集中 - hundsun.co.jp</a></h3></body></html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var links = doc.DocumentNode.SelectNodes("//a[@data-preconnect-urls]");
if (links == null)
{
Console.WriteLine("no links contain attribute data-preconnect-urls");
return;
}
foreach(var htmlNode in links)
{
var attr = htmlNode.Attributes["data-preconnect-urls"];
Console.WriteLine(attr.Value);
}
}
}
内的按钮,抽屉在它们上方移动,但正在翻译的抽屉变暗。
另一方面,如果我将按钮放在DrawerLayout外面,移动的按钮看起来很好,但抽屉位于其他按钮下方。像:
有没有办法避免DrawerLayout的阴影影响特定视图?或者取消它?
答案 0 :(得分:1)
DrawerLayout
将该影子(稀松布)应用于其View
方法中的子drawChild()
。它通过检查给定的孩子不是抽屉View
来确定应用它的孩子。它最终通过检查孩子gravity
的{{1}}来实现。
了解这一点,我们可以创建一个自定义LayoutParams
子类来覆盖DrawerLayout
,并暂时更改我们不希望应用scrim的子项上的drawChild()
。由于在抽奖期间没有发生任何布局,因此不会影响gravity
的实际展示位置。
View
此示例使用自定义属性,以便可以在布局中指定“no-scrim”public class CustomDrawerLayout extends DrawerLayout {
private int noScrimId;
public CustomDrawerLayout(Context context, AttributeSet attrs) {
super(context, attrs);
// Get the ID for the no-scrim View.
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomDrawerLayout);
noScrimId = a.getResourceId(R.styleable.CustomDrawerLayout_noScrimView, View.NO_ID);
a.recycle();
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
// Is this the child we want?
final boolean isNoScrimView = child.getId() == noScrimId;
// If yes, temporarily tag it as a drawer.
if (isNoScrimView) {
((LayoutParams) child.getLayoutParams()).gravity = Gravity.LEFT;
}
// Let the super class do the draw, and save the return.
final boolean res = super.drawChild(canvas, child, drawingTime);
// Reset the gravity if we changed it.
if (isNoScrimView) {
((LayoutParams) child.getLayoutParams()).gravity = Gravity.NO_GRAVITY;
}
return res;
}
}
。如果您不想使用该属性,可以从构造函数中删除View
处理,只需对ID进行硬编码即可。如果您确实想要使用自定义属性,则需要在项目中定义它,您可以将以下文件放在TypedArray
文件夹中,或添加到可能已存在的文件中。
values/
attrs.xml
<resources>
<declare-styleable name="CustomDrawerLayout">
<attr name="noScrimView" format="reference" />
</declare-styleable>
</resources>
是替代品,您可以在布局中使用它,就像普通类一样。例如,如果您的CustomDrawerLayout
'ImageButton
标识为LinearLayout
:
button_menu
请注意,如果您碰巧将抽屉<com.mycompany.myapp.CustomDrawerLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:noScrimView="@+id/button_menu">
设置为View
,那么您将度过一段美好时光。此外,noScrimView
必须是noScrimView
的直接子项,因为稀松布效果仅适用于那些。
为简单起见,我省略了样本中的任何检查,但是如果你想包含一些,那么在DrawerLayout
方法中执行它们将与onMeasure()
如何处理自己的检查一致
DrawerLayout