【问题标题】:Swipe between activities like SnapChat?在 SnapChat 等活动之间滑动?
【发布时间】:2015-04-02 16:11:24
【问题描述】:

我正在开发一个具有多个活动的应用程序,我想像 snapchat 那样实现滑动(左、右、上、下)活动(不是片段)之间的转换。我做了一些研究,但我没有找到合适的方法。谁能建议我如何处理上述情况?谢谢。

【问题讨论】:

  • 我很确定 Snapchat 使用片段。
  • 使用带有片段的 ViewPager
  • 你尝试过什么方法? View Pager 可能是使用片段更简单的方法之一。
  • @KalelWade 我没有实现片段,但我想用活动来实现。
  • 我很确定你不能。不要使用Activities 使用Fragments。见这里:developer.android.com/training/animation/screen-slide.html.

标签: android android-activity snapchat


【解决方案1】:

我不相信您可以通过使用活动来获得同样流畅的滑动。 (有人随时纠正我)。您可以手动捕获滑动并加载下一个活动。您不会看到“预览”,这与单击按钮非常相似。

视图寻呼机提供的流畅性是由于碎片。同样(如果我没记错的话),一次只能向用户呈现一个活动。因此,您无法显示下一个活动的预览。片段解决了这个问题,因为你可以有多个片段。

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

因此,尽管我不想在您想使用活动时回避回答问题,但我不相信您将能够继续使用活动并获得所需的结果。与尝试使用活动自定义功能相比,您将更容易使用片段。

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

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

How to change activity with left-right swipe

更新: Android - 2 Activities active at the same time

想要验证您不能同时进行 2 项活动。因此,无论您必须将功能从单个活动中拆分出来才能做到这一点。尽管您“可以”在没有碎片的情况下做到这一点,但您最终会得到一个复杂的解决方案。我建议使用 Android 提供的并将其转换为片段。它非常简单。

【讨论】:

  • 我认为你是对的 Kalel,很抱歉我无法为你的答案投票,因为我缺乏声誉:(
  • @SanjuTalreja 谢谢,是的,我会推荐片段,除非你有特定的理由不使用它们。它们很容易设置。
  • 你能像 Snapchat 一样在 4 个方向(上、下、左、右)上使用 ViewPager,还是应该嵌套 2 个 ViewPagers?我读到嵌套它们是个坏主意
  • 此时,您最好自己处理手势并相应地处理行为。
【解决方案2】:

您可以通过 5 个布局将它们相互叠加来做到这一点...例如,仅使 1 个菜单可见 ..而不是当用户触摸右侧时,例如 layout_right 将弹出将尝试从右向左移动但只有当用户从右向左滑动布局时……layout_right 才会超过 menu_layout 的第一个布局……并且会开始淡入……如果用户想进入菜单就可以了从左到右滑动以进入菜单的第一个布局

一些例子:

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;
}

}

【讨论】:

  • 这个选项几乎是“模仿”片段,但没有视图寻呼机提供的效率。此外,不要绕过从单独的活动中提取代码。我仍然建议使用带有视图寻呼机的片段。
  • 他说的是activity之间的过渡(不是片段)
  • 您的选择不是活动之间的过渡。它是视图之间的过渡?视图不是活动。
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2021-08-06
  • 1970-01-01
  • 2013-08-18
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多