После нескольких часов работы над этим я придумал собственное решение.Это не идеально, и я не уверен, является ли это правильным или лучшим способом сделать это, но вот оно.
Я полностью отказался от идеи использования метода setCustomAnimations FragmentTransaction и пошел с анимацией представлениявместо этого фрагмент с ObjectAnimator.
Единственный код, который я изменил сверху, это две кнопки onClick слушателей.Вот обновленный код onClickListener:
btnHide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(fragment != null && fragment.getView() != null) {
final ViewGroup.LayoutParams params = fragment.getView().getLayoutParams();
final int startHeight = fragment.getView().getMeasuredHeight();
Log.d(TAG, "startHeight is " + startHeight);
ObjectAnimator animator = ObjectAnimator.ofFloat(fragment.getView(), "scaleY", 0f).setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float yVal = (float)animation.getAnimatedValue();
params.height = (int)(yVal * startHeight);
fragment.getView().requestLayout();
}
});
animator.addListener(new Animator.AnimatorListener() {
@Override public void onAnimationStart(Animator animation) {}
@Override public void onAnimationEnd(Animator animation) {
FragmentTransaction ft = fm.beginTransaction();
ft.hide(fragment);
ft.commit();
}
@Override public void onAnimationCancel(Animator animation) {}
@Override public void onAnimationRepeat(Animator animation) {}
});
animator.start();
}else{
Log.d(TAG, "fragment is null!");
}
}
});
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(fragment != null && fragment.getView() != null){
final ViewGroup.LayoutParams params = fragment.getView().getLayoutParams();
fragment.getView().measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
final int endHeight = fragment.getView().getMeasuredHeight();
Log.d(TAG, "endHeight is " + endHeight);
ObjectAnimator animator = ObjectAnimator.ofFloat(fragment.getView(), "scaleY", 1f).setDuration(500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float yVal = (float)animation.getAnimatedValue();
Log.d(TAG, "animation height is " + yVal);
params.height = (int)(yVal * endHeight);
Log.d(TAG, "height is " + params.height);
fragment.getView().requestLayout();
}
});
animator.addListener(new Animator.AnimatorListener() {
@Override public void onAnimationStart(Animator animation) {
FragmentTransaction ft = fm.beginTransaction();
ft.show(fragment);
ft.commit();
}
@Override public void onAnimationEnd(Animator animation) {}
@Override public void onAnimationCancel(Animator animation) {}
@Override public void onAnimationRepeat(Animator animation) {}
});
animator.start();
}else{
Log.d(TAG, "fragment is null!");
}
}
});
Вот как это выглядит сейчас:
Это все еще не идеально,но это ближе к тому, что я ищу.