2015-02-23 30 views
0

我在Android棒棒糖(minSdk = 21)上,並且想要實現用拖動手勢來移動浮動動作按鈕。這個按鈕是ImageButton的一個自定義子類,代碼在這裏描述,所以我不會重複它:Define default values for layout_width and layout_height properties for a subclass in a style拖動陰影對於圓形浮動動作按鈕是正方形

對於拖動,我使用這裏描述的方式:http://developer.android.com/guide/topics/ui/drag-drop.html。這裏是我的代碼如下所示:

favoriteButton.setOnLongClickListener(new View.OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View v) { 
      v.startDrag(null, new View.DragShadowBuilder(v), null, 0); 

      return true; 
     } 
    }); 

    findViewById(R.id.test_main_layout).setOnDragListener(new View.OnDragListener() { 

     @Override 
     public boolean onDrag(View v, DragEvent event) { 
      switch (event.getAction()) { 
       case DragEvent.ACTION_DRAG_ENTERED: 
        favoriteButton.setVisibility(View.INVISIBLE); 
        break; 

       case DragEvent.ACTION_DROP: 
        favoriteButton.setX(event.getX() - favoriteButton.getWidth()/2); 
        favoriteButton.setY(event.getY() - favoriteButton.getHeight()/2); 
        favoriteButton.setVisibility(View.VISIBLE); 
        break; 
      } 

      return true; 
     } 
    }); 

一般情況下,它的工作原理,但問題是「拖影」:它是方形的。出於這個原因或其他原因,它不尊重FAB的橢圓形輪廓。

我該如何使其行爲正確?

回答

1

@FD_謝謝你的回答。在此期間,試圖詢問事情的評論,我發現我的用於FAB背景繪製不是橢圓形,而是一個簡單的顏色:

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
     android:color="?android:attr/colorControlHighlight"> 

    <item android:drawable="?android:attr/colorAccent"/> 

</ripple> 

將其更改爲在此之後:

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
     android:color="?android:attr/colorControlHighlight"> 

    <item android:drawable="@drawable/oval_accent_drawable"/> 

</ripple> 

與想要的顏色另一個橢圓形繪製:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="oval"> 

    <solid android:color="?android:attr/colorAccent"/> 

    <size 
     android:width="@dimen/fab_size" 
     android:height="@dimen/fab_size"/> 

</shape> 

拖影,現在完美的作品。

謝謝你成爲我的rubber duck

1

我建議實施您自己的子類DragShadowBuilder: 只能覆蓋onDrawShadow()並繪製一個FAB大小的圓。然後在startDrag()中簡單使用該類。

如果您的FAB是ImageButton,那麼您可能已經有了可用於陰影的圖像,這樣您甚至不必繪製圓圈。您可以簡單地將相同的圖像繪製到onDrawShadow()中的Canvas。以下是如何從圖像構建陰影的示例:https://gist.github.com/MarcinGil/5337109