我不知道这种方法是否是最好的,但我有以下问题:
我希望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的提升之外,一切都运行得很好(或者说至少和预期的一样)。我尝试手动设置标高,但没有显示标高。
EDIT______
我的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,右边有一条红线。你有什么建议可以用另一种方式来实现我的目标吗?
发布于 2017-02-22 23:42:06
你应该调用setCardElevation而不是setElevation。第二个修改属性elevation,所有的View子类从棒棒糖开始都有这个属性(API21级)。
而且不要使用 setBackgroundResource:卡片的背景是它的高度(这是因为卡片与棒棒糖之前的所有安卓版本兼容,这些版本没有elevation属性)。使用setCardBackgroundColor设置背景色(或app:cardBackgroundColor )。
如果你需要背景图像,而不是颜色,按照this answer的建议,在你的卡片内放置一个ImageView。
做你想做的,但不要在CardView上调用任何setBackground...方法,否则你会失去卡片阴影(它的提升效果)。
其次,使用以下代码为您的标高添加动画效果:
ObjectAnimator animator = ObjectAnimator.ofFloat(cardView, "cardElevation", start, end);
// if needed set duration, interpolator, or what you want on the animator
animator.start();发布于 2017-02-22 23:45:50
试着使用
cardview.setMaxCardElevation();但请注意:
如果设备操作系统版本是棒棒糖或更高版本并且getUseCompatPadding()为false,则调用此方法的
不起作用。
或者尝试
cardview.setCardElevation();或来自xml:
将android:clipChildren="false"添加到您的cardview的父级,或者向您的视图添加少量填充并设置android:clipToPadding="false"
并使用
card_view:cardElevation="VALUE"发布于 2019-10-19 10:59:58
视图的Outline是“驱动它的阴影形状”的东西。当更改背景隐式地更改视图的轮廓时,您必须通过调用View.invalidateOutline()显式地使轮廓无效,以便在视图周围重新绘制阴影。
https://stackoverflow.com/questions/42395879
复制相似问题