我使用 CardView 作为 Recycler Adapter 的一个项目。
起初,所有项目都不会显示全部内容,(我将其剪切并放置“... ...”)
但单击它后,单击的项目将缩放其高度以适应内容高度。(这里我将文本设置为全部内容,希望卡片可以缩放以适应它)
好像:
我知道如何将高度设置为特定的目标高度。但在这种情况下,我不知道如何测量显示整个内容所需的高度,每个项目应该有不同的目标高度。
我该怎么做?
我使用 CardView 作为 Recycler Adapter 的一个项目。
起初,所有项目都不会显示全部内容,(我将其剪切并放置“... ...”)
但单击它后,单击的项目将缩放其高度以适应内容高度。(这里我将文本设置为全部内容,希望卡片可以缩放以适应它)
好像:
我知道如何将高度设置为特定的目标高度。但在这种情况下,我不知道如何测量显示整个内容所需的高度,每个项目应该有不同的目标高度。
我该怎么做?
您可以做的是要求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);
你可以很简单地做到这一点。第一次将文本设置为 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 中的文本太多,最好使用固定的持续时间,而不是依赖于高度。