ViewPager页面翻页效果

5

简单的问题,是否有ViewPager.PageTransformer可以动画显示页面翻页效果?

我已经到处找了,但是我找不到它,也不知道如何自己实现它...

谢谢, Cédric


你能展示一些图片吗,这样我就可以在视图翻页器上提供精确的动画了吗? - Puneet Kumar
我也在寻找同样的解决方案,但仍未找到。如果您有,请分享。 - Kuldeep Sakhiya
1
@RishabhMaurya 我正在为此解决方案努力。这确实有点复杂,因为使用页面转换时,您只能操作视图;没有绘图画布可供使用。为了解决这个问题,我正在创建一个“PageCurlFrameLayout”,以便可以覆盖绘制函数并绘制页面翻页效果。您将不得不与页面转换器一起使用它。还涉及一些剪辑。给我几天时间,我会为您提供解决方案。 - kris larson
@krislarson 那太棒了 :) 我也尝试过,但很快发现只能通过一些简单的变换来操作视图,然后我觉得这不值得了。祝你解决方案好运! - Cédric
@krislarson 祝你好运! - Rishabh Maurya
显示剩余7条评论
1个回答

14

我认为 @Cédric 是正确的,这可能不值得。

所以我设法让它工作了,但是里面有很多丑陋的东西。

  • 软件架构中有些“胶带”修补。因为页面转换器只能在视图上工作,所以应用程序依赖于使用能够处理绘制页面翻页效果的自定义布局。因此变换器看起来像这样:

public static class PageCurlPageTransformer implements PageTransformer {

    @Override
    public void transformPage(View page, float position) {

        Log.d(TAG, "transformPage, position = " + position + ", page = " + page.getTag(R.id.viewpager));
        if (page instanceof PageCurl) {
            if (position > -1.0F && position < 1.0F) {
                // hold the page steady and let the views do the work
                page.setTranslationX(-position * page.getWidth());
            } else {
                page.setTranslationX(0.0F);
            }
            if (position <= 1.0F && position >= -1.0F) {
                ((PageCurl) page).setCurlFactor(position);
            }
        }
    }

  • 要获得逼真的翻页效果,您需要使用Canvas.clipPath。我在模拟器上测试时遇到了一些问题,无法将其剪裁到实际路径。我不得不在设备上测试才能看到clipPath正确地工作。即使关闭硬件加速在模拟器上也不起作用。这让我对此在所有设备上的外观感到缺乏信心。

  • 我只是在自定义布局中使用dispatchDraw绘制了翻卷的角落。那可能不是最好的地方。如果我有更多时间,我可能会在视图分页器中拥有一个特殊的装饰视图,并在那里绘制卷曲。

  • 您可能会注意到,反向翻页比正向翻页快。您可能不喜欢正向或反向的动画速度。太糟糕了-- ViewPager没有任何方法可以调整飞快的速度,所以您只能得到您所得到的。这是使用ViewPager进行此类操作的又一个限制。

  • 您可以将我的项目视为证明概念,即您确实可以使用视图分页器和页面变换器使页面翻转正常工作。希望这能为您提供在项目中实现它所需的内容。

    项目在这里:https://github.com/klarson2/PageCurlWithPageTransformer

    干杯


    感谢您的努力,但我希望它像相册一样。 - Rishabh Maurya
    仍然,这太棒了。 - Rishabh Maurya
    自定义页面翻页布局是一个FrameLayout,因此您可以在布局内显示任何您想要的片段。如果您想要,我可以添加一个显示图像的片段。 - kris larson
    谢谢,看起来它能工作,但没有效果,它是一种页面翻转,但只是简单地重叠文本,没有阴影、页面角等。Moritz的代码比你的更大,难道你的代码中漏掉了什么吗?似乎没有实现所有需要的功能。 - Acuna
    超级解决方案开发 - Kapil Rajput

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接