当包含 textview 具有波纹或选择器并被单击时,PopupWindow 高度变为 distorted/darker
PopupWindow elevation becomes distorted/darker when containing textview has ripple or selector and is clicked
以编程方式创建 PopupWindow 并设置其高度。阴影最初看起来像预期的那样,但是一旦单击文本视图,无论它是否具有波纹或选择器作为背景,阴影都会发生变化。它看起来像变黑或阴影相互叠加。
我尝试了很多替代方案,但仍然得到相同的效果。
正在模拟器 v21+ Lollipop 上进行测试。我没有用于测试的 Lollipop 设备,但我认为这不是模拟器的问题,因为阴影适用于其他项目。
PopupWindow 的布局test_shadow.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu"
android:orientation="vertical"
android:layout_width="112dp"
android:layout_height="wrap_content">
<TextView
style="@style/TextAppearance.AppCompat.Body2"
android:id="@+id/text1"
android:layout_width="112dp"
android:layout_height="48dp"
android:textColor="@color/black"
android:background="@drawable/item_background_light"
android:gravity="bottom"
android:paddingLeft="16dp"
android:paddingBottom="16dp"
android:clickable="true"
android:stateListAnimator="@null"
android:text="menuItem1"/>
</LinearLayout>
膨胀并设置弹出窗口的代码:
View v = getLayoutInflater().inflate(R.layout.test_shadow, null);
LinearLayout menuContainer = (LinearLayout) v.findViewById(R.id.menu);
popupWindow = new PopupWindow(menuContainer, LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT, true);
popupWindow.setOutsideTouchable(true);
float elevation = getResources().getDimension(R.dimen.menuElevation);//8dp
popupWindow.setBackgroundDrawable(getResources().getDrawable(
R.drawable.primary_background_light));// Shape Rect with solid color.
popupWindow.setElevation(elevation);
popupWindow.showAsDropDown(view, 150, 75);
item_background_light:
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/blueLight">
<item android:id="@android:id/mask" >
<shape android:shape="rectangle">
<solid android:color="@color/primary_background_light"/>
</shape>
</item>
</ripple>
我一定是做错了什么,或者不正确地使用 PopupWindow 和 textview,无法让高度和波纹一起工作。影子为什么会这样distorted/overdraw?
popupWindow 的可绘制背景似乎必须具有至少为 1 的角半径值。以前这个值被遗漏导致了问题。
primary_background_light:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/primary_background_light"/>
<corners android:radius="1dp"/>
</shape>
以编程方式创建 PopupWindow 并设置其高度。阴影最初看起来像预期的那样,但是一旦单击文本视图,无论它是否具有波纹或选择器作为背景,阴影都会发生变化。它看起来像变黑或阴影相互叠加。
我尝试了很多替代方案,但仍然得到相同的效果。
正在模拟器 v21+ Lollipop 上进行测试。我没有用于测试的 Lollipop 设备,但我认为这不是模拟器的问题,因为阴影适用于其他项目。
PopupWindow 的布局test_shadow.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu"
android:orientation="vertical"
android:layout_width="112dp"
android:layout_height="wrap_content">
<TextView
style="@style/TextAppearance.AppCompat.Body2"
android:id="@+id/text1"
android:layout_width="112dp"
android:layout_height="48dp"
android:textColor="@color/black"
android:background="@drawable/item_background_light"
android:gravity="bottom"
android:paddingLeft="16dp"
android:paddingBottom="16dp"
android:clickable="true"
android:stateListAnimator="@null"
android:text="menuItem1"/>
</LinearLayout>
膨胀并设置弹出窗口的代码:
View v = getLayoutInflater().inflate(R.layout.test_shadow, null);
LinearLayout menuContainer = (LinearLayout) v.findViewById(R.id.menu);
popupWindow = new PopupWindow(menuContainer, LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT, true);
popupWindow.setOutsideTouchable(true);
float elevation = getResources().getDimension(R.dimen.menuElevation);//8dp
popupWindow.setBackgroundDrawable(getResources().getDrawable(
R.drawable.primary_background_light));// Shape Rect with solid color.
popupWindow.setElevation(elevation);
popupWindow.showAsDropDown(view, 150, 75);
item_background_light:
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/blueLight">
<item android:id="@android:id/mask" >
<shape android:shape="rectangle">
<solid android:color="@color/primary_background_light"/>
</shape>
</item>
</ripple>
我一定是做错了什么,或者不正确地使用 PopupWindow 和 textview,无法让高度和波纹一起工作。影子为什么会这样distorted/overdraw?
popupWindow 的可绘制背景似乎必须具有至少为 1 的角半径值。以前这个值被遗漏导致了问题。
primary_background_light:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/primary_background_light"/>
<corners android:radius="1dp"/>
</shape>