私は複数のアクティビティを持つアプリケーションを開発しており、snapchat のようなアクティビティ間のスワイプ (左、右、上、下) 遷移 (フラグメントではない) を実装したいと考えています。いくつかの調査を行いましたが、適切なアプローチを見つけることができませんでした。誰かが上記の状況にどのようにアプローチできるかを提案しますか?ありがとう。
2 に答える
アクティビティを使って同じようにスムーズにスワイプできるとは思えません。(誰かが私を訂正してください)。スワイプを手動でキャプチャして、次のアクティビティをロードできます。「プレビュー」は表示されず、ボタンをクリックするのと非常によく似ています。
ビュー ページャーが提供する滑らかさは、フラグメントによるものです。繰り返しますが (私の間違いでなければ)、一度にユーザーに表示できるアクティビティは 1 つだけです。そのため、次のアクティビティのプレビューを表示できません。複数のフラグメントを持つことができるため、フラグメントはこれを回避します。
フラグメントを使用しない強い理由があるかどうかはわかりません。それらは非常に簡単に使用でき、多かれ少なかれアクティビティを引き続き使用できます。アクティビティごとにフラグメントがあります。
したがって、アクティビティを使用したいときに質問への回答を回避したくはありませんが、アクティビティを使用し続けて望ましい結果を得ることができるとは思いません. アクティビティで機能をカスタマイズするよりも、フラグメントを使用する方が簡単です。
http://developer.android.com/training/animation/screen-slide.html
http://developer.android.com/training/implementing-navigation/lateral.html
更新: Android - 同時にアクティブな 2 つのアクティビティ
同時に 2 つのアクティビティを実行できないことを確認したい。したがって、これを行うために機能を単一のアクティビティから分割する必要があるとしても. フラグメントなしでこれを行うことができますが、複雑なソリューションになります。Android が提供するものを使用してフラグメントに変換することをお勧めします。そのかなり簡単です。
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;
}
}