拖动阴影是方形的圆形浮动操作按钮

时间:2015-02-23 17:53:57

标签: android floating-action-button

我在Android Lollipop上(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的椭圆形轮廓。

如何才能使其正常运作?

2 个答案:

答案 0 :(得分:1)

我建议您实现自己的DragShadowBuilder子类: 只覆盖onDrawShadow()并绘制一个FAB大小的圆圈。然后只需在startDrag()中使用该类。

如果您的FAB是ImageButton,您可能已经拥有了可用于阴影的图像,因此您甚至不必绘制圆圈。您只需将相同的图片绘制到Canvas中的onDrawShadow()即可。以下是如何根据图像构建阴影的示例:https://gist.github.com/MarcinGil/5337109

答案 1 :(得分: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