2

私は 4 方向スワイプ ナビゲーションを実装しようとしています。また、どうやって組み立てるのか、いくつか質問があります。

  1. フラグメントの使用を考えています。それは運動しますか?
  2. もう 1 つのアイデアは、大きな相対レイアウトを作成し、図に示すようにビューを配置することです。ただし、デバイスのポートレート/ランドスケープを回転させるときに問題が発生する可能性があります。
  3. どういうわけかスワイプ効果をエミュレートする

これらすべてのポイントはどのように機能しますか? 誰でもそれを手伝ってもらえますか。TouchMove私はすでに機能に関する質問を見つけました

  1. タッチの動きは四方向だけ?
  2. グリッド レイアウトでの Fling ジェスチャ検出
  3. https://github.com/JakeWharton/Android-DirectionalViewPager/

アドバイスや助けをいただければ幸いです。その理由は、私がAndroid開発に比較的慣れていないためです。

ここに画像の説明を入力

4

3 に答える 3

4

それほど難しい作業ではありません。Scroller のおかげで、ほとんど簡単なケーキです

ボタンなどのインタラクティブなビューを配置したい場合 (きっとそうするでしょう)、onInterceptTouchEvent(MotionEvent ev) をオーバーライドする必要があります。

public class FourDirectionLayout extends ViewGroup {
    private GestureDetector mDetector;
    private Scroller mScroller;
    private final String[] TEXTS = {
            "left view, left swipe only",
            "right view, right swipe only",
            "top view, top swipe only",
            "bottom view, bottom swipe only",
            "central view, swipe to the left, right, top or bottom",
    };
    private final int[] COLORS = {
            0xaa0000ff, 0xaa0000ff, 0xaaff0000, 0xaaff0000, 0xaa00ff00
    };
    private final int[] PACKED_OFFSETS = {
            -1, 0, 1, 0, 0, -1, 0, 1, 0, 0
    };

    public FourDirectionLayout(Context context) {
        super(context);
        for (int i = 0; i < TEXTS.length; i++) {
            TextView tv = new TextView(context);
            tv.setTag(i);
            tv.setTextSize(32);
            tv.setTypeface(Typeface.DEFAULT_BOLD);
            tv.setTextColor(0xffeeeeee);
            tv.setText(TEXTS[i]);
            tv.setBackgroundColor(COLORS[i]);
            addView(tv);
        }
        mDetector = new GestureDetector(context, mListener);
        mScroller = new Scroller(context);
    }

    private OnGestureListener mListener = new SimpleOnGestureListener() {
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if (!mScroller.isFinished()) {
                return false;
            }
            int sx = getScrollX();
            int sy = getScrollY();
            int w = getWidth();
            int h = getHeight();
            int DURATION = 500;
            // check if horizontal/vertical fling
            if (Math.abs(velocityX) > Math.abs(velocityY)) {
                if (sy != 0 || velocityX * sx < 0) {
                    return false;
                }
//                DURATION = (int) (1000 * w / Math.abs(velocityX));
                int distance = velocityX < 0? w : -w;
                mScroller.startScroll(sx, sy, distance, 0, DURATION);
            } else {
                if (sx != 0 || velocityY * sy < 0) {
                    return false;
                }
//                DURATION = (int) (1000 * h / Math.abs(velocityY));
                int distance = velocityY < 0? h : -h;
                mScroller.startScroll(sx, sy, 0, distance, DURATION);
            }
            invalidate();
            return true;
        }
    };

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            invalidate();
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return true;
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int cnt = getChildCount();
        for (int i = 0; i < cnt ; i++) {
            View child = getChildAt(i);
            int idx = (Integer) child.getTag() << 1;
            int xOffset = (r - l) * PACKED_OFFSETS[idx];
            int yOffset = (b - t) * PACKED_OFFSETS[idx + 1];
            child.layout(l + xOffset, t + yOffset, r + xOffset, b + yOffset);
        }
    }
}

それをテストするには、これを Activity.onCreate に追加します。

ViewGroup layout = new FourDirectionLayout(this);
setContentView(layout);
于 2013-10-09T13:03:10.870 に答える
1

私が考えることができる最も近いものは、Google マップと、ユーザーがマップをナビゲート (スクロール、フリング、ワイプ) できるようにする方法です。

低速のネットワークでスクロールすると、4x5 グリッドで動作しているように見えます。つまり、グリッド上に配置された 20 個の単一画像です。そして、おそらく画面外の各方向にもう 1 つ。

次の 2 つのことを行う必要があります。

  • 検出するタッチイベントを取得し、ユーザーがどの位置で何を見たいかを調べます。

  • コンテンツをグリッドに配置します。グリッドは、FrameLayout の ImageView として、または SurfaceView の Bitmap として構築できます。後者を使用すると、描画と配置をより細かく制御できます。最初にテキスト、ボタンなどを配置する方が簡単です。表示したいものに応じて、これらのアプローチのいずれかを使用できます。

于 2013-10-09T10:35:08.187 に答える