4

次のように ObjectAnimator で TextView を回転させました。

ObjectAnimator rotate = ObjectAnimator.ofFloat(aRotatedTextView, "rotation", 0f, someAngle);

今、私はこのように長いクリックで回転した(!)TextViewをドラッグアンドドロップしようとします:

public boolean onLongClick(View view) {
    ClipData data = ClipData.newPlainText("DragData", (String) view.getTag());
    DragShadowBuilder dragShadowBuilder = new View.DragShadowBuilder(view);
    mDragInProgress = view.startDrag(data, dragShadowBuilder, view, 0);
    view.setVisibility(View.INVISIBLE);
    return true;
}

何が起こるかというと、DragShadow は回転なしで作成されます (角度==0)。ビットマップを使用した (ただし、回転を使用していない) かなりの数の例を見てきましたが、うまく動作しませんでした。回転した DragShadow を作成する方法はありますか?

4

2 に答える 2

6

同じものが必要でした。このように実装しました(スケーリングも含まれています)

new OnTouchListener() {
    @Override
    public boolean onTouch(final View view, MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
    double rotationRad = Math.toRadians(view.getRotation());
    final int w = (int) (view.getWidth() * view.getScaleX());
    final int h = (int) (view.getHeight() * view.getScaleY());
    double s = Math.abs(Math.sin(rotationRad));
    double c = Math.abs(Math.cos(rotationRad));
    final int width = (int) (w * c + h * s);
    final int height = (int) (w * s + h * c);
    DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view) {
        @Override
        public void onDrawShadow(Canvas canvas) {
            canvas.scale(view.getScaleX(), view.getScaleY(), width / 2,
                    height / 2);
            canvas.rotate(view.getRotation(), width / 2, height / 2);
            canvas.translate((width - view.getWidth()) / 2,
                    (height - view.getHeight()) / 2);
            super.onDrawShadow(canvas);
        }

        @Override
        public void onProvideShadowMetrics(Point shadowSize,
                Point shadowTouchPoint) {
            shadowSize.set(width, height);
            shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
        }
    };

    view.startDrag(null, shadowBuilder, view, 0);
    ...
}
于 2013-11-21T00:12:16.640 に答える
2

私はこれを自分で回してきましたが、さまざまなフォーラムであまり助けが見つかりませんでした.

私の観察では、ビューが回転しても、シャドウ ビルダーに提供されるキャンバスは元の回転していない状態です。

適切に回転されたドラッグ シャドウに最も近いのは、カスタム シャドウ ビルダーを実装し、ドラッグされているビューの現在の回転を渡すことでした。

onProvideShadowMetrics(Point size, Point touch) では、現在の回転に基づいて影の寸法を設定し、回転したビューで影を描画するのに十分な高さがあるようにしました

onDrawShadow(Canvas canvas) では、再度回転を考慮して、ビューと同じ量だけキャンバスを回転させます。次に、基本クラスで super.onDrawShadow(canvas) を呼び出して実際の影を作成します。回転のポイントは、実際のビューを回転するときに使用されるポイントと同じです。

最終結果は、回転したドラッグ シャドウが部分的に切り取られていることです。キャンバスの回転が基本クラスで使用されているにもかかわらず、描画ポイントがキャンバスの端に非常に近いため、影の一部が切り取られているようです。クリッピングを防ぐために、基本クラスの描画が正しいオフセットで行われるようにキャンバスを調整する方法を見つけることができませんでした。

基本クラスに依存せずに、すべての影の描画を自分で行うことになる可能性が高いようです。

幸運を。

アップデート:

ありがとうございます。私は最終的にアプリのこの部分を再検討し、提案されたアプローチを試しましたが、非常にうまく機能しました。ポイントが足りないなどの理由で投票できません。

于 2013-10-10T12:22:35.147 に答える