0

画面上でビューをドラッグできる OnTouchListener を作成しました。1 つの問題を除いて、これはうまく機能します。

親を離れる代わりにビューのサイズが変更されます。それらは RelativeLayout にあり、これが問題の原因であると思われます。RelativeLayout の右または下の境界に触れたときにのみサイズが変更されます。

この問題に対する簡単な解決策 (理想的には RelativeLayout のサイズ変更を伴わないもの) があることを願っていますが、まだ解決策を見つけていません。

理想的には、この OnTouchListener を TextView と ImageView に使用するため、このソリューションはすべてのビューに適用できます。XML ソリューションを見つけたいと思っていました。他の人がこの問題に対処したと思いますか??

PS: これを投稿する前に.. RelativeLayout の境界にヒットするためのフラグがあると信じていることを思い出したので、それが発生したときに TextView に負のマージンを適用できるかもしれません。考え?

編集

これが私のOnTouchListenerです:

// Dragging functionality for all views and double tap to remove
// functionality for ImageViews
final OnTouchListener onTouchListener = new OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        v.bringToFront(); 

        //if(v instanceof android.widget.ImageView) 
            //mScaleDetector.onTouchEvent(event);

        layoutParams = (LayoutParams) v.getLayoutParams();

        switch (event.getActionMasked())
        {
        case MotionEvent.ACTION_DOWN:
            // Where the user started the drag
            pressed_x = (int) event.getRawX();
            pressed_y = (int) event.getRawY();

            if (v instanceof android.widget.ImageView)
            {
                curTime = System.currentTimeMillis();
                if(curTime - prevTime <= DOUBLE_TAP_INTERVAL)
                {
                    v.setVisibility(View.GONE);
                }
                prevTime = curTime;
            }
        case MotionEvent.ACTION_MOVE:
            // Where the user's finger is during the drag
            final int x = (int) event.getRawX();
            final int y = (int) event.getRawY();

            // Calculate change in x and change in y
            dx = x - pressed_x;
            dy = y - pressed_y;

            // Update the margins
            layoutParams.leftMargin += dx;
            layoutParams.topMargin += dy;
            v.setLayoutParams(layoutParams);

            // Save where the user's finger was for the next ACTION_MOVE
            pressed_x = x;
            pressed_y = y;
            break;
        default:
            break;
        }
        return true;
    }
}
4

0 に答える 0