gpt4 book ai didi

Android:展开/折叠动画

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

假设我有一个垂直的线性布局:

[v1]
[v2]

默认情况下,v1 已可见 = GONE。我想用展开动画显示 v1,同时按下 v2。

我试过这样的:

Animation a = new Animation()
{
int initialHeight;

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final int newHeight = (int)(initialHeight * interpolatedTime);
v.getLayoutParams().height = newHeight;
v.requestLayout();
}

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
initialHeight = height;
}

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

但是有了这个解决方案,动画开始时我会眨眼。我认为这是由 v1 在应用动画之前显示全尺寸造成的。

有了javascript,这就是一行jQuery!使用 Android 有什么简单的方法可以做到这一点?

最佳答案

我看到这个问题很受欢迎,所以我发布了我的实际解决方案。主要优点是您不必知道展开的高度即可应用动画,并且一旦 View 展开,它会在内容发生变化时调整高度。它对我很有用。

public static void expand(final View v) {
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
? LayoutParams.WRAP_CONTENT
: (int)(targetHeight * interpolatedTime);
v.requestLayout();
}

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

// Expansion speed of 1dp/ms
a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
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;
}
};

// Collapse speed of 1dp/ms
a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}

正如@Jefferson 在评论中提到的,您可以通过更改动画的持续时间(以及速度)来获得更流畅的动画。目前已经设置为1dp/ms的速度

关于Android:展开/折叠动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10837746/

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