How to animate a slide in notification view that pushes the content view down

后端 未结 3 695
生来不讨喜
生来不讨喜 2020-11-29 11:01

I have two views on the screen

one sits at the top of the screen and on sits directly below it

I need the green view to slide out the top - and make the blue

3条回答
  •  栀梦
    栀梦 (楼主)
    2020-11-29 11:29

    This worked for me

    No notificationAnimating notificationNotification visibleAnimating notificationNo notification

    First you must import this library: http://nineoldandroids.com/

    The import is done by importing existing android project into your workspace, afterwards right click your Poject -> Properties -> Android. Here you will see a library section, click the Add button and add the nineoldandroids library.

    First off, here is the layout xml used for this to work:

    
    
    
    
        
    
        
    
    
    
    
        

    Notice: Both the ListView and the green View could be layouts of any types with any kind of content.

    And next a proof of concept Activity.

    public class TestActivity extends Activity {
    
    private View greenView;
    private ListView listView;
    private int greenHeight;
    
    private boolean isShowingBox;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    
        // The animated view 
        greenView = (View)findViewById(R.id.greenView);
        listView = (ListView)findViewById(R.id.listView1);
    
    
        // Instanciating an array list (you don't need to do this, you already have yours)
        ArrayList your_array_list = new ArrayList();
        your_array_list.add("1");
        your_array_list.add("2");
        your_array_list.add("3");
        your_array_list.add("4");
        your_array_list.add("5");
        your_array_list.add("6");
        your_array_list.add("7");
        your_array_list.add("8");
        your_array_list.add("9");
        your_array_list.add("10");
        your_array_list.add("11");
        your_array_list.add("12");
        your_array_list.add("13");
        your_array_list.add("14");
        your_array_list.add("15");
        // This is the array adapter, it takes the context of the activity as a first // parameter, the type of list view as a second parameter and your array as a third parameter
        ArrayAdapter arrayAdapter =      
        new ArrayAdapter(this,android.R.layout.simple_list_item_1, your_array_list);
        listView.setAdapter(arrayAdapter);
    
        final LinearLayout layout = (LinearLayout)findViewById(R.id.parentLayout);
    
           final ViewTreeObserver vto = layout.getViewTreeObserver();
            vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
    
                    if (Build.VERSION.SDK_INT < 16) {
                        layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    } else {
                        layout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    }
    
                    greenHeight = greenView.getHeight();
    
                }
            });
    }
    
    public void clickHandler(View v) {
        if (isShowingBox) {
            isShowingBox = false;
            slideOut(1500, 0);
        } else {
            isShowingBox = true;
            slideIn(1500, 0);
        }
    }
    
    private void slideIn(int duration, int delay) { 
        AnimatorSet set = new AnimatorSet();
        set.playTogether(
            // animate from off-screen in to screen 
            ObjectAnimator.ofFloat(greenView, "translationY",  -greenHeight, 0),
            ObjectAnimator.ofFloat(listView, "translationY",  0, greenHeight),
            ObjectAnimator.ofFloat(greenView, "alpha", 0, 0.25f, 1)
            // add other animations if you wish
        );
        set.setStartDelay(delay);
        set.setDuration(duration).start();
    }
    
    private void slideOut(int duration, int delay) {
        AnimatorSet set = new AnimatorSet();
        set.playTogether(
            // animate from on-screen and out
            ObjectAnimator.ofFloat(greenView, "translationY", 0, -greenHeight),
            ObjectAnimator.ofFloat(listView, "translationY", greenHeight, 0),
            ObjectAnimator.ofFloat(greenView, "alpha", 1, 1, 1)
            // add other animations if you wish
        );
        set.setStartDelay(delay);
        set.setDuration(duration).start();
    }
    
    }
    

    Important note: Remember to import the AnimatorSet and ObjectAnimator from nineoldandroids in your class and not the Android SDK ones!!!

提交回复
热议问题