三个视图之间的类似ViewPager的动画

时间:2013-07-25 20:11:30

标签: android android-viewpager

我正在开发一个专门的电子书应用程序,其中一个要求是它应该一次只显示一页文本,格式化和不显示。这被证明比我想象的更具挑战性,但我终于成功地做到了。

然而,现在我遇到了另一个问题,即客户希望能够在页面之间来回切换,ViewPager风格,页面跟随手指。现在,这些书籍和经文中的页数不是预先确定的,因为我每次加载章节时都会动态计算,以便视图自动处理文本大小的变化等。

我一直在研究各种形式的“无限制的ViewPager-flipping”,但到目前为止,我还没有找到一个似乎适用于我的目的。

我一直在考虑,我希望有人可以帮助我,是这样的:

  • 三页,有点。当前正在观看的那个,以及每一个用于翻转的一个。
  • 当用户翻到新页面时,视图将在幕后切换位置,以便新页面成为中间的页面,并加载下一页,同时将先前查看的页面移动到另一端。
  • 如果动画(包括手势跟随)可以通过其他方式实现,则技术上不一定是ViewPager。

我会为此提供额外的声望点,因为我真的很想快速解决这个问题,但不幸的是我还没有设法获得很多这些。

2 个答案:

答案 0 :(得分:0)

有一些很好的方法可以向ViewPager添加动画,也可以使用自己的自定义视图。第一个是由jfeinstein10开发的名为JazzyViewPager的开源项目 这个库非常好,并且内置了一些动画。我已经查看了过去的源代码,如果需要,创建自己的动画应该很简单。 第二个选项是使用JazzyViewPager中使用的内容,即ViewHelper,这是Jake Wharton在NineOldAndroids动画库中的一个类。

答案 1 :(得分:0)

当您想使用ViewPager解决问题时,您需要在onCreate方法中使用此方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPager = (ViewPager) findViewById(R.id.pager);
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();

    // Capture ViewPager page swipes
    ViewPager.SimpleOnPageChangeListener ViewPagerListener = new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);

            if (fistswitch) {
                mPager.setCurrentItem(1);
                fistswitch = false;
            } else {
                // here you can use the replace method, to switch the
                // fragment behind the scenes
                ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
                Collections.addAll(fragmentList, new Fr2(), new Fr3(), new Fr4());

                mPagerAdapter.addFragments(fragmentList);
                // after the first switch you can use the the second page
                // continuously as middle
                mPager.setCurrentItem(1);
            }
        }
    };
    mPager.setOnPageChangeListener(ViewPagerListener);
    mPagerAdapter = new ViewPagerAdapter(fm);
    mPager.setAdapter(mPagerAdapter);
    ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
    Collections.addAll(fragmentList, new Fr1(), new Fr2(), new Fr3());

    mPagerAdapter.addFragments(fragmentList);

}

寻呼机适配器类可以是您活动中的私有类,如下所示:

private class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragmentList = new ArrayList<Fragment>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public void addFragments(List<Fragment> fragments) {
        fragmentList.clear();
        fragmentList.addAll(fragments);
        notifyDataSetChanged();
    }

    public void replaceFragment(int position, Fragment fr) {
        fragmentList.remove(position);
        fragmentList.add(position, fr);
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object) {
        if (fragmentList.contains(object)) {
            return POSITION_UNCHANGED;
        }
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int item) {
        if (item >= fragmentList.size()) {
            return null;
        }
        return fragmentList.get(item);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

我没有测试过代码,但在类似的情况下它对我有用。