像Pinterest或Tumblr一样向后滑动

问题描述 投票:40回答:10

没有人知道Pinterest或Tumblr如何在那里实现了“回扫”方法。

即在Pinterest上,您可以单击新闻源上的帖子。比DetailActivity启动,并显示所选帖子的详细信息。比您可以按“后退”按钮返回新闻源活动,或者您可以向左滑动(详细信息活动)以返回新闻源活动。

视频:http://youtu.be/eVcSCWetnTA

通常我会使用overridePendingTransition(),但是overridePendingTransition()会制作动画(资源ID如R.anim.foo)。仅当用户执行滑动手势时,Pinterest和Tumblr才会启动动画。根据手指的移动,它们还支持某种“逐帧动画”。因此,它们可以跟踪手指移动的距离并为过渡设置动画,使其达到相应的百分比值。

我知道如何使用带有FragmentTransaction的“真实Java” Animation / AnimatorSet对象来为片段替换设置动画。对于片段,我必须重写onCreateAnimator(),但是我不知道如何使用Activity实现类似的东西。活动是否有onCreateAnimator()(或类似内容)?也不确定如何滑动行为,因为它现在还没有启动动画,而是逐步改变了Window / Activity / Fragment或其他任何属性...

有什么建议吗?

编辑:我在youtube上找到了有关pinterest应用的视频:http://youtu.be/eVcSCWetnTA那就是我想要实现的。

我想Pinterest正在使用Fragments和onCreateAnimator()实现“向后滑动”。由于我的应用程序已在一个活动中包含Fragment和ChildFragments,因此如果可以为Activity实施它,对我来说将变得容易得多。

更多:我知道如何检测滑动手势,这不是我要的。观看youtube视频:http://youtu.be/eVcSCWetnTA


更新:我创建了一个小库,它的行为与Pinterest或Tumblrs实现不完全相同,但是对我的应用程序来说,这似乎是一个不错的解决方案:https://github.com/sockeqwe/SwipeBack?source=c

android swipe
10个回答
21
投票

[您似乎正在寻找的效果是android开发人员网站中ViewPager的示例之一。

检出http://developer.android.com/training/animation/screen-slide.html#depth-page,在深度页面转换器部分。它具有视频和源代码。

使用ViewPager.PageTransformer,您可以决定从一页切换到下一页时页面的表现。

样本和您链接到的视频之间的唯一区别是,左右似乎是倒置的,但是对于我在问题中链接的YouTube video上看到的内容,应该是一个很好的起点。这两个视图上的操作必须交换。如这段代码所示(mPager.setPageTransformer的第一个参数应为reverseDrawingOrder = false)。请注意,中间的两个if部分已交换,并且position变量的处理与开关端略有不同。弹性效果留作练习。请在分享时分享!

    package com.example.android.animationsdemo;

    import android.support.v4.view.ViewPager;
    import android.view.View;

    public class SinkPageTransformer implements ViewPager.PageTransformer {
            private static float MIN_SCALE = 0.75f;

            public void transformPage(View view, float position) {
                    int pageWidth = view.getWidth();

                    if (position < -1) { // [-Infinity,-1)
                            // This page is way off-screen to the left.
                            view.setAlpha(0);

                    } else if (position <= 0) { // [-1,0]
                            // Fade the page out.
                            view.setAlpha(1 + position);

                            // Counteract the default slide transition
                            view.setTranslationX(pageWidth * -position);

                            // Scale the page down (between MIN_SCALE and 1)
                            float scaleFactor = MIN_SCALE
                                            + (1 - MIN_SCALE) * (1 - Math.abs(position));
                            view.setScaleX(scaleFactor);
                            view.setScaleY(scaleFactor);

                    } else if (position <= 1) { // (0,1]
                            // Use the default slide transition when moving to the left page
                            view.setAlpha(1);
                            view.setTranslationX(0);
                            view.setScaleX(1);
                            view.setScaleY(1);

                    } else { // (1,+Infinity]
                            // This page is way off-screen to the right.
                            view.setAlpha(0);
                    }
            }
    }

并且以防万一,带有示例的页面不整洁,这是该部分的原始代码:

    public class DepthPageTransformer implements ViewPager.PageTransformer {
        private static float MIN_SCALE = 0.75f;

        public void transformPage(View view, float position) {
            int pageWidth = view.getWidth();

            if (position < -1) { // [-Infinity,-1)
                // This page is way off-screen to the left.
                view.setAlpha(0);

            } else if (position <= 0) { // [-1,0]
                // Use the default slide transition when moving to the left page
                view.setAlpha(1);
                view.setTranslationX(0);
                view.setScaleX(1);
                view.setScaleY(1);

            } else if (position <= 1) { // (0,1]
                // Fade the page out.
                view.setAlpha(1 - position);

                // Counteract the default slide transition
                view.setTranslationX(pageWidth * -position);

                // Scale the page down (between MIN_SCALE and 1)
                float scaleFactor = MIN_SCALE
                        + (1 - MIN_SCALE) * (1 - Math.abs(position));
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);

            } else { // (1,+Infinity]
                // This page is way off-screen to the right.
                view.setAlpha(0);
            }
        }
    }

0
投票

此库允许您像在iOS中一样打开片段并使用滑动将其关闭


8
投票

更新:解决了该项目的内存使用问题,并将幻灯片样式更改为iOS之类。

enter image description here

我编写了一个与Pinterest和tumblr完全一样的演示,您只需扩展BaseActivity并获得滑动效果,即可顺利工作!

检查此:https://github.com/chenjishi/SlideActivity

和屏幕截图:“在此处输入图像描述”>>


7
投票

[我发现了一个基于SwipeBack的GitHub项目,例如Pinterest。


3
投票

我能够在15分钟内完成此操作,对于开始来说还不错。如果您花一些时间,也许可以对其进行优化。


2
投票

我刚刚检查了层次结构查看器。似乎他们使用的是ViewPager和上一个活动的屏幕截图。


1
投票

我建议您执行以下操作:


1
投票

所以我想我自己找到了解决方案:


0
投票

我写了一个项目。它使您可以轻松开发通过Fragments导航的应用程序,其性能类似于Pinterest。


0
投票

我正在我当前正在研究的项目中处理这个问题,并提出了以下代码。也许它现在与您无关,但可以帮助本文中的新人。 :)

© www.soinside.com 2019 - 2024. All rights reserved.