应用中可随手势移动的控件

private int startX , startY , endX, endY ;

private int screenWidth , screenHeight;

private int lastX, lastY ;

private DisplayMetrics dm;




获取屏幕宽高(分辨率)
dm = getResources().getDisplayMetrics();

screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels - getStatusBarHeight();

//获取通知栏高度 上面的屏幕高度得减去通知栏高度
private int getStatusBarHeight() {
    if (statusBarHeight == 0) {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
            Object o = c.newInstance();
            Field field = c.getField("status_bar_height");
            int x = (Integer) field.get(o);
            statusBarHeight = getResources().getDimensionPixelSize(x);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return statusBarHeight;
}


给控件设置ontouch事件

ziyou.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

               switch (event.getAction()){

                   case MotionEvent.ACTION_DOWN:

                       lastX = (int) event.getRawX();// 获取触摸事件触摸位置的原始X坐标
                       lastY = (int) event.getRawY();
                       //记录初始点击位置
                       startX = (int) event.getRawX();// 获取触摸事件触摸位置的原始X坐标
                       startY = (int) event.getRawY();

                       break;
                   case MotionEvent.ACTION_MOVE:

                        //移动距离
                       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;
                       // 下面判断移动是否超出屏幕
                       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();
                       }
                       v.layout(l, t, r, b);
                       lastX = (int) event.getRawX();
                       lastY = (int) event.getRawY();
                       v.postInvalidate();

                       break;
                   case MotionEvent.ACTION_UP:

                       //记录结束点击位置
                       endX = (int) event.getRawX();
                       endY = (int) event.getRawY();
                       
                       if (endX == startX && endY == startY) {

                           ToastUtil.showToast(MainActivity.this,"点击了灵活按键");
                       }
                       break;
                   default:
                       break;
               }
               return true;
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值