سؤال

I'm trying to do an animation that goes like this:

The context:

I have two EditText's I need that when you click over one, the another one come out from behind the first one. Here you have some pictures to get a image of what I want. Application in standby Application after you click the first EditText

To do this obviously I need a TranslateAnimation in order to move the second EditText from behind the first one.

My approach:

The first thing that I could thought was in use a FrameLayout put the EditText one over another, and then in the onTouch event of the first one do a TranslateAnimation on the second one. The problem with this is that if I have the FrameLayout height in wrap_content then the animation will be invisible to the user. And if I change on runtime the height of the FrameLayout I will leave a void below the first EditText as you can see in this picture:

enter image description here

The second solution that I thought was add one AnimationListener to the TranslateAnimation and in the onAnimationStart method change the height of the FrameLayout. But the problem with this is that the height of the FrameLayout changes too abruptly. I want keep the animation smooth.

My question:

How can I get a smooth animation of the second EditText from behind the first one, changing the height of the FrameLayout as the second EditText moves down?

Thanks!

Update:

I changed the FrameLayout by a RelativeLayout I searched and there's no difference for this case. I tried scale this RelativeLayout that contains both of the EditText with an AnimationScale in order to display the animation smoothly, but didn't work. Here is my code:

    protected void expanse() {
        Log.d("Accordion", "expandAccordion");
        //Translate the top of the second EditText to its bottom
        TranslateAnimation translateSecond = new TranslateAnimation(second.getLeft(), second.getLeft(), 
                second.getTop(), second.getBottom());
        translateSecond.setDuration(1000);
        //Scale the relative layout to show the both of them
        ScaleAnimation scaleContainer = new ScaleAnimation(container.getLeft(),  container.getLeft(), 
                container.getTop(), second.getBottom());
        scaleContainer.setDuration(1000);
        //At the end of the scaling, change the height of the relative layout
        scaleContainer.setAnimationListener(new AnimationListenerAdapter() {

            @Override
            public void onAnimationEnd(Animation animation) {
                RelativeLayout.LayoutParams params = (LayoutParams) container.getLayoutParams();
                params.height = second.getBottom();
                container.setLayoutParams(params);
                super.onAnimationEnd(animation);
            }

        });
        container.startAnimation(scaleContainer);
        second.startAnimation(translateSecond);
    }

BTW I can guarantee that if I hardcode some large height like 350dp, the animation is displayed correctly.

UPDATE:

I tried moving both, the second EditText and the layout below. This is the code. BTW for another reasons I changed the ListView by a custom ViewPager, this doesn't change anything.

  public class MainActivity extends FragmentActivity {

    private EditText first;
    private EditText second;
    private HoboViewPager pager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pager = (HoboViewPager) findViewById(R.id.pager);
        pager.setPageTransformer(true, new RotationPageTransformer());
        pager.setAdapter(new SampleAdapter(this, getSupportFragmentManager()));

        first = (EditText) findViewById(R.id.location_search_field);
        second = (EditText) findViewById(R.id.term_search_field);
        first.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                expanseSecondField();
                return true;
            }
        });
    }

    protected void expanseSecondField() {
        TranslateAnimation translateSecondField = new TranslateAnimation(second.getLeft(), second.getLeft(), 
                second.getTop(), second.getBottom());
        translateSecondField.setFillAfter(true);
        translateSecondField.setDuration(1000);
                    TranslateAnimation translateContainer = new TranslateAnimation(pager.getLeft(), pager.getLeft(), 
                pager.getTop(), pager.getTop() + second.getBottom());
        translateContainer.setFillAfter(true);
        translateContainer.setDuration(1000);
                    pager.startAnimation(translateContainer);
        second.startAnimation(translateSecondField);
    }
}

This didn't work because the TranslateAnimation of the container is executed immediately. The result is the same that when I was trying to change the size of the container at the end of the animation.

هل كانت مفيدة؟

المحلول

How use the 2nd option & try performing two translate animations in tandem: 1 on the EditText, then one on the FrameLayout? Give them both the same exact deltas and duration. This way, the FrameLayout will move down smoothly, then at the end of the animation, change the height of the FrameLayout.

Hope this helps :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top