pjr*_*rki 5 layout android collapse android-animation
我从该主题尝试了各种解决方案(请参阅Android:展开/折叠动画),但没有一个真正适合我。我确信投票最多的人是好人,而它行不通的原因是我听不懂。请告诉我我在做什么错。先感谢您 :)
编辑:我的问题的重点是,当我单击元素'relativeZaplon'时,它可以很好地扩展,但是当我要折叠它时,它并不对应。
主要活动
public class MainActivity extends AppCompatActivity {
private boolean isVisible = false;
private RelativeLayout mRelativeZaplon;
private RelativeLayout mRelativeToSlide;
private ExpandOrCollapse mAnimationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAnimationManager = new ExpandOrCollapse();
mRelativeZaplon = (RelativeLayout) findViewById(R.id.relativeZaplon);
mRelativeToSlide = (RelativeLayout) findViewById(R.id.relativevToSlide);
mRelativeZaplon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isVisible) {
mAnimationManager.collapse(mRelativeToSlide, 1000, 200);
isVisible = false;
} else if (!isVisible){
mAnimationManager.expand(mRelativeToSlide, 1000, 200);
isVisible = true;
}
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
展开/折叠类别
public class ExpandOrCollapse {
public static void expand(final View v, int duration, int targetHeight) {
int prevHeight = v.getHeight();
v.setVisibility(View.VISIBLE);
ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
v.getLayoutParams().height = (int) animation.getAnimatedValue();
v.requestLayout();
}
});
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.setDuration(duration);
valueAnimator.start();
}
public static void collapse(final View v, int duration, int targetHeight) {
int prevHeight = v.getHeight();
ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight);
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
v.getLayoutParams().height = (int) animation.getAnimatedValue();
v.requestLayout();
}
});
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.setDuration(duration);
valueAnimator.start();
}
}
Run Code Online (Sandbox Code Playgroud)
XML格式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:background="@color/colorPrimaryDark"
android:id="@+id/relativevToSlide"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
</RelativeLayout>
<RelativeLayout
android:id="@+id/relativeZaplon"
android:background="@color/colorAccent"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_below="@+id/relativevToSlide"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true">
</RelativeLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
小智 7
这是我的方法版本,您不必设置任何高度,它将根据其可见性展开或折叠任何视图。
public static void expand(final View v, int duration) {
final boolean expand = v.getVisibility()!=View.VISIBLE;
int prevHeight = v.getHeight();
int height = 0;
if (expand) {
int measureSpecParams = View.MeasureSpec.getSize(View.MeasureSpec.UNSPECIFIED);
v.measure(measureSpecParams, measureSpecParams);
height = v.getMeasuredHeight();
}
ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, height);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
v.getLayoutParams().height = (int) animation.getAnimatedValue();
v.requestLayout();
}
});
valueAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
if (expand){
v.setVisibility(View.VISIBLE);
}
}
@Override
public void onAnimationEnd(Animator animation) {
if (!expand){
v.setVisibility(View.INVISIBLE);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.setDuration(duration);
valueAnimator.start();
}
Run Code Online (Sandbox Code Playgroud)
只需像这样调用方法:
expand(YOURVIEWID,500);
Run Code Online (Sandbox Code Playgroud)
这是因为
if (isVisible) {
mAnimationManager.collapse(mRelativeToSlide, 1000, 200);
isVisible = false;
} else if (!isVisible){
mAnimationManager.expand(mRelativeToSlide, 1000, 200);
isVisible = true;
}
Run Code Online (Sandbox Code Playgroud)
crash() 和 Expand() 做同样的事情,在这种情况下它们都是展开动画。您需要将不同的值传递给您的collapse()方法;简单的解决方案是
mAnimationManager.collapse(mRelativeToSlide, 1000, -200);
Run Code Online (Sandbox Code Playgroud)
但是您的编码风格还存在一些问题,例如,您可以摆脱崩溃()方法,因为像这样调用 Expand 两次也可以:
if (isVisible) {
mAnimationManager.expand(mRelativeToSlide, 1000, -200);
isVisible = false;
} else if (!isVisible){
mAnimationManager.expand(mRelativeToSlide, 1000, 200);
isVisible = true;
}
Run Code Online (Sandbox Code Playgroud)
我建议您将其发布在Code Review上。
| 归档时间: |
|
| 查看次数: |
7562 次 |
| 最近记录: |