2

我有以下观点:显示 3 个片段的 ViewPager。用户可以水平滚动查看 ViewPager 中的其他 Fragment。我需要创建一个动画,当创建 Activity 并填充 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);
    }
}

布局

4

3 回答 3

1

好的,我找到了解决方案。我只需要扩展 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);
    }

}
于 2013-08-30T12:24:16.390 回答
0

这是一个可能对您有所帮助的链接:

缩小页面转换器

于 2013-08-30T09:22:09.227 回答
0

它类似于公认的解决方案,但使用相同的插值器,并且仅根据一个因素更改持续时间。您需要在 XML 中使用 ViewPagerCustomDuration 而不是 ViewPager,然后您可以这样做:

ViewPagerCustomDuration vp = (ViewPagerCustomDuration) findViewById(R.id.myPager);
vp.setScrollDurationFactor(2); // make the animation twice as slow
于 2013-08-30T09:31:03.473 回答