我正在开发一个专门的电子书应用程序,其中一个要求是它应该一次只显示一页文本,格式化和不显示。这被证明比我想象的更具挑战性,但我终于成功地做到了。
然而,现在我遇到了另一个问题,即客户希望能够在页面之间来回切换,ViewPager风格,页面跟随手指。现在,这些书籍和经文中的页数不是预先确定的,因为我每次加载章节时都会动态计算,以便视图自动处理文本大小的变化等。
我一直在研究各种形式的“无限制的ViewPager-flipping”,但到目前为止,我还没有找到一个似乎适用于我的目的。
我一直在考虑,我希望有人可以帮助我,是这样的:
我会为此提供额外的声望点,因为我真的很想快速解决这个问题,但不幸的是我还没有设法获得很多这些。
答案 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();
}
}
我没有测试过代码,但在类似的情况下它对我有用。