Android制作可全屏拖动的按钮或者控件,可悬浮,暂停

@BindView(R.id.btn_save)
LinearLayout btnSave;
@BindView(R.id.btn_save_pos)
RelativeLayout btnSavePos;

// 控件上一次所处的坐标
private float lastX = 0;
private float lastY = 0;
private float beginX = 0;
private float beginY = 0;
// 屏幕的宽度和高度
private int screenWidth;
private int screenHeight;
//控件将要出现的位置
private int ll = 0;
//private int bb = 0;
//private int rr = 0;
private int tt = 0;
private int btnSize = 0;

private RelativeLayout.LayoutParams layoutParams;

// 获取屏幕的宽度和高度

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

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

screenHeight = windowManager.getDefaultDisplay().getHeight();

btnSize = DisplayUtil.dip2px(mContext, 60);

btnSave.setOnTouchListener(new View.OnTouchListener() {

            @Override

            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {

                    case MotionEvent.ACTION_DOWN:
                        Log.d("test", "down" + event.getX() + ":" + event.getY());
                        //获取点击时x y 轴的数据

                        lastX = event.getRawX();

                        lastY = event.getRawY();

                        beginX = lastX;

                        beginY = lastY;

                        break;

                    case MotionEvent.ACTION_UP:

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

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

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

                        }else{

                            return true;
                        }

                        //触摸弹起的时候来一个小动画

                        //startAnimation();//神经病病

                        break;

                    case MotionEvent.ACTION_MOVE:

                        Log.d("test", "move" + event.getX() + ":" + event.getY());
                        //在move中直接把得到的坐标设置为控件的坐标..果然天真单纯

                        // v.setX(event.getX());

                        // v.setY(event.getY());

                        //获得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 < DisplayUtil.dip2px(mContext, 246)) {//根据手机的分辨率从 dp 的单位 转成为 px(像素)

                            t = DisplayUtil.dip2px(mContext, 246);

                            b = t + v.getHeight();

                        }

                        if (r > screenWidth) {

                            r = screenWidth;

                            l = r - v.getWidth();

                        }

                        if (b > screenHeight) {

                            b = screenHeight - DisplayUtil.dip2px(mContext, 2);

//                            t = b - v.getHeight();

                            t = b - btnSize - DisplayUtil.dip2px(mContext, 2);
//                            Log.e("数据接受", b + "&&&" + t);
//                            layoutParams = new RelativeLayout.LayoutParams(btnSavePos.getLayoutParams());
//                            layoutParams.width = btnSize;
//                            layoutParams.height = btnSize;
//                            layoutParams.leftMargin = l;
//                            layoutParams.topMargin = t;
//                            //这个api设置相对布局,位置的
//                            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, R.id.btn_save_pos);
//                            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, R.id.btn_save_pos);
//                            btnSave.setLayoutParams(layoutParams);
                        }

                        ll = l;
                        tt = t;

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

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

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

                        lastX = (int) event.getRawX();

                        lastY = (int) event.getRawY();

//                        v.postInvalidate();//绘画

                        layoutParams = new RelativeLayout.LayoutParams(btnSavePos.getLayoutParams());
                        layoutParams.width = btnSize;
                        layoutParams.height = btnSize;
                        layoutParams.leftMargin = ll;
                        layoutParams.topMargin = tt;
//                            layoutParams.rightMargin = rr;
//                            layoutParams.bottomMargin = (int) (bb);
                        //这个api设置相对布局,位置的
                        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, R.id.btn_save_pos);
                        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, R.id.btn_save_pos);
//                            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, R.id.btn_save_pos);
//                            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, R.id.btn_save_pos);

                        btnSave.setLayoutParams(layoutParams);

                        break;

                    default:

                        break;

                }

                return false;

            }

        });

布局页面

        <RelativeLayout
            android:id="@+id/btn_save_pos"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:id="@+id/btn_save"
                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">

                <TextView
                    android:layout_marginTop="@dimen/dp_10"
                    android:gravity="center"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="hello"
                    android:textColor="#ffffff"
                    android:textSize="@dimen/sp_14" />

                <TextView
                    android:layout_marginTop="@dimen/dp_0"
                    android:gravity="center"
                    android:layout_gravity="center_horizontal"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="world"
                    android:textColor="#ffffff"
                    android:textSize="@dimen/sp_12" />

            </LinearLayout>

        </RelativeLayout>

工具类

public class DisplayUtil {
	/**
	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
	 */
	public static int dip2px(Context context, float dpValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}

	/**
	 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
	 */
	public static int px2dip(Context context, float pxValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (pxValue / scale + 0.5f);
	}

	/**
	 * 将px值转换为sp值,保证文字大小不变
	 *
	 * @param pxValue
	 *            (DisplayMetrics类中属性scaledDensity)
	 * @return
	 */
	public static int px2sp(Context context, float pxValue) {
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		return (int) (pxValue / fontScale + 0.5f);
	}

	/**
	 * 将sp值转换为px值,保证文字大小不变
	 *
	 * @param spValue
	 *            (DisplayMetrics类中属性scaledDensity)
	 * @return
	 */
	public static int sp2px(Context context, float spValue) {
		final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
		return (int) (spValue * fontScale + 0.5f);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值