1

我不知道这种方法是否最好,但我有以下问题:

我希望 RecyclerView 中的列表项(CardView)在单击它的按钮时被动画化,以便此按钮、此项目内的其他一些视图和 CardView 的背景发生变化。

我正在从自定义 RecyclerView.ItemAnimator 中捕获 animateChange:(直到现在,动画只是通过 animateLayoutChanges 在 xml 中定义的淡入淡出)

public boolean animateChange(@NonNull RecyclerView.ViewHolder oldHolder, @NonNull RecyclerView.ViewHolder newHolder, @NonNull ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
    Log.d("Animation", "Test");
    final MyAdapter.MyViewHolder viewHolder = (MyAdapter.MyViewHolder) newHolder;

    viewHolder.mButtons.setVisibility(View.GONE);
    viewHolder.mHints.setVisibility(View.GONE);
    viewHolder.mImageView.setVisibility(View.GONE);

    ViewGroup.LayoutParams layoutParams = viewHolder.containerCardView.getLayoutParams();
    layoutParams.height = 192;
    viewHolder.containerCardView.setLayoutParams(layoutParams);
    viewHolder.containerCardView.setBackgroundResource(R.drawable.some_background);
    viewHolder.containerCardView.setElevation(20f);

    return true;
}

如您所见,我在 animateChange 中手动设置背景。除了 CardView 的高度之外,一切正常(或者至少可以说是预期的)。我尝试手动设置高度,但没有显示高度。

编辑______

我的 CardView 里面有一个 ImageView 和一个按钮。当按下按钮时,按钮本身和图片应该会淡出,并且cardView右侧应该有一条红线。我试图通过将背景(使用 setBackgroundResource)设置为此:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="rectangle">
        <gradient
            android:angle="180"
            android:centerColor="@android:color/transparent"
            android:centerX="0.1"
            android:startColor="@android:color/holo_red_dark"/>
        <corners
            android:bottomLeftRadius="2dip"
            android:bottomRightRadius="2dip"
            android:topLeftRadius="2dip"
            android:topRightRadius="2dip"/>
    </shape>
</item>

<item android:right="4dp">
    <shape android:shape="rectangle">
        <solid android:color="@android:color/white" />
    </shape>
</item>
</layer-list>

这只是一个 xml drawable,右侧有一条红线。您对实现我的目标的另一种方法有什么建议吗?

4

3 回答 3

10

你应该打电话setCardElevation而不是setElevation. 第二个修改了自 Lollipop(API 级别 21)以来elevation所有子类都具有的属性。View

并且不要使用 setBackgroundResource:卡片背景是它的高度(这是因为卡片与棒棒糖之前的所有 Android 版本兼容,没有该elevation属性)。用于setCardBackgroundColor设置背景颜色(或app:cardBackgroundColor在您的 xml 中)。

如果您需要背景图片而不是颜色,ImageView请按照此答案的建议将卡片放入卡片内部。

做你想做的,但不要setBackground...在 上调用任何方法CardView,否则你会失去卡片阴影(它的高程效果)。

其次,要为您的高程设置动画,请使用以下代码:

ObjectAnimator animator = ObjectAnimator.ofFloat(cardView, "cardElevation", start, end);
// if needed set duration, interpolator, or what you want on the animator
animator.start();
于 2017-02-22T15:42:05.830 回答
1

尝试使用

cardview.setMaxCardElevation();

但请注意:

如果设备操作系统版本是 Lollipop 或更高版本并且 getUseCompatPadding() 为 false,则调用此方法无效。

或者试试

cardview.setCardElevation();

来源

或来自 xml:

添加android:clipChildren="false"到您的卡片视图的父级或向您的视图添加少量填充并设置android:clipToPadding="false"

并使用

card_view:cardElevation="VALUE"
于 2017-02-22T15:45:50.233 回答
1

视图Outline是“驱动其阴影形状”的东西。当更改背景隐式更改视图的轮廓时,您必须通过调用显式使轮廓无效View.invalidateOutline(),以便在视图周围重绘阴影。

于 2019-10-19T02:59:58.393 回答