Android - 可拖动按钮悬浮button

一、可以拖动的View全局拖动,直接贴代码

public class MainActivity extends Activity {
    private LinearLayout btn_test;

    // 控件上一次所处的坐标
    private float lastX = 0;
    private float lastY = 0;
    // 记录控件开始位置
    private float beginX = 0;
    private float beginY = 0;
    // 屏幕的宽度和高度
    private int screenWidth;
    private int screenHeight;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取屏幕的宽度和高度
        WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

        screenWidth = windowManager.getDefaultDisplay().getWidth();

        screenHeight = windowManager.getDefaultDisplay().getHeight();
        btn_test = findViewById(R.id.btn_test);
        //点击事件响应
        btn_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplication(), "点击事件", Toast.LENGTH_SHORT).show();
            }
        });
        //拖动事件响应
        btn_test.setOnTouchListener(new View.OnTouchListener() {

            @SuppressLint("ClickableViewAccessibility")
            @Override

            public boolean onTouch(View v, MotionEvent event) {

                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:

                        //获取点击时x y 轴的数据

                        lastX = event.getRawX();

                        lastY = event.getRawY();

                        // 记录控件开始位置

                        beginX = lastX;

                        beginY = lastY;

                        break;

                    case MotionEvent.ACTION_UP:

                        Log.d("抬起", "up" + event.getX() + ":" + event.getY());

                        // 解决拖拽的时候松手点击事件触发

                        if (Math.abs(lastX - beginX) < 10 && Math.abs(lastY - beginY) < 10){

                        }else{
                            return true;
                        }

                        break;

                    case MotionEvent.ACTION_MOVE:

                        //获得x y轴的偏移量

                        int dx = (int) (event.getRawX() - lastX);

                        int dy = (int) (event.getRawY() - lastY);

                        //获得控件上下左右的位置信息,加上我们的偏移量,新得到的位置就是我们控件将要出现的位置

                        int l = v.getLeft() + dx;

                        int b = v.getBottom() + dy;

                        int r = v.getRight() + dx;

                        int t = v.getTop() + dy;

                        //判断四个实际位置,如果有一边已经划出屏幕,那就把这边位置设置为0然后相反的边的位置就设置成控件的高度或者宽度

                        if (l < 0) {

                            l = 0;

                            r = l + v.getWidth();

                        }

                        if (t < 0) {

                            t = 0;

                            b = t + v.getHeight();

                        }

                        if (r > screenWidth) {

                            r = screenWidth;

                            l = r - v.getWidth();

                        }

                        if (b > screenHeight) {

                            b = screenHeight;

                            t = b - v.getHeight();

                        }

                        //然后使用我们view的layout重新在布局中把我们的控件画出来

                        v.layout(l, t, r, b);

                        //并把现在的x y设置给lastx lasty

                        lastX = (int) event.getRawX();

                        lastY = (int) event.getRawY();

                        v.postInvalidate();//绘制

                        break;

                    default:

                        break;

                }

                return false;

            }

        });
    }
}

二、xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/btn_test"
        android:layout_marginBottom="@dimen/dp_130"
        android:layout_marginLeft="@dimen/dp_15"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_width="@dimen/dp_60"
        android:layout_height="@dimen/dp_60"
        android:orientation="vertical"
        android:background="@drawable/ic_launcher_background"
        tools:ignore="MissingConstraints">

        <TextView
            android:layout_marginTop="@dimen/dp_10"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="按钮"
            android:textColor="#ffffff"
            android:textSize="@dimen/sp_14" />

        <TextView
            android:layout_marginTop="@dimen/dp_0"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="移动/点击"
            android:textColor="#ffffff"
            android:textSize="@dimen/sp_12" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值