android翻译动画剪辑未在屏幕上显示的 View 部分

标签 android android-animation

我有一个相对布局,其中包含一些 float 在 GridView 上的 TextView 。当我在网格中选择一个项目时,布局向下移动到屏幕的尽头,只有大约 1/5 的部分是可见的。这是使用简单的翻译动画完成的。现在,当我单击网格中的另一个按钮时,我需要将相对布局移回其在 GridView 顶部的原始位置。我也用 Translate Animation 做到了这一点,这正在发生,但只有折叠时可见的 RelativeLayout 部分正在平移(移动),而另一部分在动画结束后变得可见。这看起来真的很难看。

我知道 Android 不会绘制屏幕上不可见的 View 部分。有没有办法强制绘制完整部分?

我的动画代码如下:

  public void smoothExpanderAnimate(final int finalTarget,final RelativeLayout expander,final int animateToY,final boolean setExpanded,final boolean refreshGrid)
{
    final RelativeLayout.LayoutParams head_params = (RelativeLayout.LayoutParams)expander.getLayoutParams();
    TranslateAnimation anim = new TranslateAnimation(0f, 0f, 0f, animateToY);
    anim.setDuration(400);

    //timeListHeight = list.getHeight();
    //anim.setFillAfter(true);
    anim.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            //Should I try something here ?

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            head_params.topMargin = finalTarget;
            expander.clearAnimation();
            expander.setLayoutParams(head_params);

            isExpanded = setExpanded;
            isAnimating = false;



            if(!setExpanded)
            {
                setChildHeight(timeListHeight, list);
            }
        }
    });



    isAnimating = true;
    expander.startAnimation(anim);
}

最佳答案

我找到了解决方案。

如果您不需要支持较低的 API 级别并且可以使用 API 级别 11 以上,您可以为此使用 ObjectAnimator。 ObjectAnimator 有一个 translatey 方法,效果很好。

如果您需要支持 API 8 及更高版本,您需要确保您的 View 在屏幕范围内,然后进行动画处理。以下代码修改成功了。

我知道这看起来很奇怪,如果有更好的方法,请告诉我。

 public void smoothExpanderAnimate(boolean addSpecialFix,final int finalTarget,final RelativeLayout expander,final int animateToY,final boolean setExpanded,final boolean refreshGrid)
{
    final RelativeLayout.LayoutParams head_params = (RelativeLayout.LayoutParams)expander.getLayoutParams();
    TranslateAnimation anim = new TranslateAnimation(0f, 0f, 0f, animateToY);
    anim.setDuration(400);
    expander.setVisibility(View.INVISIBLE); //Make View invisible

    if(isExpanded && addSpecialFix){  

    //THIS IS THE FIX

        int old = head_params.topMargin;
        head_params.topMargin = finalTarget;
        expander.clearAnimation();
        expander.setLayoutParams(head_params); //move invisible view to the final position
    anim = new TranslateAnimation(0f, 0f, old-closedY, 0);
    Log.d("asdasd", old+"");
    anim.setDuration(400);


    }
    //timeListHeight = list.getHeight();
    //anim.setFillAfter(true);
    anim.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            head_params.topMargin = finalTarget;
            expander.clearAnimation();
            expander.setLayoutParams(head_params);

            isExpanded = setExpanded;
            isAnimating = false;
            expander.setVisibility(View.VISIBLE);
            if(refreshGrid)
            {
                mCalAdapter.notifyDataSetChanged();
            }

            if(!setExpanded)
            {
                setListHeight(timeListHeight, list);
            }
        }
    });



    isAnimating = true;
    expander.startAnimation(anim);
}

关于android翻译动画剪辑未在屏幕上显示的 View 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17785945/

相关文章:

android - 每次查询/写入后关闭 Realm 实例是否可以?

java - Android - 使用 AnimatorSet 缩放动画

android - Gmail ListView 翻转动画

android - 有效的 XML 文件在 Android ADT 中给出 "failed to parse"错误

Android 异步 http 内部服务器错误

android - 如何使用 greenDAO 将一个对象加载到另一个对象中?

Android: Realm + Retrofit - 序列化apiresponse

android - android中图像从中心到顶部的翻译

android - fragment popbackstack 动画不起作用

android - 在贝塞尔曲线路径上移动对象