2013-06-11 26 views
2

我旋轉,這樣與ObjectAnimator一個TextView:如何拖動旋轉的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創建時不旋轉(角度== 0)。我已經看到了很多與位圖有關的示例(但沒有用於旋轉),我無法工作。 有沒有辦法創建一個旋轉的DragShadow?

回答

2

我一直在圍繞着這個圈子,並沒有在各種論壇上找到太多的幫助。

我的觀察是,即使在旋轉視圖時,提供給陰影構建器的畫布仍處於原始未旋轉狀態。

最接近我得到一個正確旋轉的拖曳陰影是通過實現一個自定義陰影生成器並傳遞它被拖動的視圖的當前旋轉。

在onProvideShadowMetrics(點大小,點觸摸),我設置基於當前旋轉陰影尺寸,使得對於旋轉的觀點,將有足夠的高度爲要繪製

陰影在onDrawShadow(帆布帆布),我再次考慮旋轉並將畫布旋轉與視圖相同的量。然後,我通過調用super.onDrawShadow(canvas)讓基類創建實際的陰影。旋轉點與旋轉實際視圖時使用的點相同。

最終的結果是,我有一個部分剪切的旋轉拖動陰影。看起來,即使在基類中正在使用畫布旋轉,繪圖點也非常接近畫布的邊緣,因此陰影的一部分會被剪切。我還沒有弄清楚如何調整畫布,以便基本類中的圖形在正確的偏移量處完成以防止剪裁。

看來,我可能會最終做所有的陰影繪製自己,而不依賴於基類。

祝你好運。

M.A

更新:

謝謝六RUS。我終於重新訪問了我的應用程序的這部分內容,並嘗試了您的建議方法,該方法運行良好。由於分數不足等原因,我無法投票。

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謝謝病毒爲我節省了寶貴的時間。精彩的工作人! –