如何将View与DrawerLayout的内容一起移动到同一个Z.

时间:2016-12-11 20:40:28

标签: android android-layout drawerlayout

我的主视图在屏幕右上方的垂直Button中有3 LinearLayout个。每个按钮都会显示Fragment内托管的DrawerLayoutButton。像这样:

enter image description here

当我点击任何按钮时,我希望从右侧显示DrawerLayout,并将此按钮与其一起翻译。像这样:

enter image description here

我设法用抽屉移动<?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&amp;ai=DChcSEwimnPnc5OvQAhWRl70KHcxqCEAYABAA&amp;ei=9hZNWLqlCIyY8gXA04vACg&amp;sig=AOD64_3SZuXd57_-qOs8nnhn8rqw8GlIgw&amp;q=&amp;sqi=2&amp;ved=0ahUKEwi6-PTc5OvQAhUMjLwKHcDpAqgQ0QwIGA&amp;adurl=\" id=\"s0p1c0\"></a><a href=\"https://www.google.co.jp/aclk?sa=L&amp;ai=DChcSEwimnPnc5OvQAhWRl70KHcxqCEAYABAA&amp;ei=9hZNWLqlCIyY8gXA04vACg&amp;sig=AOD64_3SZuXd57_-qOs8nnhn8rqw8GlIgw&amp;q=&amp;sqi=2&amp;ved=0ahUKEwi6-PTc5OvQAhUMjLwKHcDpAqgQ0QwIGA&amp;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外面,移动的按钮看起来很好,但抽屉位于其他按钮下方。像:

enter image description here

有没有办法避免DrawerLayout的阴影影响特定视图?或者取消它?

1 个答案:

答案 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