2015-02-23 1 views
0

Я нахожусь на Android Lollipop (minSdk = 21) и хочу реализовать перемещение плавающей кнопки Action с помощью жестов перетаскивания. Кнопка представляет собой пользовательский подкласс 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_ благодарю вас за ответ. В то же время, пытаясь что-то спросить в комментариях, я заметил, что мой фон вытяжке используется для ФАБ не является овальная форма, а просто цвет:

<?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> 

с другой овальной Drawable с разыскиваемым цветом:

<?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, возможно, у вас уже есть изображение, которое вы можете использовать для тени, так что вам даже не нужно рисовать круг. Вы можете просто нарисовать то же изображение на Canvas в onDrawShadow(). Вот пример того, как тень может быть построена из изображения: https://gist.github.com/MarcinGil/5337109.

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

  • Нет связанных вопросов^_^