Можно ли анимировать View внутри ViewGroup внутри LinearLayout? - PullRequest
1 голос
/ 20 сентября 2011

У меня есть класс, который расширяет LinearLayout, определенный в main.xml.Программно я создаю x количество классов, расширяющих ViewGroup.Я переопределил canAnimate (), чтобы вернуть true.Внутри этого есть еще несколько представлений, также созданных программно.То, что я пытаюсь сделать, это нажать на одно из этих вложенных дочерних представлений и анимировать его (вращение по оси Y ObjectAnimator).В конце анимации я скрываю постукивающее представление в прослушивателе onAnimationEnd.

Событие касания работает, и я вижу вид, который был нажат, скрывается после заданной продолжительности анимации.Проблема в том, что вид на самом деле не анимируется.Если я использую тот же код анимации в расширении ViewGroup, я могу видеть эту анимацию, как и следовало ожидать.

Похоже, что вы не можете анимировать дочерние представления, вложенные более чем в 2 уровня.Может кто-нибудь подтвердить это или привести пример того, как анимировать представление ViewGroup LinearLayout?

Это в сотах.

Спасибо.

Обновление: я могуВложите 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();
    }

}
...