0

に基づいて、カスタム ビュー内で長押しを実装する際に問題が発生していHorizontalScrollViewます。

にはHorizontalScrollViewchildLinearLayoutがあり、これには子 View があります。ビューは、 を介してキャンバスにビットマップを描画しますOnDraw()

HorizontalScrollView高速または低速のいずれかで、正常にスクロールできるようにしたいと思います。ただし、ユーザーが画像の 1 つに (スクロールしていても) 指を置いたままにすると、すぐにスクロールがキャンセルされ、ユーザーは選択した画像で機能を実行できるようになります。(この特定のケースでは、画面上で画像を移動しますが、実際にはいくつもの機能を使用できます。)

HorizontalScrollView各レイヤー (および)内でイベント (true、false、super) を処理する多くの組み合わせを試しましたが、View100% 機能するものはありません。ほとんどの場合、いくつかの組み合わせは途中で到達しますが、それらには常に何らかの機能 (スクロール、ヒット テストなど) が欠けているように見えます。

私が得た最も近いものはHorizontalScrollView's onInterceptTouchEvent()、View のonTouch()イベント内で false を返し、true を返すことです。これにより、スクロールが可能になり、画像のヒット テストも登録されます。ただし、すぐに制御を の onTouch() イベントに戻しHorizontalScrollViewます。そのため、画像が何秒間押されたか (長押し) を確認することができなくなります。

ビューのonTouch()イベント内で true を返すと、ヒット テストが登録され、ユーザーが 内で画像を長押ししたかどうかを確認できますACTION_MOVE。しかし、その後はHorizontalScrollViewスクロールしません。

完全に明らかな何かが欠けているのでしょうか、それともうまく機能しない 2 つのビューを選択しただけなのでしょうか? どんな洞察も高く評価されます。

4

1 に答える 1

0

右、

あなたがこれを分類したかどうかわからない、私はあなたが求めることをするだろうと私が思ういくつかのビットを一緒にすりつぶした。

水平スクローラーに読み込まれるアクティビティがあります。これは最善の方法ではないかもしれませんが、私にとってはうまくいきます。

HolderActivityクラス(Horizo​​ntalScrollViewクラスにロードされるクラス)私は持っています:

int selectedItem;
public boolean onLongClick(View v, int position) {
    selectedItem = position;
    openContextMenu(v);
    return true;
}

public boolean onItemClick(int position) {)//do what you want here on click (press)


@Override
public void onCreateContextMenu(ContextMenu menu, View v,
    ContextMenuInfo menuInfo) {

     String[] menuItems = {"Menu item 1 text", "Cancel"};
     for (int i = 0; i<menuItems.length; i++) {
       menu.add(Menu.NONE, i, i, menuItemsRemove[i]);
    }
     menu.setHeaderTitle("My menu title");
}

あなたのHorizo​​ntalScrollViewクラスのコンストラクターパスで、私はその中のコンテキストを次のように渡します:

public MyScroller(Context context) {
    super(context);
    this.context = context;
}

次のように、setFeatureItemsという名前のArrayListからアイテムを作成するためのメソッドがあります。

public void setFeatureItems(ArrayList<MyListEntity> items){}

このメソッド内で、次のように各アイテムにコンテキストを渡すGestureDetectorを追加します。

mGestureDetector = new GestureDetector(context, new MyGestureDetector());

そして、すべての重要なparentActivityへの参照を持つMyGestureDetectorネストされたクラスは次のようになります。

class MyGestureDetector extends SimpleOnGestureListener {

        @Override
        public void onLongPress(MotionEvent arg0) {
            parentActivity.onLongClick(MyScroller.this, mActiveFeature);
        };

        @Override
        public boolean onSingleTapUp(MotionEvent arg0) {
            parentActivity.onItemClick(mActiveFeature);
            return true;
        };

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            try {
                //right to left
                if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    int featureWidth = getMeasuredWidth();
                    mActiveFeature = (mActiveFeature < (mItems.size() - 1))? mActiveFeature + 1:mItems.size() -1;
                    smoothScrollTo(mActiveFeature*featureWidth, 0);
                    return true;
                }
                //left to right
                else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                    int featureWidth = getMeasuredWidth();
                    mActiveFeature = (mActiveFeature > 0)? mActiveFeature - 1:0;
                    smoothScrollTo(mActiveFeature*featureWidth, 0);
                    return true;
                }
            } catch (Exception e) {
                    Log.e("Fling", "There was an error processing the Fling event:" + e.getMessage());
            }
            return false;
        }
}

私はこれを既存のプロジェクトから切り取ったので、十分に一般化していない残骸があるかもしれません。これが理にかなっているか、役立つことを願っています。さらに詳細を追加できるかどうか教えてください

于 2011-12-08T05:40:22.273 に答える