4

ビューがあり、指で動かしたい。xDelta と yDelta を取得し、ビューのマトリックスを変換したかっただけです (画像ビューではなく、任意のビュー、RelativeLayout など)。私はそれを行う方法を疑問に思っています:

  1. RelativeLayout の onDraw をオーバーライドし、そこに変換マトリックスを適用します。それは可能ですか?
  2. 私は現在、各 onTouch イベントにアニメーションを適用してそれを行っています。アニメーションの持続時間は 0 で、x/y の開始/終了は同じです (setFillAfter = true)。必要な場所にビューを配置するだけです。でもそれって高くないですか?

onDraw を介してビューのマトリックスを直接操作することはできませんか? 私はこのようなことを試しました:

@Override
protected void onDraw(Canvas canvas) {
    if (getDx() != 0 && getDy() != 0) {
        m = canvas.getMatrix();
        m.postTranslate(dx, dy);
        canvas.setMatrix(m);
    }
    super.onDraw(canvas);
}

しかし、私はそれを間違っているようです。

4

4 に答える 4

6

ドラッグ ジェスチャを実装する場合は、 onTouchListenerを使用し、そのMotionEvent.ACTION_MOVEで setPaddingを使用してパディングをそのビューに設定します。

サンプルコードは次のとおりです。

case MotionEvent.ACTION_MOVE:
    yourView.setPadding((int)event.getRawX(), (int)event.getRawY(), 0, 0);

onTouchListener のサンプル :-

OnTouchListener drag= new OnTouchListener() {

        @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch(event.getAction() & MotionEvent.ACTION_MASK){
           case MotionEvent.ACTION_DOWN:

            break;
           case MotionEvent.ACTION_POINTER_DOWN:

            break;
           case MotionEvent.ACTION_MOVE:
               img.setPadding((int)event.getRawX(), (int)event.getRawY(), 0, 0);
            break;
           case MotionEvent.ACTION_UP:
            break;
           case MotionEvent.ACTION_POINTER_UP:

            break;
           }        return true;
    }
};

実行時にドラッグ イメージを作成し、その位置を調整する必要があります。このサンプル コードでは、位置を調整していないため、ドラッグした画像がタッチの位置に作成されません。ドラッグする画像の高さと幅も考慮する必要があります。

それが役に立てば幸い !

于 2012-11-15T12:10:38.163 に答える
2

あなたの問題はあなたが思っていたよりも簡単だとは言いたくありませんが、次のようになります。

@Override
protected void onDraw(Canvas canvas) {
    if (getDx() != 0 && getDy() != 0) {
        canvas.translate(getDx(), getDy());
    }
    super.onDraw(canvas);
}

お役に立てれば!

于 2012-11-13T21:07:55.787 に答える
1

それを達成するのに役立ついくつかのこと:

  1. ビューには、使用する方向に十分なスペースがあることを確認してください。「match_parent」など

  2. GestureDetector.onSimpleGestureListener を使用してonDraw ( return true;) 、 onScrollをオーバーライドします-- onTouchEvent を使用して接続すると、距離を直接取得するか、event1とevent2を使用して自分で計算できます

  3. この情報を変数に格納し、invalidate()を呼び出します

  4. onDraw メソッドで - この情報をcanvas.translate(..use these variables..); で使用します。super.onDraw(キャンバス);

そしてあなたの意志は結果を達成します

PS: 描画は、左上を 0,0 として開始します。

于 2012-11-16T17:54:43.667 に答える
1

レイアウトを永続的に移動したい場合 (一時的な場合はアニメーションを使用できます)、Android 公式ページの Drag And Drop API を使用します。これがあなたを助けることを願っています

于 2012-11-16T06:20:07.193 に答える