我正在开发一个有多个活动的应用程序,我想实现滑动(左,右,上,下)活动之间的转换(不是碎片)像Snapchat一样。我做了一些研究,但我找不到合适的任何人都建议我如何处理上述情况?谢谢。
答案 0 :(得分:14)
我不相信你可以通过使用活动获得同样顺利的滑动。 (有人可以随意纠正我)。您可以手动捕获滑动并加载下一个活动。你不会看到预览'它与单击按钮非常相似。
视图寻呼机提供的平滑性是由于碎片造成的。再次(如果我没有记错的话),一次只能向用户呈现一个活动。因此,您无法显示下一个活动的预览。片段可以解决这个问题,因为你可以拥有多个片段。
我不确定你是否有充分理由不使用碎片。它们非常直接使用,您或多或少仍然可以使用活动。每个活动都有一个片段。
因此,虽然我不想在您想要使用活动时侧面回答问题,但我不相信您将能够继续使用活动并获得所需的结果。使用片段比使用活动自定义功能更容易。
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提供的内容并将其转换为片段。它很直接。
答案 1 :(得分:-1)
你可以用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;
}
}