1

だから私は「磁気詩」タイプのアプリケーションを作ろうとしています。ユーザーは、画面上のさまざまなボタン ウィジェットを移動します。ボタン ウィジェットは磁石の外観に最も近いため、使用していますが、他のオプションも使用できます。

オブジェクトが指で正しく動かない。それらは近くにありますが、私の指と完全に一致していません。携帯電話の X 座標は問題ないようですが、Y 座標がずれています。これはおそらくタイトルバーが原因ですか?

private final static int DRAGGING_OFF = 0;
private final static int DRAGGING_ON = 1;

private int dragStatus;

private GestureDetector mGestureDetector; 
private int mOffsetX;
private int mOffsetY;
private LayoutParams mOldParams;
private RelativeLayout.LayoutParams lp;

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(!mGestureDetector.onTouchEvent(event)) {
        if(event.getAction() == MotionEvent.ACTION_MOVE) {
            if(dragStatus == DRAGGING_ON) {
                Log.e(VIEW_LOG_TAG, "Dragging! RAW -- " + event.getRawX() + " : " + event.getRawY() + " NOT RAW -- " + event.getX() + " : " + event.getY());
                int rawX, rawY;
                int finalX, finalY;

                rawX = (int) event.getRawX();
                rawY = (int) event.getRawY();

                finalX = rawX - mOffsetX;
                finalY = rawY - mOffsetY;

                lp.setMargins(finalX, finalY, 0, 0);
                this.setLayoutParams(lp);
            }

            return true;
        } else if(event.getAction() == MotionEvent.ACTION_UP) {
            if(dragStatus == DRAGGING_ON) {
                dragStatus = DRAGGING_OFF;
                Log.e(VIEW_LOG_TAG, "Stopped dragging!");
            }

            return true;
        } else {
            return super.onTouchEvent(event);
        }
    } else {
        return true;
    }
}

private final GestureDetector.SimpleOnGestureListener mListener = new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onDown(MotionEvent e) {          
        int[] location = new int[2];
        Log.e(VIEW_LOG_TAG, "Down! RAW -- " + e.getRawX() + " : " + e.getRawY() + " NOT RAW -- " + e.getX() + " : " + e.getY());
        dragStatus = DRAGGING_ON;

        // Sets the current location of the View in the int[] passed to it; x then y.
        getLocationInWindow(location);
        Log.e(VIEW_LOG_TAG, "Down location: " + location[0] + " " + location[1]);

        mOffsetX = (int) e.getRawX() - location[0];
        mOffsetY = (int) e.getRawY() - location[1];
        mOldParams = getLayoutParams();

        return true;
    }
};
4

1 に答える 1

0

問題は、現在のタッチ ポイント Y とキャッシュされた最後のタッチ ポイント y の DELTA を取得していないことだと思います。次のようなものが必要です。

@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final TextView textView = (TextView) findViewById(R.id.text);
        final ImageView image = (ImageView) findViewById(R.id.image);
        matrix.setTranslate(1f, 1f);
        image.setImageMatrix(matrix);
        image.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                matrix.getValues(m); //copy matrix values into array

                PointF currentXYTouchPoint = new PointF(event.getX(), event.getY());

                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN: //start of pressed gesture
                        lastXYTouchPoint.set(event.getX(), event.getY()); //save the last touchpoint
                        mode = DRAG;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //calculate the change in finger position
                        float deltaX = currentXYTouchPoint.x - lastXYTouchPoint.x;
                        float deltaY = currentXYTouchPoint.y - lastXYTouchPoint.y;
                        matrix.postTranslate(deltaX, deltaY); //move the entire image by the deltas
                        image.setImageMatrix(matrix);

                        // save this last starting touchpoint
                        lastXYTouchPoint.set(currentXYTouchPoint.x, currentXYTouchPoint.y);
                        break;
                }

                textView.setText("TouchPoint started at " + currentXYTouchPoint.x + ", " + currentXYTouchPoint.y + " & the matrix is now " + Arrays.toString(m));
                return true;
            }
        });

    }

独自の目的に合わせて調整しますが、基本的な考え方はそこにあります。

于 2012-07-12T18:38:52.090 に答える