【问题标题】:How to change app:elevation programmatically如何以编程方式更改应用程序:海拔
【发布时间】:2016-09-05 19:28:29
【问题描述】:

我的应用适用于 API 19。所以我不能使用 android:elevation。所以我 app:elevation 在我的布局中。

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 !

【问题讨论】:

    标签: java android android-layout


    【解决方案1】:

    尝试使用以下代码

    ViewCompat.setElevation(View, float)
    

    点击以下链接。这里展示了如何在 pre-lollipop 设备上进行提升

    Android AppCompat 21 Elevation

    【讨论】:

    • 请在此处描述“View”的值。
    • “视图”将是您尝试向其添加高程的 xml 元素。例如,如果您有 ImageView 或带有 android:id="@+id/my_custom_id" 的 LinearLayout 那么代码将是 ViewCompat.setElevation(my_custom_id, 15F)
    【解决方案2】:

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

    如果您查看为什么不推荐使用 mAppBarLayout.setTargetElevation(0)。它指出:

    @deprecated 目标海拔现在已弃用。 AppBarLayout 的高度现在通过 {@link android.animation.StateListAnimator} 控制。 这个方法现在总是返回 0。

    因此,要以编程方式设置 appbar 布局,您只能通过在 animator res 文件夹中创建 StateListAnimator 例如 appbar_state_unelevated_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 阴影。

    【讨论】:

    • 您的回答很有道理,尤其是在 Google 文档中。但它不适合我。我真的很想知道为什么。你介意分享一个使用这种方法的示例 git 项目吗?或者我可以在这里分享我的,如果你还在跟踪这个问题......
    • 你可以和我分享你的,因为上面的代码就是你所需要的。可能有一些特定于您的实现的东西。也许我可以帮你。来吧,把你的代码分享给我。
    【解决方案3】:

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

        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>
    

    【讨论】:

    • 感谢您的完整回答。
    【解决方案4】:

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

    getSupportActionBar().setElevation(0);
    

    或者您可以点击此链接并查看如何在 API 21 以下的 Android 上更改视图的高度

    Android AppCompat 21 Elevation

    【讨论】:

    • 那是改变 android:elevation。不是我想要的:x
    • 不,这不起作用。我除了 setAppElevation 或其他东西。
    • 我只是在一个 app min api 15 中使用它
    【解决方案5】:

    接受的答案对我不起作用。

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

    app:elevation="0" 在 AppBarLayout xml 中或

    在java中使用mAppBarLayout.setTargetElevation(0)

    它在我的情况下有效。

    【讨论】:

      【解决方案6】:

      以下解决方案适用于 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);
      

      在安卓上

      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 上

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 2014-03-07
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多