可以在LinearLayout内的ViewGroup内为View设置动画吗?

时间:2011-09-19 20:08:00

标签: android android-3.0-honeycomb android-animation

我有一个扩展main.xml中定义的LinearLayout的类。以编程方式我创建了x个扩展ViewGroup的类。我重写了canAnimate()以返回true。在其中还有一些以编程方式创建的视图。我想要做的是点击其中一个嵌套的子视图并让它动画(y轴旋转ObjectAnimator)。在动画结束时,我将点击的视图隐藏在onAnimationEnd侦听器中。

触摸事件有效,我可以看到在给定的动画持续时间后被点击隐藏的视图。问题是视图实际上没有动画。如果我在ViewGroup扩展上使用相同的动画代码,我可以看到你想要的动画。

看起来您无法为嵌套超过2级的子视图设置动画。任何人都可以确认这一点,或举例说明如何为LinearLayout的ViewGroup的视图设置动画?

这是在Honeycomb。

感谢。

更新: 我可以将4个LinearLayouts和一个View嵌套在XML中,并将其视为动画。我更改了扩展ViewGroup的类以扩展LinearLayout,但仍然没有子视图的动画。什么可以设置为我没有以编程方式设置以允许儿童动画的视图?

public class MyViewGroup extends ViewGroup implements ViewGroup.OnTouchListener {

    private View viewToAnimate;

    public MyViewGroup(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setup(context);
    }

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup(context);
    }

    public MyViewGroup(Context context) {
        super(context);
        setup(context);
    }

    private void setup(Context context)
    {
        viewToAnimate = new View(context);
        viewToAnimate.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
        viewToAnimate.setBackgroundColor(Color.YELLOW);
        viewToAnimate.setOnTouchListener(this);
        addView(viewToAnimate);    
    }

    @Override
    protected boolean canAnimate()
    {
        return true;
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // Left out for brevity
    }


    public boolean onTouch(View v, MotionEvent event)
    {
        animateViewRotation();
        return true;
    }

    private Interpolator accelerator = new AccelerateInterpolator();
    private Interpolator decelerator = new DecelerateInterpolator();
    private void animateViewRotation()
    {
            // Tried all of the following:
        /*
        ObjectAnimator rotationY = ObjectAnimator.ofFloat(viewToAnimate, "rotationY", 0f, 90f);
        AnimatorSet translations = new AnimatorSet();
        translations.setDuration(1000);
        translations.play(rotationY);
        translations.start();
        */

        /*
        RotateAnimation ta = new RotateAnimation(0f, 90f, 0, 100);
        ta.setDuration(1000);
        viewToAnimate.startAnimation(ta);
        */


        // Copied/adapted from API Demos code
        ObjectAnimator animation = ObjectAnimator.ofFloat(viewToAnimate, "rotationY", 0f, 90f);
        animation.setDuration(1000);
        //animation.setInterpolator(accelerator);
        animation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator anim) {
                viewToAnimate.setVisibility(View.GONE);
            }
        });

        animation.start();
    }

}

0 个答案:

没有答案