gpt4 book ai didi

android - 展开/折叠动画 : Small lag || MeasureSpec returns wrong value

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:07 28 4
gpt4 key购买 nike

我使用以下两种方法 ( inspired/copied from here ) expandcollapse ScrollView 中的一些 TextViews > 点击“header”-TextView

伪布局结构:

<ScrollView>
<LinearLayout>
<LinearLayout>
<!-- some other stuff here -->
</LinearLayout>
<TextView "header1"/>
<View "fancydivider"/>
<TextView "content1">
<TextView "header2"/>
<View "fancydivider"/>
<TextView "content2">
</LinearLayout>
</ScrollView>

Divider 是一个简单的Viewheight设置为1dp。 content-TextViews 样式包括:

    <item name="android:layout_height">0dp</item>
<item name="android:layout_width">match_parent</item>

和一些边距和填充。

这里的方法:

public static void expand(final View v) {

//v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

int matchParentMeasureSpec = View.MeasureSpec.makeMeasureSpec(((View) v.getParent()).getWidth(), View.MeasureSpec.EXACTLY);
int wrapContentMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
v.measure(matchParentMeasureSpec, wrapContentMeasureSpec);

final int targetHeight = v.getMeasuredHeight();

// Older versions of android (pre API 21) cancel animations for views with a height of 0.
v.getLayoutParams().height = 1;
v.setVisibility(View.VISIBLE);
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1
? ViewGroup.LayoutParams.WRAP_CONTENT
: (int) (targetHeight * interpolatedTime);
scrollView.smoothScrollTo(0, (int) (targetHeight * interpolatedTime));
v.requestLayout();
}

@Override
public boolean willChangeBounds() {
return true;
}
};

a.setInterpolator(easeInOutQuart);
a.setDuration(computeDurationFromHeight(v));
v.startAnimation(a);

}

public static void collapse(final View v) {
final int initialHeight = v.getMeasuredHeight();

Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if (interpolatedTime == 1) {
v.setVisibility(View.GONE);
} else {
v.getLayoutParams().height = initialHeight - (int) (initialHeight * interpolatedTime);
v.requestLayout();
}
}

@Override
public boolean willChangeBounds() {
return true;
}
};

a.setInterpolator(easeInOutQuart);
a.setDuration(computeDurationFromHeight(v));
v.startAnimation(a);
}

private static int computeDurationFromHeight(View view) {
// 1dp/ms * multiplier
return (int) (view.getMeasuredHeight() / view.getContext().getResources().getDisplayMetrics().density) * 4;
}

这里的问题一切正常 - 直到 expand animation 到达文本的最后一行 - 如果上面的 characters 太少,然后它滞后、跳跃、爆炸? - 不管你怎么调用它 - 直到完全展开。

折叠 似乎工作正常。

我尝试了其他 Interpolator 值,方法 computeDurationFromHeight 中的另一个乘数。

一些测试:

    • 4 行,在第四行,超过 17 个字符的所有内容都可以正常工作,少于 18 个字符的内容会滞后。

    • 3 行和最后一行不相关的字符数工作正常。

    • 有时 animation 在第一个 expand 上起作用,但在第二个上不起作用。

    • 看来 TextView 计算有误。使用高 multiplier 我看到一些 text 在下一个标题 TextView
    • 上弹出 <0.5s
    • 删除 expand 中的 smoothScrollTo 不会改变任何东西(当然除了滚动..)
    • 其他插值器也有“打嗝”,但更短

    重要:

  • 登录 applyTransformation(见下文)让我明白了这一点,我看到 final height 打印了两次 - 正好50 点(像素?dp?)差异。 //平滑增加高度然后:final height = 202 height = 252 final height = 252 当我得到 targetHeight = 203 - 所以 height 首先计算错误,然后一些奇迹发生了?

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1
? ViewGroup.LayoutParams.WRAP_CONTENT
: (int) (targetHeight * interpolatedTime);
v.requestLayout();

scrollView.smoothScrollTo(0, interpolatedTime == 1
? v.getHeight() : (int) (targetHeight * interpolatedTime));

Log.d("Anim", "height = " + v.getHeight());
if (interpolatedTime == 1){
Log.d("Anim", "final height = " + v.getHeight());
}
}

谁能指出我遗漏了什么?

最佳答案

这可能是因为扩展最后一个元素可能会触发滚动,因为布局的高度变大,因此将显示向下“推”

尝试在底部添加一个高度为 20dp 的 FrameLayout 并尝试观察是否有任何不同

关于android - 展开/折叠动画 : Small lag || MeasureSpec returns wrong value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154084/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com