У меня повернутое текстовое представление, и я хочу перетащить его. Проблема в том, что тень от перетаскивания не вращается.

Я нашел решение для android на java, но у меня это не работает. Может я неправильно перевела код

Как перетащить повернутый DragShadow?

class CustomDragShdowBuilder : View.DragShadowBuilder
{
    private View _view;
    public CustomDragShdowBuilder(View view)
    {
        _view = view;
    }

    public override void OnDrawShadow(Canvas canvas)
    {
        double rotationRad = Math.ToRadians(_view.Rotation);
        int w = (int)(_view.Width * _view.ScaleX);
        int h = (int)(_view.Height * _view.ScaleY);
        double s = Math.Abs(Math.Sin(rotationRad));
        double c = Math.Abs(Math.Cos(rotationRad));

        int width = (int)(w * c + h * s);
        int height = (int)(w * s + h * c);

        canvas.Scale(_view.ScaleX, _view.ScaleY, width / 2, height / 2);
        canvas.Rotate(_view.Rotation, width / 2, height / 2);
        canvas.Translate((width - _view.Width) / 2, (height - _view.Height) / 2);

        base.OnDrawShadow(canvas);
    }

    public override void OnProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint)
    {
        shadowTouchPoint.Set(shadowSize.X / 2, shadowSize.Y / 2);
        base.OnProvideShadowMetrics(shadowSize, shadowTouchPoint);
    }
}
0
A. Schmidt 16 Фев 2018 в 22:02

1 ответ

Лучший ответ

Я нашел решение для android на java, но у меня это не работает. Может я неправильно перевела код

Да, вы неправильно переводите, вы изменили коды OnDrawShadow, но не обратили внимания на OnProvideShadowMetrics, целью которого является изменение размера области рисования холста, поэтому вам нужно пройти такая же ширина и высота, которые были рассчитаны по кодам:

Вот модифицированная версия DragShdowBuilder:

public class MyDragShadowBuilder : DragShadowBuilder
{
    private int width, height;

    // Defines the constructor for myDragShadowBuilder
    public MyDragShadowBuilder(View v) : base(v)
    {
    }

    // Defines a callback that sends the drag shadow dimensions and touch point back to the system.
    public override void OnProvideShadowMetrics(Android.Graphics.Point outShadowSize, Android.Graphics.Point outShadowTouchPoint)
    {
        double rotationRad = Java.Lang.Math.ToRadians(View.Rotation);
        int w = (int)(View.Width * View.ScaleX);
        int h = (int)(View.Height * View.ScaleY);
        double s = Java.Lang.Math.Abs(Java.Lang.Math.Sin(rotationRad));
        double c = Java.Lang.Math.Abs(Java.Lang.Math.Cos(rotationRad));


        //calculate the size of the canvas 
        //width = view's width*cos(rad)+height*sin(rad)
        width = (int)(w * c + h * s);
        //height = view's width*sin(rad)+height*cos(rad)
        height = (int)(w * s + h * c);

        outShadowSize.Set(width, height);

        // Sets the touch point's position to be in the middle of the drag shadow
        outShadowTouchPoint.Set(outShadowSize.X / 2, outShadowSize.Y / 2);
    }

    // Defines a callback that draws the drag shadow in a Canvas that the system constructs
    // from the dimensions passed in onProvideShadowMetrics().
    public override void OnDrawShadow(Canvas canvas)
    {

        canvas.Scale(View.ScaleX, View.ScaleY, width/2 , height/2);
        //canvas.DrawColor(Android.Graphics.Color.White);
        canvas.Rotate(View.Rotation,width/2, height / 2);
        canvas.Translate((width - View.Width)/2, (height - View.Height) / 2);
        base.OnDrawShadow(canvas);
    }

}

А вот и полный пример: RotatedTextViewSample

0
Elvis Xia - MSFT 19 Фев 2018 в 11:50