Android 自定义可拖拽悬浮按钮

原创 2018年04月16日 14:20:16
一、添加依赖
compile 'com.android.support:design:26.1.0'
后面的版本号要和
implementation 'com.android.support:appcompat-v7:26.1.0'

的版本号一致

二、自定义类继承  FloatingActionButton

public class DragFloatActionButton extends FloatingActionButton {
    private int parentHeight;
    private int parentWidth;

    public DragFloatActionButton(Context context) {
        super(context);
    }

    public DragFloatActionButton(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }


    private int lastX;
    private int lastY;

    private boolean isDrag;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int rawX = (int) event.getRawX();
        int rawY = (int) event.getRawY();
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                setPressed(true);
                isDrag = false;
                getParent().requestDisallowInterceptTouchEvent(true);
                lastX = rawX;
                lastY = rawY;
                ViewGroup parent;
                if (getParent() != null) {
                    parent = (ViewGroup) getParent();
                    parentHeight = parent.getHeight();
                    parentWidth = parent.getWidth();
                }
                break;
            case MotionEvent.ACTION_MOVE:
                if (parentHeight <= 0 || parentWidth == 0) {
                    isDrag = false;
                    break;
                } else {
                    isDrag = true;
                }
                int dx = rawX - lastX;
                int dy = rawY - lastY;
                //这里修复一些华为手机无法触发点击事件
                int distance = (int) Math.sqrt(dx * dx + dy * dy);
                if (distance == 0) {
                    isDrag = false;
                    break;
                }
                float x = getX() + dx;
                float y = getY() + dy;
                //检测是否到达边缘 左上右下
                x = x < 0 ? 0 : x > parentWidth - getWidth() ? parentWidth - getWidth() : x;
                y = getY() < 0 ? 0 : getY() + getHeight() > parentHeight ? parentHeight - getHeight() : y;
                setX(x);
                setY(y);
                lastX = rawX;
                lastY = rawY;
                Log.e("aa", "isDrag=" + isDrag + "getX=" + getX() + ";getY=" + getY() + ";parentWidth=" + parentWidth);
                break;
            case MotionEvent.ACTION_UP:
                if (!isNotDrag()) {
                    //恢复按压效果
                    setPressed(false);
                    //Log.i("getX="+getX()+";screenWidthHalf="+screenWidthHalf);
                    if (rawX >= parentWidth / 2) {
                        //靠右吸附
                        animate().setInterpolator(new DecelerateInterpolator())
                                .setDuration(500)
                                .xBy(parentWidth - getWidth() - getX())
                                .start();
                    } else {
                        //靠左吸附
                        ObjectAnimator oa = ObjectAnimator.ofFloat(this, "x", getX(), 0);
                        oa.setInterpolator(new DecelerateInterpolator());
                        oa.setDuration(500);
                        oa.start();
                    }
                }
                break;
        }
        //如果是拖拽则消s耗事件,否则正常传递即可。
        return !isNotDrag() || super.onTouchEvent(event);
    }

    private boolean isNotDrag() {
        return !isDrag && (getX() == 0
                || (getX() == parentWidth - getWidth()));
    }
}

在布局文件中使用即可

注:不设置点击事件是不能拖拽移动的,需要先添加点击事件

Android自定义可拖拽的悬浮按钮---DragFloatingActionButton

悬浮按钮FloatingActionButton是Android 5.0系统添加的新控件,FloatingActionButton是继承至ImageView,所以FloatingActionButto...
  • android_cmos
  • android_cmos
  • 2017-06-21 23:10:02
  • 1982

Android 可拖拽悬浮按钮

转自http://www.jianshu.com/p/ba3e5fc5cff1 实现思路 通过重写控件的onTouchEvent方法监听触摸效果。通过View的setX()和s...
  • code_dream_wq
  • code_dream_wq
  • 2017-05-09 16:05:34
  • 2130

Android 拖拽悬浮按钮

  • 2016年12月13日 17:46
  • 28KB
  • 下载

Android 可拖动的悬浮按钮

这是控件的主代码,在你的项目里面,新建一个同名的类,把代码直接复制进去就能用了。另外,这个类里面引用了工具类的一些代码。工具类在这个主类的源码下面也有贴出,直接把工具类的相关代码,复制到你自己的工具类...
  • l_o_s
  • l_o_s
  • 2017-03-01 15:01:53
  • 4727

Android开发 自定义悬浮可拖动view

一个自定义View的悬浮按钮Lib扩展性良好,悬浮布局可是配其他布局
  • xhf_123
  • xhf_123
  • 2017-08-30 09:52:23
  • 725

安卓可拖拽悬浮按钮

几个月前,我写了一篇文章 《Android 可拖拽悬浮吸附按钮》 这篇文章的实现方式有点影响性能,介于当时的能力不足也是有一定原因的。这几天重新实现了一种效果更好的方式,这种方式的优点是,你可以就像使...
  • sinat_28263953
  • sinat_28263953
  • 2017-04-17 15:25:31
  • 479

android WindowManager可拖动悬浮按钮

代码地址 http://git.oschina.net/azure_sword/Sample_AS 可悬浮按钮的两种情况 1.当前页面悬浮 2.所有页面悬浮(包括系统页面) 注:第二种功能...
  • qq_28934205
  • qq_28934205
  • 2016-04-05 11:30:22
  • 2554

Android可以拖动的悬浮窗实现

类似于360或者手机腾讯管家的悬浮窗口很多,具体实现起来也比较容易,无非启动一个服务,设置服务的权限,下面直接写上代码: public class SuspensionWindowService...
  • ming_147
  • ming_147
  • 2016-11-28 15:34:33
  • 2697

android 实现自由移动的悬浮按钮

android 实现自由移动的悬浮按钮实现原理 主要是通过android中的WindowManager中的addview()把view加载进来,设置WindowManager.LayoutParam...
  • Jack_Li_ng
  • Jack_Li_ng
  • 2016-09-22 10:50:57
  • 5011

APP内可拖动的悬浮按钮

在APP实际开发中,会产生各种需求,其中有一个需求就是APP做活动的时候要求一个悬浮的按钮悬浮在整个APP,如何来实现这一需求呢,我在网上找到一个很好的例子,学习学习,大神地址http://www.j...
  • senkai123
  • senkai123
  • 2017-09-04 10:48:42
  • 296
收藏助手
不良信息举报
您举报文章:Android 自定义可拖拽悬浮按钮
举报原因:
原因补充:

(最多只允许输入30个字)