像 SnapChat 一样在活动之间切换?

4

我正在开发一个有多个活动的应用程序,并且想要实现类似于 Snapchat 的向左、向右、向上和向下的滑动转换,但这是在活动之间(而不是片段)进行的。我进行了一些研究,但没有找到合适的方法。有人能建议我如何处理上述情况吗?谢谢。


7
我很肯定Snapchat使用了碎片(fragment)。 - jyoonPro
3
使用ViewPager与片段(Fragments)配合。 - Blackbelt
2
你尝试了哪种方法?View Pager 可能是使用片段进行操作的更简单的方式之一。 - Kalel Wade
@KalelWade 我没有使用片段实现,但我想用活动来实现它。 - Sanju Talreja
我非常确定你做不到。不要使用“Activities”,而要使用“Fragments”。请参见此处:http://developer.android.com/training/animation/screen-slide.html。 - Jared Burrows
2个回答

14

我认为你无法使用活动获得相同的平滑滑动效果。(有人可以纠正我)。你可以手动捕获刷卡并加载下一个活动。您将看不到“预览”,它会非常类似于只是单击按钮。

视图页面提供的流畅性归功于片段。再次(如果我没有错),每次只能向用户显示一个活动。因此,您无法显示下一个活动的预览。片段解决了这个问题,因为您可以拥有多个片段。

我不确定您是否有强烈的理由不使用片段。它们非常简单直接,您或多或少仍然可以使用活动。每个活动都会有一个片段。

因此,虽然我不想回避问题,当您想使用活动时,但我不认为您将能够继续使用活动并获得所需的结果。使用片段比尝试使用活动自定义功能更容易。

http://developer.android.com/training/animation/screen-slide.html

http://developer.android.com/training/implementing-navigation/lateral.html

如何使用左右滑动更改活动

更新: Android-同时激活2个活动

想要验证您无法同时拥有2个活动。因此,无论如何,您都必须将功能从单个活动分割出来才能执行此操作。虽然您“可以”在没有片段的情况下执行此操作,但最终会得到一个复杂的解决方案。我建议使用Android提供的内容并将其转换为片段。它非常简单直接。


我认为你是正确的,Kalel,并且很抱歉我不能给你的答案投票,因为我的声望不够:( - Sanju Talreja
@SanjuTalreja 谢谢,是的,我会推荐使用片段,除非你有特定的原因不使用它们。它们很容易设置。 - Kalel Wade
你能像 Snapchat 一样在四个方向(上、下、左、右)使用 ViewPager 吗?还是应该嵌套两个 ViewPager?我读到过嵌套它们是一个坏主意。 - Alex Burdusel
在那时,你最好处理手势本身,并相应地处理行为。 - Kalel Wade

-1

你可以使用5个布局将它们叠放在一起...只显示其中一个,例如菜单...当用户触摸右侧时,例如layout_right将弹出并尝试从右向左移动,但仅当用户从右向左滑动布局时才会移动...然后layout_right将覆盖菜单布局的第一个布局...并开始淡入...如果用户想要返回菜单,则需要从左向右滑动以返回第一个布局即菜单

一些例子:

private void slide(final View v) {
    if (v.getLeft() != 0) {
        Animation toLeft = new TranslateAnimation(v.getRight() - 72, 0, 0, 0);
        toLeft.setDuration(animDuration);
        toLeft.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.clearAnimation();
                RelativeLayout.LayoutParams params = (LayoutParams) v
                        .getLayoutParams();
                params.leftMargin = 0;
                params.rightMargin = 0;
                v.setLayoutParams(params);
            }
        });
        v.startAnimation(toLeft);
    }
    else {
        Animation toRigh = new TranslateAnimation(0, -v.getWidth() - 72, 0, 0);
        toRigh.setDuration(animDuration);
        toRigh.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.clearAnimation();
                RelativeLayout.LayoutParams params = (LayoutParams) v
                        .getLayoutParams();
                params.leftMargin = (int) -(v.getWidth() - v.getWidth() * .15f);
                params.rightMargin = (int) (v.getWidth() * .85f);
                v.setLayoutParams(params);
            }
        });
        v.startAnimation(toRigh);
    }
}

private void slideBack(final View v) {
    if (v.getLeft() != 0) {
        Animation toLeft = new TranslateAnimation(-v.getLeft(), 0, 0, 0);
        toLeft.setDuration(animDuration + 100);
        toLeft.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.clearAnimation();
                RelativeLayout.LayoutParams params = (LayoutParams) v
                        .getLayoutParams();
                params.leftMargin = 0;
                params.rightMargin = 0;
                v.setLayoutParams(params);
            }
        });
        v.startAnimation(toLeft);
    }
}


@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        xPos = (int) event.getX();
    }

    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        RelativeLayout.LayoutParams params = (LayoutParams) v.getLayoutParams();
        if (params.rightMargin + 1 > 0) {
            params.leftMargin = (int) (event.getRawX() - xPos);
            params.rightMargin = (int) (-event.getRawX() + xPos);
            v.setLayoutParams(params);
        }
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        RelativeLayout.LayoutParams params = (LayoutParams) v.getLayoutParams();
        if (params.rightMargin < v.getWidth() / 2) {
            params.leftMargin = 0;
            params.rightMargin = 0;
        }
        else {
            params.leftMargin = (int) -(v.getWidth() - v.getWidth() * .15f);
            params.rightMargin = (int) (v.getWidth() * .85f);
        }

        v.setLayoutParams(params);
    }
    return true;
}

}


这个选项基本上“模拟”了片段,但没有视图分页器提供的效率。而且,它不能避免从不同活动中提取代码。我仍然建议使用带有视图分页器的片段。 - Kalel Wade
1
活动之间的转换(不是片段),这就是他说的。 - dodo
你的选项不是在活动之间进行转换,而是在视图之间进行转换?视图并不是活动。 - Kalel Wade

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