4

我使用 CardView 作为 Recycler Adapter 的一个项目。

起初,所有项目都不会显示全部内容,(我将其剪切并放置“... ...”)
但单击它后,单击的项目将缩放其高度以适应内容高度。(这里我将文本设置为全部内容,希望卡片可以缩放以适应它)

好像:

在此处输入图像描述

我知道如何将高度设置为特定的目标高度。但在这种情况下,我不知道如何测量显示整个内容所需的高度,每个项目应该有不同的目标高度。

我该怎么做?

4

2 回答 2

3

您可以做的是要求View测量自身,而不限制其高度。请注意对 的调用view.getWidth(),您只能在View布局之后才可以这样做,因为您在其中调用它onClick()应该没问题。

int widthSpec = View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(widthSpec, heightSpec);
int targetHeight = view.getMeasuredHeight();

假设您的 View 是具有以下属性集的 TextView:

android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"

完整的例子是

// this is the height measured with maxLines 1 and height
// to wrap_content
final int startHeight = view.getHeight();

// you want to measure the TextView with all text lines
view.setMaxLines(Integer.MAX_VALUE);

int widthSpec = View.MeasureSpec.makeMeasureSpec(view.getWidth(), View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(widthSpec, heightSpec);

// final height of the TextView
int targetHeight = view.getMeasuredHeight();

// this is the value that will be animated from 0% to 100%
final int heightSpan = targetHeight-startHeight;

// remove that wrap_content and set the starting point
view.getLayoutParams().height = startHeight;
view.setLayoutParams(view.getLayoutParams());

Animation animation = new Animation(){
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        view.getLayoutParams().height = (int) (startHeight + heightSpan*interpolatedTime);
        view.setLayoutParams(view.getLayoutParams());
    }
};

animation.setDuration(1000);
view.startAnimation(animation);
于 2017-08-10T06:31:21.643 回答
1

你可以很简单地做到这一点。第一次将文本设置为 TextView 时,请编写以下内容:

int minLineNumber = 2;
textView.setMaxLines(minLineNumber); // 2 is your number of line for the first time

当点击它时:

textView.setMaxLines(Integer.MAX_VALUE); // set the height like wrap_content

如果你想要动画,你有这样的东西:

ObjectAnimator animation = ObjectAnimator.ofInt(
        textView,
        "maxLines",
        textView.getLineCount());

int duration = (textView.getLineCount() - minLineNumber) * 50;
        animation.setDuration(duration);
        animation.start();

如果 TextView 中的文本太多,最好使用固定的持续时间,而不是依赖于高度。

于 2017-08-10T06:33:51.980 回答