Android海拔没有在按钮上显示阴影
Posted
技术标签:
【中文标题】Android海拔没有在按钮上显示阴影【英文标题】:Android elevation not showing shadow on Button 【发布时间】:2016-11-11 16:52:01 【问题描述】:无法显示按钮阴影。
将我的代码精简为最小示例:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>
<LinearLayout
android:id="@+id/main_layout"
android:layout_
android:layout_>
<RelativeLayout
android:layout_
android:layout_
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp">
<Button
android:id="@+id/my_button"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dp"
android:elevation="10dp"
android:translationZ="10dp"
android:background="@android:color/holo_green_light"
android:text="BUTTON"/>
</RelativeLayout>
</LinearLayout>
</ScrollView>
我需要那种布局结构。
MainActivity.java
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
阴影在 Android Studio 设计器中可见:
但在运行时不显示:
测试日期:
Genymotion Google Nexus 5X - Marshmallow 6.0.0 - API 23 Genymotion Google Nexus 5 - Lollipop 5.1.0 - API 22 Genymotion 三星 Galaxy S2 - 果冻豆 4.1.1 - API 16 硬件设备,三星 Galaxy S5 mini - KitKat 4.4.2 - API 19结果都一样。
我正在使用:
Android Studio 2.1.2 minSdkVersion 16 targetSdkVersion 24请在 Andriod Studio 中创建一个新项目,Empty Activity 模板,然后将该代码复制并粘贴到 activity_main.xml
和 MainActivity.java
中,以便您测试并告诉我。
【问题讨论】:
直接将您的按钮添加到 ScrollView 并查看它是否显示阴影。这可能是由于包装了 Linear 和 RelativeLayout 。检查此链接以供参考***.com/questions/35289356/… 没有这样的属性layout_topLeft
用于任何View
..!!
@jankigadhiya 是的,你是对的,而且在 Material design 中 android:elevation="2dp"
和 android:translationZ="2dp"
仅在您设置 android:stateListAnimator="@null"
时才有效,否则它是默认属性。
是的,示例代码中有一个错误,没有 layout_topLeft。已编辑。还在检查。谢谢!
【参考方案1】:
Material
下的默认Button
样式有一个StateListAnimator
控制android:elevation
和android:translationZ
属性。
copied from here
只需将此属性添加到您的Button
。您可以使用android:stateListAnimator
属性设置您自己的属性。
android:stateListAnimator="@null"
完整代码:
<Button
android:id="@+id/my_button"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dp"
android:elevation="2dp"
android:translationZ="2dp"
android:stateListAnimator="@null"
android:background="@android:color/holo_green_light"
android:text="BUTTON">
更新日期:
为了理解,我将其设置为 10dp..
xml代码:
<RelativeLayout
android:layout_
android:layout_
android:layout_margin="20dp">
<Button
android:id="@+id/my_button"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dp"
android:elevation="10dp"
android:translationZ="10dp"
android:stateListAnimator="@null"
android:background="@android:color/holo_green_light"
android:text="BUTTON"/>
</RelativeLayout>
【讨论】:
它有效!但它适用于任何具有 API 级别 21 或更高级别的模拟器。它不适用于 API 20 或更低版本。我将提出另一个关于较低 api 替代方案的问题。谢谢! 像素完美警报:请注意,为Button
s 父级设置的wrap_content
高度正在切割顶部和底部阴影,如屏幕截图所示。始终记住调整适当的边距【参考方案2】:
它在我的情况下工作,试试看app:elevation
<Button
android:id="@+id/my_button"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dp"
android:layout_topLeft="20dp"
app:elevation="2dp"
android:translationZ="2dp"
android:background="@android:color/holo_green_light"
android:text="BUTTON">
【讨论】:
“意外的命名空间前缀..” app: 按钮中没有前缀 天啊.. 你必须先添加命名空间。如果您不知道,请不要投票。告诉我添加更多规范。我会解释的。 即使你添加了应用命名空间,默认stateListAnimator
会覆盖两个命名空间中的elevation
。之前的评论写的很匆忙【参考方案3】:
如果海拔不适用于您的视图,您需要设置android:outlineProvider="bounds"
!
(我已经为示例简化了下面的代码)
查看:
<View
android:id="@+id/view"
android:layout_
android:layout_
android:outlineProvider="bounds"
android:elevation="20dp" >
结果:
【讨论】:
以上是关于Android海拔没有在按钮上显示阴影的主要内容,如果未能解决你的问题,请参考以下文章