1

グリッドビュー上に浮かぶいくつかのテキストビューを含む相対レイアウトがあります。グリッド内の項目を選択すると、レイアウトが画面のほぼ最後まで移動し、約 1/5 しか表示されません。これは、単純な変換アニメーションを使用して行われます。グリッド内の別のボタンをクリックすると、グリッドビューの上の元の位置に戻るために相対レイアウトが必要になります。Translate Animation でもこれを行いましたが、これは起こりつつありますが、折りたたまれたときに表示されていた RelativeLayout の部分のみが移動 (移動) し、アニメーションが終了した後に他の部分が表示されます。これは本当に醜く見えます。

Android は、画面に表示されていないビューの部分を描画しないことを知っています。完全な部分を強制的に描画する方法はありますか?

私のアニメーションコードは以下のとおりです。

  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);
}
4

1 に答える 1

1

これに対する解決策を見つけました。

下位の API レベルをサポートする必要がなく、API レベル 11 以降で問題ない場合は、ObjectAnimator を使用できます。ObjectAnimator には、非常にうまく機能する変換メソッドがあります。

API 8 以降をサポートする必要がある場合は、ビューが画面の境界内に収まるようにしてからアニメーション化する必要があります。次のコード変更でうまくいきました。

非常に奇妙に思えますが、これを行うより良い方法があれば教えてください。

 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);
}
于 2013-07-24T07:04:01.390 に答える