-1

画像ビューを作成し、OnTouchListener. 動きを画面の境界に制限するにはどうすればよいですか?

4

4 に答える 4

1

ここで見つけたコードに基づいて、同様のことを行いました: DragView Example

これは、Google のランチャー コードに基づいています。画面上のビューを維持するために、onTouchEvent メソッドを変更して、画面上のビューを維持しました。

public boolean onTouchEvent(MotionEvent ev) {
    if (!mDragging) {
        return false;
    }
    final int action = ev.getAction();
    final int screenX = clamp((int)ev.getRawX(), 0, mDisplayMetrics.widthPixels);
    final int screenY = clamp((int)ev.getRawY(), 0, mDisplayMetrics.heightPixels);
    //**ADDED to keep view entirely on screen
    final int[] parentpos = {-1,-1};
    ((View) mDragSource).getLocationOnScreen(parentpos);
    int minScreenX = parentpos[0] + (int)mTouchOffsetX;
    int minScreenY = parentpos[1] + (int)mTouchOffsetY;
    int maxScreenX = minScreenX + ((View) mDragSource).getWidth() - mDragView.getWidth();
    int maxScreenY = minScreenY + ((View) mDragSource).getHeight() - mDragView.getHeight();
    //end ADDED

そしてここ

    case MotionEvent.ACTION_MOVE:
        // Update the drag view.  Don't use the clamped pos here so the dragging looks
        // like it goes off screen a little, intead of bumping up against the edge.
        // **CHANGED to keep view entirely on screen
        mDragView.move(clamp(screenX,minScreenX,maxScreenX), 
                clamp(screenY,minScreenY,maxScreenY));
        // end CHANGED

そしてここ

    case MotionEvent.ACTION_UP:
        if (mDragging) {
            // **CHANGED to keep view entirely on screen
            drop(clamp(screenX,minScreenX,maxScreenX), 
                    clamp(screenY,minScreenY,maxScreenY));
            //end CHANGED
        }
        endDrag();
于 2012-04-12T05:44:57.290 に答える
0

画面サイズを計算し、画面内の画像の動きを次のように修正できます

Display display = getWindowManager().getDefaultDisplay();
            width = display.getWidth();
            height = display.getHeight();
于 2012-04-12T04:59:36.750 に答える
0

あなたはしたくないOnTouchListener、あなたがしたいOnDragListenerDragEventビューの場所に関する情報を取得するには、さまざまなアクション タイプを探します。そこから、 の寸法を知っている限りView、画面外への移動を禁止できます。

于 2012-04-12T05:06:16.820 に答える