1

I'm currently using Nine Old Androids to animate a RelativeLayout like a slider menu, which slides down form the top. I've tried in many ways, Can someone make a suggestion?

Here is the animation code:

  private OnClickListener slideClick = new OnClickListener(){
    @Override
    public void onClick(View v) {
        slideGroups.bringToFront();

        if(!mPulledDown) {
            ObjectAnimator oa = ObjectAnimator.ofFloat(slideGroups, "translationY", slideGroups.getHeight()-80);
            oa.addListener(new AnimatorListener() {
                @Override
                public void onAnimationStart(Animator arg0) {}

                @Override
                public void onAnimationRepeat(Animator arg0) {}

                @Override
                public void onAnimationEnd(Animator arg0) {
                    arrow.setImageResource(R.drawable.arrowup);
                    if(Application.getAndroidAPILevel() < 11) {
                        // only if pre 3.0 (api level 11)
                        Toast.makeText(FriendsActivity.this, String.format("api level %s", 
                                Application.getAndroidAPILevel()), Toast.LENGTH_SHORT).show();
                        //RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) slideGroups.getLayoutParams();

                        // clear animation to prevent flicker
                        slideGroups.clearAnimation();

                        // set new "real" position of wrapper
                        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, slideGroups.getWidth());
                        //lp.addRule(RelativeLayout.BELOW, R.id.branchFinderIncludeHeader);
                        slideGroups.setLayoutParams(lp);

                    }
                }

                @Override
                public void onAnimationCancel(Animator arg0) {}
            });
            oa.start();
        }
        else 
        {
            ObjectAnimator oa = ObjectAnimator.ofFloat(slideGroups, "translationY", 0);
            oa.addListener(new AnimatorListener() {
                @Override
                public void onAnimationStart(Animator arg0) {}

                @Override
                public void onAnimationRepeat(Animator arg0) {}

                @Override
                public void onAnimationEnd(Animator arg0) {
                    arrow.setImageResource(R.drawable.arrowdown);
                    if(Application.getAndroidAPILevel() < 11) {
                        // only if pre 3.0 (api level 11)
                        Toast.makeText(FriendsActivity.this, String.format("api level %s", 
                                Application.getAndroidAPILevel()), Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void onAnimationCancel(Animator arg0) {}
            });
            oa.start();
        }

        mPulledDown = !mPulledDown;         
    }
};

I just need something to work with sdk level 4 and newer. Currently, touching/tapping passes that event to the list underneath the slider when expanded. Please let me know if any other information is needed. slideGroups is the RelativeLayout. arrow is an imageview. groupsButton is a LinearLayout with text and an image button. groupsButton should be clickable; that's what expands and is supposed to collapse it.

Thanks in advance.

RajeshVijayakumar
  • 10,281
  • 11
  • 57
  • 84

1 Answers1

2

A few people have contributed by editing my question with solutions. I'd like to give them credit, but can't upvote an edit. For posterity, here is the solution that works for me.

int originalMarginLeft = 0;
int originalMarginTop = 0;
int originalMarginRight = 0;
int originalMarginBottom = 0;
int originalLeft = 0;
int originalTop = 0;
int originalRight = 0;
int originalBottom = 0;
int originalX = 0;
int originalY = 0;
int originalHeight = 0;

private OnClickListener slideClick = new OnClickListener(){
    @Override
    public void onClick(View v) {
        slideGroups.bringToFront();

        if(originalMarginLeft == 0) {
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) slideGroups.getLayoutParams();
            originalMarginLeft = params.leftMargin;
            originalMarginTop = params.topMargin;
            originalMarginRight = params.rightMargin;
            originalMarginBottom = params.bottomMargin;
            originalLeft = slideGroups.getLeft();
            originalTop = slideGroups.getTop();
            originalRight = slideGroups.getRight();
            originalBottom = slideGroups.getBottom();
            originalHeight = params.height;
        }

        if(!mPulledDown) {
            ObjectAnimator oa = ObjectAnimator.ofFloat(slideGroups, "translationY", originalHeight);
            oa.addListener(new AnimatorListener() {
                @Override
                public void onAnimationStart(Animator arg0) {}

                @Override
                public void onAnimationRepeat(Animator arg0) {}

                @Override
                public void onAnimationEnd(Animator arg0) {
                    arrow.setImageResource(R.drawable.arrowup);
                    if(Application.getAndroidAPILevel() < 11) {

                        slideGroups.clearAnimation();
                        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(slideGroups.getWidth(), slideGroups.getHeight());
                        lp.leftMargin = originalMarginLeft;
                        lp.rightMargin = originalMarginRight;
                        slideGroups.setLayoutParams(lp);

                    }
                }

                @Override
                public void onAnimationCancel(Animator arg0) {}
            });
            oa.start();
        }
        else 
        {
            ObjectAnimator oa = ObjectAnimator.ofFloat(slideGroups, "translationY", -originalHeight+60);
            oa.addListener(new AnimatorListener() {
                @Override
                public void onAnimationStart(Animator arg0) {}

                @Override
                public void onAnimationRepeat(Animator arg0) {}

                @Override
                public void onAnimationEnd(Animator arg0) {
                    arrow.setImageResource(R.drawable.arrowdown);
                    if(Application.getAndroidAPILevel() < 11) {

                        slideGroups.clearAnimation();
                        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(slideGroups.getWidth(), slideGroups.getHeight());
                        lp.leftMargin = originalMarginLeft;
                        lp.rightMargin = originalMarginRight;
                        lp.topMargin = originalMarginTop;
                        lp.bottomMargin = originalMarginBottom;
                        slideGroups.setLayoutParams(lp);
                    }
                }

                @Override
                public void onAnimationCancel(Animator arg0) {}
            });
            oa.start();
        }

        mPulledDown = !mPulledDown;         
    }
};