gpt4 book ai didi

Android - 更改高度时阴影大小不受影响

转载 作者:行者123 更新时间:2023-12-02 13:50:29 24 4
gpt4 key购买 nike

我正在开发一个针对 android Lollipop 及以上版本的 Android 应用程序,我研究了海拔属性以在元素(即按钮、卡片和底部导航 View )下实现阴影。

我面临的问题是,当更改 XML 中的 android:elevation 值时,阴影大小不受影响。我尝试过并阅读过的内容:

  • 我读到,除非 View 有背景,否则高度不起作用,而我的 View 确实有背景(发布在下面)。
  • 围绕 SO 的其他问题表明它们根本没有阴影,在我的例子中, View 下确实有阴影,但其大小不受高程属性的影响。

关于代码,您可以在下面找到我的按钮样式和 fragment 的布局。

按钮样式

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:app="http://schemas.android.com/apk/res-auto">
<style name="Search" parent="@android:style/Widget.Button">
<item name="android:gravity">center_vertical|start</item>
<item name="android:textColor">@color/lightText</item>
<item name="android:textSize">@dimen/main_search_textSize</item>
<item name="android:background">@drawable/main_search</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="android:text">@string/search</item>
<item name="android:elevation">@dimen/main_search_elevation</item>
<item name="android:drawableStart">@drawable/ic_main_search</item>
<item name="android:paddingLeft">@dimen/main_search_padding</item>
<item name="android:paddingRight">@dimen/main_search_padding</item>
<item name="android:drawablePadding">@dimen/main_search_padding</item>
</style>
</resources>

fragment 布局

<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:background="@color/lightBackground"
android:clipToPadding="false">

<androidx.appcompat.widget.AppCompatButton
style="@style/Search"
android:layout_width="match_parent"
android:layout_height="@dimen/main_search_height"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

dimens.xml

<resources>
<dimen name="activity_horizontal_margin">24dp</dimen>
<dimen name="activity_vertical_margin">24dp</dimen>

<dimen name="main_nav_icon_padding">6dp</dimen>

<dimen name="main_search_height">54dp</dimen>
<dimen name="main_search_marginTop">72dp</dimen>
<dimen name="main_search_elevation">24dp</dimen>
<dimen name="main_search_padding">16dp</dimen>
<dimen name="main_search_textSize">20sp</dimen>
</resources>

这就是我得到的(无论海拔属性是什么):

Search button screenshot

请注意,长按按钮时阴影确实会发生变化,并且不会以任何方式剪切。

因此,知道问题是什么吗?

最佳答案

嘿,你的问题看起来非常有用,所以我决定尝试一下。希望这对您有所帮助,如果有人有更好的方法,请发布。

首先,我认为主要问题是您使用的按钮样式有一些 StateListAnimator它控制按钮的高度,因此无论您将什么值设置为高度,它都会被覆盖。最简单的解决方案是简单地添加

<item name="android:stateListAnimator">@null</item>

到您的自定义“搜索”样式,现在该按钮将显示您使用 <item name="android:elevation">@dimen/main_search_elevation</item> 设置的海拔高度风格相同。

但这就像一个静态 View ,它会给你一个提升的外观,但当你点击或长按等时没有很酷的动画变化。

为了获得这些动画,您需要使用 ObjectAnimator 创建自定义 StateListAnimator 。我创建了一个作为示例。创建android资源目录animator并添加一个 xml 文件,您将在其中编写所需的自定义动画。

这是我创建的custom_animator.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!--For when your button is pressed-->
<item
android:state_enabled="true"
android:state_pressed="true">
<set>
<objectAnimator
android:duration="300"
android:propertyName="translationZ"
android:valueTo="12dp"
android:valueType="floatType" />
<objectAnimator
android:duration="300"
android:propertyName="elevation"
android:valueTo="12dp"
android:valueType="floatType" />
</set>
</item>

<!--For when your button is in its normal state-->
<item android:state_enabled="true">
<set>
<objectAnimator
android:duration="300"
android:propertyName="translationZ"
android:valueTo="4dp"
android:valueType="floatType" />
<objectAnimator
android:duration="300"
android:propertyName="elevation"
android:valueTo="4dp"
android:valueType="floatType" />
</set>
</item>

</selector>

您需要根据您的要求设置按钮处于基本状态和按下时的自定义尺寸。我利用了4dp12dp分别,因为它看起来绰绰有余

就是这样,现在您只需将其作为 stateListAnimator 添加到您的样式中

    <item name="android:stateListAnimator">@animator/custom_animator</item>

它应该可以工作。请注意,在这种情况下再次android:elevation不起作用,只有动画师中定义的值才会反射(reflect)。所以你可以删除<item name="android:elevation">@dimen/main_search_elevation</item>因为不需要它。

引用了medium上的一些博客和SO上的其他帖子,以了解这一切是如何运作的。尝试一下,让我们知道它是否适合您。

关于Android - 更改高度时阴影大小不受影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60332900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com