如何拖动旋转的DragShadow?

时间:2013-06-11 17:13:01

标签: android drag-and-drop rotation

我用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(angle == 0)会发生什么。我已经看到了很多位图(但没有旋转)的例子,我无法工作。 有没有办法创建旋转的DragShadow?

2 个答案:

答案 0 :(得分:5)

需要同样的事情。像这样实现(缩放也包括在内)

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);
    ...
}

答案 1 :(得分:2)

我自己一直围着这个圈子,并没有在各种论坛上找到太多帮助。

我的观察是,即使旋转视图,提供给阴影构建器的画布也处于原始未旋转状态。

最接近正确旋转的拖动阴影是通过实现自定义阴影构建器并将其拖动到拖动视图的当前旋转。

在onProvideShadowMetrics(Point size,Point touch)中,我根据当前旋转设置阴影尺寸,这样对于旋转视图,就会有足够的高度来绘制阴影

在onDrawShadow(Canvas canvas)中,我再次考虑了旋转,并以与视图相同的量旋转画布。然后我通过调用super.onDrawShadow(canvas)让基类创建实际的阴影。旋转点与旋转实际视图时使用的旋转点相同。

最终结果是我有一个部分剪裁的旋转拖动阴影。看起来即使在基类中使用画布旋转,绘图点也非常靠近画布边缘,因此阴影的一部分会被剪裁。我还没有弄清楚如何调整画布,以便基类中的绘图在正确的偏移处完成,以防止剪裁。

看来我可能最终会在不依赖基类的情况下完成所有阴影绘图。

祝你好运。

m.a

更新

谢谢Vi rus。我终于重新访问了我的应用程序的这一部分并尝试了你的建议方法,该方法运行得很好。因为我没有足够的积分等,所以我不能投票。