我正在开发针对android Lollipop及更高版本的Android应用程序,我调查了height属性以在元素(即按钮,卡片和底部导航视图)下实现阴影。
我面临的问题是,在XML中更改Create table MaxPopulation as (select area_codes,city,max(population) from table group by area_codes,city);
值时,阴影大小不会受到影响。我尝试阅读的内容:
关于代码,您可以在我的按钮样式和片段的布局下面找到
。按钮样式
android:elevation
片段布局
<?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>
dimens.xml
<?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>
这就是我要得到的(不管海拔属性是什么):
请注意,长按按钮时阴影确实会改变,并且不会以任何方式被修剪。
因此,您知道什么是问题所在吗?
答案 0 :(得分:1)
嘿,您的问题似乎很有用,所以我决定去解决。我希望这对您有所帮助,如果有人有更好的方法可以发布它。
首先,我认为主要的问题是您所使用的按钮样式具有一些StateListAnimator来控制按钮的高程,因此无论您将高程设置为什么值,它都会被覆盖。最简单的解决方案是只需添加
<item name="android:stateListAnimator">@null</item>
设置为自定义“搜索”样式,现在该按钮将以相同的样式显示您使用<item name="android:elevation">@dimen/main_search_elevation</item>
设置的高程。
但这就像一个静态视图,当您单击或长按等时,将为您带来高贵的外观,但没有酷的动画更改。
要拥有这些动画,您将需要使用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>
您将需要根据需要设置自定义尺寸,以使按钮处于其基本状态以及何时被按下。我分别使用了4dp
和12dp
,因为这似乎绰绰有余
就是这样,现在您只需要将它作为stateListAnimator添加到样式中即可
<item name="android:stateListAnimator">@animator/custom_animator</item>
,它应该可以正常工作。请注意,在这种情况下,android:elevation
也将仅能反映您的动画师中定义的值。因此,您可以删除<item name="android:elevation">@dimen/main_search_elevation</item>
,因为它不需要。
参考了一些有关SO的中型博客和其他帖子,以了解所有这些工作原理。 试试这个,让我们知道它是否对您有用。