1

ボタンをドラッグ アンド ドロップしようとしていますが、モーション イベントで getX() を使用すると動作しますが、ボタンが震え始めます。メソッド getRawX() を呼び出すと、震えませんが、ドラッグ アンド ドロップを開始する直前に少なくとも 80px ジャンプします。

どうすればそれを管理できますか。コードをここに投稿します。

    public class MyButton extends Button {

private final static int START_DRAGGING = 0;
private final static int STOP_DRAGGING = 1;

private int status;
private LinearLayout parentLayout;

public MyButton(Context context) {
    super(context);

}

public MyButton(Context context, AttributeSet attrs) {
    super(context, attrs);

}

public MyButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

}

@Override
public boolean onTouchEvent(MotionEvent event) {


    // Log.i("teste", "Button width: " + btWidth + ", Height : "+ btHeight);

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        status = START_DRAGGING;
        Log.i("teste", "Coordenada on ACTION_DOWN: " + (int) event.getRawX());
        break;
    case MotionEvent.ACTION_UP:
        status = STOP_DRAGGING;
        Log.i("teste", "Coordenada on ACTION_UP: " + (int) event.getRawX());
        break;
    case MotionEvent.ACTION_MOVE:
        if(status == START_DRAGGING){
            parentLayout.setPadding((int)event.getRawX(), 0,0,0);
            parentLayout.invalidate();
            Log.i("teste", "Coordenada on ACTION_MOVE: " + (int) event.getRawX());
        }                           
        break;

    }

    return true;
}

}

4

2 に答える 2

3

event.getX()ビュー(ボタン)に相対的なタッチ座標を返し、ディスプレイに相対的なタッチ座標を返すので、レイアウトの代わりにボタンevent.getRawX()のパディングを設定する場合、最初の方法が正しいと思います。ただし、ボタンの端ではなくボタンに触れることになっているため、「ジャンプ」の問題が残ります。最初の動きで端が指の下に置かれます。

を使用してみGestureDetectorます。スクロール距離を提供OnGestureListenerするonScroll()メソッドがあります (最後の位置を記憶し、相対的な動きを与える仕事をします)。その値をパディングに追加できます。つまり、10px = をドラッグします。 > 10px のパディングを追加します。

コード例:

private GestureDetector gd =
            new GestureDetector(getContext(), new SimpleOnGestureListener() {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                            float distanceX, float distanceY) {
        setPadding((int)(getPaddingLeft()+distanceX),0,0,0);
    }
    @Override
    public boolean onDown(MotionEvent e) {
        return true; // else no event will be handled
    }

また、負のパディングまたは過剰なパディングを防ぐために、いくつかのチェックを追加します。

于 2011-02-07T17:38:18.983 に答える
2

私は物に触れたり動かしたりすることにも取り組んできました。上部と左側のパディングを変更するという、同様の方法で何かを動かし始めました。画面に可動オブジェクトを追加すると、すぐに少し混乱してしまいました。画面上の 1 つの場所に触れると、別の何かが動き始めます。何が起こっていたかというと、画面上に複数のビューが重なっているということでした。トップ ビューのみがタッチ イベントを受け取ります。

Android Launcher のコードを見て、ドラッグ アンド ドロップがどのように行われたかを確認することを提案する投稿を見つけました。彼らのアプローチは本当に良いと思います。可動オブジェクトを保持するために ViewGroup を追加する必要がありますが、それでうまくいきます。ビューの境界は画面に表示されるものと一致し、驚きはありません。イベントは期待どおりのビューに移動します。

移動可能なオブジェクトが複数あることが判明した場合は、私のブログ記事「Moving Views In Android」をご覧ください。Android Launcher とソース コードに関する詳細な説明があります。

于 2011-02-12T16:20:32.803 に答える