首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式设置CardView标高

以编程方式设置CardView标高
EN

Stack Overflow用户
提问于 2017-02-22 23:37:12
回答 3查看 10.2K关注 0票数 1

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

我希望RecyclerView中的一个列表项(一个CardView)在它的按钮被单击时是动画的,这样这个按钮,这个项中的一些其他视图和CardView的背景就会改变。

我从一个自定义的RecyclerView.ItemAnimator捕获animateChange:(到目前为止,动画只是通过animateLayoutChanges在xml中定义的淡入淡出)

代码语言:javascript
复制
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)设置为以下内容来实现:

代码语言:javascript
复制
<?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,右边有一条红线。你有什么建议可以用另一种方式来实现我的目标吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-22 23:42:06

你应该调用setCardElevation而不是setElevation。第二个修改属性elevation,所有的View子类从棒棒糖开始都有这个属性(API21级)。

而且不要使用 setBackgroundResource:卡片的背景是它的高度(这是因为卡片与棒棒糖之前的所有安卓版本兼容,这些版本没有elevation属性)。使用setCardBackgroundColor设置背景色(或app:cardBackgroundColor )。

如果你需要背景图像,而不是颜色,按照this answer的建议,在你的卡片内放置一个ImageView

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

其次,使用以下代码为您的标高添加动画效果:

代码语言:javascript
复制
ObjectAnimator animator = ObjectAnimator.ofFloat(cardView, "cardElevation", start, end);
// if needed set duration, interpolator, or what you want on the animator
animator.start();
票数 10
EN

Stack Overflow用户

发布于 2017-02-22 23:45:50

试着使用

代码语言:javascript
复制
cardview.setMaxCardElevation();

但请注意:

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

不起作用。

或者尝试

代码语言:javascript
复制
cardview.setCardElevation();

Source

或来自xml:

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

并使用

代码语言:javascript
复制
card_view:cardElevation="VALUE"
票数 1
EN

Stack Overflow用户

发布于 2019-10-19 10:59:58

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42395879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档