不调用自定义ScaleAnimation / applytransformation

时间:2013-06-06 23:30:10

标签: android animation android-animation

这是我的自定义ScaleAnimation:

public class MyScaler extends ScaleAnimation {

    private static final String TAG = "myScaler";

    private View mView;

    private LayoutParams mLayoutParams;

    private int oldMargin, newMargin;

    private boolean mVanishAfter = false;

    public MyScaler(float fromX, float toX, float fromY, float toY, int duration, View view,
            boolean vanishAfter) {
        super(fromX, toX, fromY, toY);
        setDuration(duration);
        setFillAfter(true);
        setFillBefore(true);
        setFillEnabled(true);
        mView=view;

        int height = 200; // fiktive hoehe

        mLayoutParams = (LayoutParams) view.getLayoutParams();
        oldMargin = toY<fromY ? mLayoutParams.bottomMargin : -214;
        Log.d(TAG, "old Margin "+oldMargin);
        newMargin = toY<fromY ? oldMargin-height : height;
        Log.d(TAG, "new Margin "+newMargin);

    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        Log.d(TAG, "apply transofrmation");
        if (interpolatedTime < 1.0f) {
            int newBottomMargin=(int)(newMargin*interpolatedTime) + oldMargin;
            mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin,
                    mLayoutParams.rightMargin, newBottomMargin);
            Log.d(TAG,"margin change "+newBottomMargin);
            mView.getParent().requestLayout();
        } else if (mVanishAfter) {
            mView.setVisibility(View.GONE);
        }
    }

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

}

我这样称呼它,通过切换按钮进行展开并隐藏它:

toggle.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick first "+first);
            if(first){
                myScale = new MyScaler(1.0f, 1.0f, 0.0f, 1.0f, 500, dp, false);
                ((TextView) v).setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.expander_ic_minimized, 0);
            }
            else{
                myScale = new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, dp, false);
                ((TextView) v).setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.expander_ic_maximized, 0);
            }
            first=!first;
            myScale.setAnimationListener(new AnimationListener(){

                @Override
                public void onAnimationEnd(Animation animation) {
                    first= !first;
                    Log.d(TAG, "change First"+first);

                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }

                @Override
                public void onAnimationStart(Animation animation) {
                    Log.d(TAG, "started ani");
                }

            });

            dp.startAnimation(myScale);
            View parent = (View)dp.getParent();
             parent.invalidate();
        }
    });

它在第一次尝试时以正确的方式隐藏了视图。但每当我想通过Button扩展它时,它就不会发生。如果触摸覆盖视图,则动画开始。我需要改变什么?提前谢谢。

3 个答案:

答案 0 :(得分:7)

我有同样的问题,但无效在我的情况下不起作用。这解决了我的问题:

dp.requestLayout();

答案 1 :(得分:2)

invalidate()方法帮助我之后,在可见的View对象上调用startAnimation(Animation)方法。

答案 2 :(得分:2)

对于致电invalidate()requestLayout()的人不起作用,请尝试

((View) view.getParent()).invalidate()

如此处所述:https://stackoverflow.com/a/15657563/752781