以编程方式设置CardView高程

Van*_*ore 1 android elevation android-recyclerview cardview

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

我希望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;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我在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>
Run Code Online (Sandbox Code Playgroud)

这只是一个xml drawable,右边是红线.对于达到目标的其他方式,您有什么建议吗?

Mas*_*imo 7

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

并且不要使用 setBackgroundResource:卡背景是它的高度(这是因为该卡与Lollipop之前的所有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();
Run Code Online (Sandbox Code Playgroud)

  • `CardView`是`FrameLayout`的扩展:所以放置一个`ImageView`作为卡的第一个子,并将你的背景作为这个ImageView的`src`(最终用右'scaleType`).http://stackoverflow.com/a/33920684/1507512 (2认同)