2013-06-11 2 views
2

я вращал TextView с ObjectAnimator вроде этого:Как перетащить поворотный DragShadow?

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

Я общался с кругами с этим сам и не нашел большой помощи на различных форумах.

Мое наблюдение заключается в том, что даже когда изображение повернуто, холст, который предоставляется теневому строителю, находится в исходном состоянии без поворота.

Самый близкий, который я получил к правильно повернутой теневой теневой тенью, был реализован пользовательским тензодателем и передал ему текущее вращение просматриваемого вида.

В onProvideShadowMetrics (размер точки, точки касания), я установить размеры теней на основе текущего вращения, так что для повернутых взглядов, было бы достаточно высот для тени быть обращена

В onDrawShadow (холст холст), Я снова принимаю во внимание поворот и передвигаю холст на ту же сумму, что и представление. Затем я даю базовому классу создать фактическую тень, вызвав super.onDrawShadow (canvas). Точка вращения такая же, как и при повороте фактического вида.

Конечный результат: у меня есть повернутая тень для трения, которая частично обрезана. Похоже, что хотя в базовом классе используется поворот холста, точка рисования находится так близко к краю холста, что часть тени обрезается. Мне не удалось решить, как настроить холст так, чтобы рисунок в базовом классе делался с правильным смещением, чтобы предотвратить обрезку.

Похоже, что я, вероятно, в конечном итоге сделаю все теневое рисование самостоятельно, не полагаясь на базовый класс.

удачи.

m.a

Обновление:

Спасибо Vi рус. Я, наконец, повторно просмотрел эту часть своего приложения и попробовал ваш предложенный подход, который работал достаточно хорошо. Я не могу голосовать, так как у меня недостаточно очков и т. Д.

4

Нужно то же самое. Реализовано так (масштабирование также включено)

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

+1 Благодарим вас за спасение моего драгоценного времени. Замечательный человек! –

Смежные вопросы