Android - spotShadowAlpha 仅适用于线性布局

Posted

技术标签:

【中文标题】Android - spotShadowAlpha 仅适用于线性布局【英文标题】:Android - spotShadowAlpha only for linearlayout 【发布时间】:2019-08-27 11:29:58 【问题描述】:

我正在为我的线性布局使用高程属性,但阴影太亮了。我只需要线性布局的较暗阴影。

我将android:spotShadowAlpha 添加到我的styles.xml。它有效,但不仅适用于线性布局。每个视图都有一个较暗的阴影。

样式.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:ambientShadowAlpha">0</item>
        <item name="android:spotShadowAlpha">0.55   </item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>

activity_main.xml中的线性布局

<LinearLayout
        android:id="@+id/linl"
        android:layout_
        android:layout_
        android:layout_marginStart="55dp"
        android:layout_marginTop="208dp"
        android:layout_marginEnd="56dp"
        android:layout_marginBottom="209dp"
        android:background="@drawable/custom_buttom"
        android:elevation="70dp"
        android:orientation="horizontal"

        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
</LinearLayout>

后台@drawable/custom_buttom

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#FFFFFF"/>
    <corners android:radius="999dp"/>
</shape>

【问题讨论】:

【参考方案1】:

免责声明:仅适用于 API 28 及更高版本

我知道这个问题有点老了,但我遇到了同样的问题。 This guy 有一个很好的解决方案。本质上,您将android:ambientShadowAlphaandroid:spotShadowAlpha 设置为1。那么您可以使用 SetOutlineAmbientShadowColorSetOutlineSpotShadowColor 使用包含 alpha 值的值来逐项设置它。对于其他所有内容,这些都充当具有系统默认 alpha 值的默认阴影颜色:

&lt;color name="defaultOutlineAmbientShadowColor"&gt;#0A000000&lt;/color&gt; &lt;color name="defaultOutlineSpotShadowColor"&gt;#30000000&lt;/color&gt;

这些在styles.xml中设置:

&lt;item name="android:ambientShadowAlpha"&gt;1&lt;/item&gt; &lt;item name="android:outlineAmbientShadowColor"&gt;@color/defaultOutlineAmbientShadowColor&lt;/item&gt; &lt;item name="android:spotShadowAlpha"&gt;1&lt;/item&gt; &lt;item name="android:outlineSpotShadowColor"&gt;@color/defaultOutlineSpotShadowColor&lt;/item&gt;

【讨论】:

这很完美,但不幸的是只有从 API 28 开始。 是的,不幸的是真的。 这个问题是在将android:ambientShadowAlphaandroid:spotShadowAlpha 设置为1 时,这将适用于API 28 之前的所有阴影,并且defaultOutlineAmbientShadowColordefaultOutlineSpotShadowColor 不能做任何事情来重新-平衡阿尔法。所以你周围会留下纯黑色的阴影。如果可以的话,我会收回我的赞成票。这弊大于利。 正如其他评论所述,它仅适用于 API 28 及更高版本。我在帖子中添加了免责声明,以免其他人遇到问题。【参考方案2】:

android:ambientShadowAlphaandroid:spotShadowAlpha 主题属性值在相当低的级别使用,因此无法为特定层次结构视图设置这些属性的特定值(即使使用theme overlay approach)。 可以根据活动静态设置自定义值:

    创建从您的应用主题派生的自定义主题并覆盖其中的android:ambientShadowAlphaandroid:spotShadowAlpha

     <style name="Theme.YourApp" parent="...">
         ...
     </style>
    
     <style name="Theme.YourApp.StrongShadows">
         <item name="android:ambientShadowAlpha">1</item>
         <item name="android:spotShadowAlpha">1</item>
     </style>
    

    在清单中为您的活动设置此主题:

     <application
         android:theme="@style/Theme.YourApp">
    
         <activity android:name=".ActivityWithDefaultShadows" />
         <activity
             android:name=".ActivityWithStrongShadows"
             android:theme="@style/Theme.YourApp.StrongShadows" />
     </application>
    

目前,为了更好地自定义阴影,您可以做出的最大努力是 @ottermatic 在他的回答中建议的方法(当然只适用于 API 级别 28 及更高级别)。我会更准确地描述它:

    values 资源文件夹中的 themes.xml 文件中定义基本应用程序主题和从未提及的属性派生的应用程序主题:

     <style name="Base.Theme.YourApp" parent="...">
         ...
     </style>
     <style name="Theme.YourApp" parent="Base.Theme.YourApp"/>
    

    values-v28 中的themes.xml 文件中覆盖 api 版本 28 及更高版本的应用主题:

     <style name="Theme.YourApp" parent="Base.Theme.YourApp">
         <item name="android:ambientShadowAlpha">1</item>
         <item name="android:spotShadowAlpha">1</item>
         <item name="android:outlineAmbientShadowColor">@color/defaultOutlineAmbientShadowColor</item>
         <item name="android:outlineSpotShadowColor">@color/defaultOutlineSpotShadowColor</item>
     </style>
    

我们将android:ambientShadowAlphaandroid:spotShadowAlpha 设置为1,这样它们就不会影响阴影颜色。相反,我们可以通过更改 android:outlineAmbientShadowColorandroid:outlineSpotShadowColor 属性来自定义阴影 - 它们在应用程序主题中设置了合理的默认值(默认阴影类似于以前的 api 版本的阴影),而且它们的值可以为每个单独的观点:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_>

    <Button
        android:id="@+id/button1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:text="Button with default theme shadow"
        android:layout_
        android:layout_ />

    <Button
        android:id="@+id/button2"
        android:outlineAmbientShadowColor="#55FF0000"
        android:outlineSpotShadowColor="#55FF0000"
        android:text="Button with custom red shadow"
        app:layout_constraintTop_toBottomOf="@id/button1"
        app:layout_constraintStart_toEndOf="@id/button1"
        android:layout_
        android:layout_ />

</androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

以上是关于Android - spotShadowAlpha 仅适用于线性布局的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制