2

我有以下视图:显示3片段的ViewPager。用户可以滚动horizo​​ntaly查看ViewPager中的其他片段。 我需要创建一个动画,创建活动并填充ViewPager时,显示从屏幕右侧进入的碎片。 这甚至可能吗?谢谢。在ViewPager中输入动画

XML:

<android.support.v4.view.ViewPager 
    android:id="@+id/devices" 
    android:layout_width="wrap_content" 
    android:layout_height="150dp" /> 

活动:

MyFragmentStatePagerAdapter mAdapter = new MyFragmentStatePagerAdapter(this.getSupportFragmentManager(), fragmentArrayList); 
mAdapter.setPageWidth(0.33333333f); 
ViewPager devices = (ViewPager) view.findViewById(R.id.devices); 
devices.setAdapter(sensorAdapter); 

适配器:

public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter { 
    ArrayList<Fragment> fragmentsList; 

    private float pageWidth = 1; 
    public void setPageWidth(float pageWidth) { this.pageWidth = pageWidth; } 

    public MyFragmentStatePagerAdapter(FragmentManager fm, ArrayList<Fragment> fragmentsList) { 
     super(fm); 
     this.fragmentsList = fragmentsList; 
    } 
    @Override 
    public int getCount() { 
     return fragmentsList.size(); 
    }  
    @Override 
    public Fragment getItem(int position) { 
     if (position<fragmentsList.size() & fragmentsList.get(position)!=null) { 
      return fragmentsList.get(position); 
     } 
     return null; 
    } 
    @Override 
    public float getPageWidth(int position) { 
     return(pageWidth); 
    } 
} 

Layout

回答

0

OK,我找到了解决办法。我只需要扩展ViewPager并在onDraw中执行动画。
此代码工作,我需要:

public class ViewPagerCustom extends ViewPager { 

    private Context mContext; 
    private boolean startAnimationDone = false; 

    public ViewPagerCustom(Context context) { 
     super(context); 
     mContext = context; 
     init(); 
    } 

    public ViewPagerCustom(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     init(); 
    } 

    DisplayMetrics metrics; 
    TranslateAnimation anim; 
    private void init() { 
     metrics = mContext.getResources().getDisplayMetrics(); 
     anim = new TranslateAnimation(metrics.widthPixels+200, 0, 0, 0); 
     anim.setInterpolator(new DecelerateInterpolator()); 
     anim.setDuration(500); 
    } 

    private Canvas enterAnimation(Canvas c) { 
     startAnimationDone = true; 
     final int childCount = getChildCount(); 
     for (int i = 0; i < childCount; i++) { 
      final View child = getChildAt(i); 
      child.startAnimation(anim); 
     } 
     return c; 
    } 

    @Override 
    protected void onDraw(Canvas c) { 
     if (startAnimationDone==false) { 
      c = enterAnimation(c); 
     } 
     super.onDraw(c); 
    } 

} 
0

它类似于接受的解决方案,但使用相同的内插,只改变基于一个因素的持续时间。你需要在你的XML,而不是ViewPager使用ViewPagerCustomDuration,然后你可以这样做:

ViewPagerCustomDuration vp = (ViewPagerCustomDuration) findViewById(R.id.myPager); 
vp.setScrollDurationFactor(2); // make the animation twice as slow