Animation in Viewpager tab change fadein / fadeout as like Linkedin introduction screen

后端 未结 2 970
自闭症患者
自闭症患者 2020-12-22 21:38

I want to implement same kind of animation such as linked in does in android application for its Introduction(Login / register) screen.

I am using view pager for In

2条回答
  •  借酒劲吻你
    2020-12-22 21:48

    This is a lag free one and also handles the Buttons

    enter image description here

    Main Idea:

    1) first create transparent background for your fragments.

    2) Create LayerDrawable and add background image of each fragment as an item. Then add your LayerDrawable as a background of your viewpager.

    3) in onCreate method set alpha of each layer correctly so just upper one has alpha value of 255.

    4) set for each view of your FragmentStatPagerAdapter a tag that corresponds to drawable index that you declared in the LayerDrawable. for example when you open the app FragmentA is showing so its tag must correspond to upper drawable that is 2 (beginning from 0). last page tag must be 0 corresponds to lowest drawable.

    5) change drawable of each view at the function transformPage

    6) for adding the button use RelativeLayout. In order to place buttons on top of all views use RelativeLayout. Later children are placing higher on the Z axis. You can see it in the code:

    now lets see code:

    MainActivity

    public class MainActivity extends FragmentActivity {
    
        ViewPager viewPager=null;
        int numberOfViewPagerChildren = 3;
        int lastIndexOfViewPagerChildren = numberOfViewPagerChildren - 1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            viewPager = (ViewPager) findViewById(R.id.pager);
            viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    
            final LayerDrawable background = (LayerDrawable) viewPager.getBackground();
    
            background.getDrawable(0).setAlpha(0); // this is the lowest drawable
            background.getDrawable(1).setAlpha(0);
            background.getDrawable(2).setAlpha(255); // this is the upper one 
    
            viewPager.setPageTransformer(true, new ViewPager.PageTransformer() {
                @Override
                public void transformPage(View view, float position) {
    
                    int index = (Integer) view.getTag();
                    Drawable currentDrawableInLayerDrawable;
                    currentDrawableInLayerDrawable = background.getDrawable(index);
    
                    if(position <= -1 || position >= 1) {
                        currentDrawableInLayerDrawable.setAlpha(0);
                    } else if( position == 0 ) {
                        currentDrawableInLayerDrawable.setAlpha(255);
                    } else { 
                        currentDrawableInLayerDrawable.setAlpha((int)(255 - Math.abs(position*255)));
                    }
    
                }
            });
    
    
            }
        class MyAdapter extends FragmentStatePagerAdapter
        {
    
            public MyAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int i) {
                Fragment fragment=null;
                if(i==0)
                {
                    fragment=new FragmentA();
                }
                if(i==1)
                {
                    fragment=new FragmentB();
                }
                if(i==2)
                {
                    fragment=new FragmentC();
                }
                return fragment;
            }
    
            @Override
            public int getCount() {
                return numberOfViewPagerChildren;
            }
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                if(object instanceof FragmentA){
                    view.setTag(2);
                }
                if(object instanceof FragmentB){
                    view.setTag(1);
                }
                if(object instanceof FragmentC){
                    view.setTag(0);
                }
                return super.isViewFromObject(view, object);
            }        
        }
    
    }
    

    activity_main.xml

    
    
        
        
    
        
    
            

    LayerDrawable

    
    
    
        
            
        
        
            
        
        
            
        
    
    
    

    for lazy people who just do not want to declare fragments:

    FragmentA

    public class FragmentA extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_a,container,false);
    
            return v;
        }
    }
    

    fragment_a.xml

    
    
    
    
        
              
    

提交回复
热议问题