如何从另一个页面控制viewPages页面

时间:2014-09-20 07:46:32

标签: android animation android-fragments android-listview android-viewpager

我有一个ViewPager,每页3页,listView。 我希望动画listView的方式是,当用户水平滑动下一页时,listView的项目应根据下一页的宽度进行。

即第一项应该完全推入,第二项应该是可见的一半,口渴应该是可见的一半,以此类推。

这种类型的动画已经在mi3 xiamo中用于联系人列表。

enter image description here

在上面的图片中,我正朝着正确的方向滑动。请注意“最近的”#39;列出项目可见性。

如果有人可以帮我做这个动画,那将是一个很好的帮助。请根据ListView中的页面更改分享ViewPager动画上的一些链接或提示。

2 个答案:

答案 0 :(得分:3)

你有没有研究过用作ViewPager滑动监听器的OnPageChangeListener.onPageScrolled(int position, float positionOffset)方法?您可以使用 positionOffset 的值执行某项操作,其值为0到1或反转的百分比值,通知我们显示的页面正在显示多少,处理"最近的电话"按该值列出项目,在getView()方法中设置它们的left - 轴。

------------------ 2014-10-03更新1 ------------------

我一直试图达到这个效果,但是我不能在这段时间内完成动画制作。我已经让ListView了解了滑动偏移(delta)并为我们的项目尽我所能,它看起来将关闭我们想要的效果。但是非常复杂的部分是我们必须弄清楚如何兼容手指的滑动或甩动以及通过方法直接切换。

我尝试了三天寻求ViewPager的规则,检查ViewPager和ListView的来源,但是没有从正面回来。所以我将project推送到GitHub。

------------------ 2014-10-04更新2 ------------------

以下GIF会完全解释动画。

gif

------------------ 2014-10-07更新3 ------------------

好吧,似乎我没能完全重现这个动画。为了成为一个有价值的结局,我至少让我的项目工作,也尽力接近原来的效果。检查我的第一个更新GitHub项目以完成整个工作..

答案 1 :(得分:1)

您应该使用PageTransformer在滑动时将转化应用于ViewPager的每个页面。 Android Developer Training中介绍了基础知识。

下面是一些以非常简单的方式实现您需要的代码:

public class SwipeAnimationActivity extends Activity {

    private static final String[] COUNTRIES = new String[]{
            "Belgium", "France", "Italy", "Germany", "Spain",
            "Austria", "Russia", "Poland", "Croatia", "Greece",
            "Ukraine",
    };

    private ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_swipe_animation);
        viewPager = (ViewPager) findViewById(R.id.view_pager);
        viewPager.setAdapter(createPagerAdapter());
        viewPager.setPageTransformer(false, createPageTransformer());
    }

    private FragmentPagerAdapter createPagerAdapter() {
        return new FragmentPagerAdapter(getFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                ListFragment listFragment = new ListFragment();
                listFragment.setListAdapter(createListAdapter());
                return listFragment;
            }

            @Override
            public int getCount() {
                return 3;
            }
        };
    }

    private ArrayAdapter<String> createListAdapter() {
        return new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, COUNTRIES);
    }

    private ViewPager.PageTransformer createPageTransformer() {
        return new ViewPager.PageTransformer() {
            @Override
            public void transformPage(View page, float position) {
                ListView listView = (ListView) page.findViewById(android.R.id.list);
                int childCount = listView.getChildCount();
                float offset = .5f * listView.getWidth();
                for (int i = 0; i < childCount; i++) {
                    View childView = listView.getChildAt(i);
                    childView.setTranslationX(i * offset * position);
                }
            }
        };
    }

}

您可以轻松调整transformPage(View page, float position)以达到所需的效果(可能使用插值器来强制执行某种动画缓动)。