如何以编程方式更改app:elevation

时间:2016-05-10 17:14:49

标签: java android android-layout

我的应用程序适用于API 19.所以我无法使用android:elevation。所以我app:我的布局高度。

Android XML: android:elevation vs. app:elevation

例如:

<android.support.design.widget.AppBarLayout
    android:id="@+id/appBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="5dp">

如何以编程方式更改app:elevation?我可以更改android:elevation但我找不到如何更改app:elevation!

6 个答案:

答案 0 :(得分:31)

尝试使用以下代码

ViewCompat.setElevation(View, int)

按照以下链接。这里展示了如何在棒棒糖前设备上进行提升

Android AppCompat 21 Elevation

答案 1 :(得分:7)

我想提供更新的完整答案:

    switch (state) {
        case On:
            appBarLayout.setStateListAnimator(AnimatorInflater.loadStateListAnimator(getContext(), R.animator.appbar_elevation_on));
            break;
        case Off:
            appBarLayout.setStateListAnimator(AnimatorInflater.loadStateListAnimator(getContext(), R.animator.appbar_elevation_off));
            break;
    }

RES \ animator下的appbar_elevation_on.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="PrivateResource">
    <item>
        <objectAnimator
            android:propertyName="elevation"
            android:valueTo="@dimen/design_appbar_elevation"
            android:valueType="floatType" />
    </item>
</selector>

RES \ animator下的appbar_elevation_off.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="PrivateResource">
    <item>
        <objectAnimator
            android:propertyName="elevation"
            android:valueTo="0dp"
            android:valueType="floatType" />
    </item>
</selector>

答案 2 :(得分:6)

接受的答案实际上不起作用。答案应该已经更新。

如果你看一下为什么mAppBarLayout.setTargetElevation(0)被弃用。它声明:

  

现已弃用@deprecated目标提升。   AppBarLayout的高程现在通过{@link android.animation.StateListAnimator}控制。   此方法现在始终返回0.

因此,要以编程方式设置appbar布局,您只能在StateListAnimator res文件夹中创建appbar_state_unelevated_animator,例如animator来执行此操作:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item>
    <objectAnimator
        android:propertyName="elevation"
        android:valueTo="4dp"
        android:valueType="floatType"
        android:duration="100"/>
</item>

然后在代码中加载它:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        appbar.stateListAnimator = AnimatorInflater.loadStateListAnimator(applicationContext, R.animator.appbar_state_unelevated_animator)
    }

如果我没弄错的话你也可以通过代码创建一个StateListAnimator,但不要相信我的话。

<强>更新

根据我的经验,当你设置     app:elevation =“//任何DP值//”

应用栏的阴影将会丢失。简单地删除该行以再次获得appbar阴影。

答案 3 :(得分:4)

由于您尝试更改操作栏的高程,您可以轻松使用此行,这将适用于API 19

getSupportActionBar().setElevation(0);

或者您按照此链接查看如何在API 21下方更改Android视图的提升

Android AppCompat 21 Elevation

答案 4 :(得分:0)

接受的答案对我没用。

要删除工具栏中的阴影,请使用

AppBarLayout xml或

中的

app:elevation="0"

在java中使用mAppBarLayout.setTargetElevation(0)

它适用于我的情况。

答案 5 :(得分:0)

以下解决方案适用于NativeScript

let nativeAnView = tnsView.android;
var shape = new android.graphics.drawable.GradientDrawable();
shape.setShape(android.graphics.drawable.GradientDrawable.OVAL);
shape.setColor(android.graphics.Color.parseColor('#30bcff'));
nativeAnView.setBackgroundDrawable(shape);
nativeAnView.setElevation(20);
Android上的

let nativeView = tnsView.ios;
nativeView.layer.shadowColor = new Color('#888888').ios.CGColor;
nativeView.layer.shadowOffset = CGSizeMake(0, 2.0);
nativeView.layer.shadowOpacity = 0.5;
nativeView.layer.shadowRadius = 5.0;
iOS上的