1

そのため、ユーザーが指でドラッグできるようにするカスタムビューウィジェットがあります。RelativeLayout を含む FrameLayout (コードはこちら: http://blog.gorges.us/2010/06/android-two-dimensional-scrollview/ ) に基づくカスタム スクロール ビューにドラッグして、配置できるようにします。必要な場所に配置し、画面に表示されていない十分なスペースを確保して、アイテムを配置することもできます。

私がしたいのは、ユーザーがウィジェットを可視スクロール領域の端近くに移動している場合、ユーザーが手放すまで領域を適切な方向にスクロールすることです (ACTION_UP、この場合、それ以上のイベントは発生しません)または端から離れました。現在、コードには 2 つの問題があります。

1) 携帯電話 (T-Mobile G2) は、Nexus 7 タブレットが移動するまでトリガーし続けないため、指がまだどこにある場合でも ACTION_MOVE をトリガーし続けます。ACTION_UP まで、このイベントを確実にトリガーし続ける必要があります。

2) 領域がスクロールしますが、画面の端に向かって指を動かしたときだけです。言い換えれば、オブジェクトが端に近づいたときに、静止している指でオブジェクトをスクロールして移動し続けたいのですが、これは起こっていません。

私は何が欠けていますか?ウィジェットの移動を処理する onTouchEvent は次のとおりです。

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE
            && this.getParent() != null) {
        getParent().requestDisallowInterceptTouchEvent(true);
    }

    // mScrollParent gets set in a setter and points to the TwoDScrollView
    // mOffsetX/Y is based on where the user touches versus the position of the custom view
    // mWidth/mHeight gets set once in the GestureDetector based on the custom view's getWidth()/getHeight()
    // mTitleBarHeight gets set once in the GestureDetctor onDown event
    // lp is a ViewGroup.LayoutParams type
    if (!mGestureDetector.onTouchEvent(event)) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            int finalX = (int) (event.getRawX() - mOffsetX);
            int finalY = (int) (event.getRawY() - mOffsetY - (mTitleBarHeight > 0 ? mTitleBarHeight * 2
                    : 0));

            if (finalX < 0 || finalY < 0)
                return false;

            int scrollLeft = (int) Math.ceil(mScrollParent.getScrollX() * 1.05);
            int scrollTop = (int) Math.ceil(mScrollParent.getScrollY() * 1.05);
            int scrollRight = (int) Math.floor((scrollLeft + mScrollParent.getRight()) * 0.95);
            int scrollBottom = (int) Math.floor((scrollTop + mScrollParent.getBottom()) * 0.95);
            int scrollX = 0;
            int scrollY = 0;

            if (scrollLeft > finalX)
                scrollX = finalX - scrollLeft;

            if (scrollRight < (finalX + mWidth))
                scrollX = (finalX + mWidth)- scrollRight;

            if (scrollTop > finalY)
                scrollY = finalY - scrollTop;

            if (scrollBottom < (finalY + mHeight))
                scrollY = (finalY + mHeight) - scrollBottom;

            if (scrollX != 0 || scrollY != 0)
                mScrollParent.scrollBy(scrollX * 4, scrollY * 4);

            lp.setMargins(finalX + scrollX, finalY + scrollY, 0, 0);
            setLayoutParams(lp);

            return true;
        }
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
            return true;
        } else {
            return super.onTouchEvent(event);
        }
    } else {
        return true;
    }
}
4

0 に答える 0