【问题标题】:Drag shadow is square for a round floating action button拖动阴影是方形的圆形浮动操作按钮
【发布时间】:2015-02-23 17:53:56
【问题描述】:

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

我怎样才能让它正常运行?

【问题讨论】:

    标签: android floating-action-button


    【解决方案1】:

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

    如果您的 FAB 是 ImageButton,您可能已经有一个可用于阴影的图像,因此您甚至不必画一个圆圈。您可以简单地将相同的图像绘制到onDrawShadow() 中的Canvas。以下是如何从图像构建阴影的示例:https://gist.github.com/MarcinGil/5337109

    【讨论】:

      【解决方案2】:

      @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

      【讨论】:

        猜你喜欢
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 2017-08-17
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多