触摸事件

触摸事件,确定Dragview 的位置。

    // 對图片设置触摸侦听。
        ivDrag.setOnTouchListener(new OnTouchListener() {

            @Override
            // 正在触摸时;
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                // 获取触摸时的事件。
                switch (event.getAction()) {
                // 按下
                case MotionEvent.ACTION_DOWN:
                    // 初始化坐标起点位置。

                    startX = (int) event.getRawX();   //getRawX获得是相对screen的x坐标。
                    startY = (int) event.getRawY();

                    break;

                // 抬起 当鼠标抬起时记录下鼠标的位置。

                // 移动
                case MotionEvent.ACTION_MOVE:
                    //

                    int endX = (int) event.getRawX();
                    int endY = (int) event.getRawY();

                    // 计算偏移量。
                    int dX = endX - startX;
                    int dY = endY - startY;
                    // 计算图片的位置。
                    int l = ivDrag.getLeft() + dX;
                    int t = ivDrag.getTop() + dY;
                    int r = ivDrag.getRight() + dX;
                    int b = ivDrag.getBottom() + dY;
                    /**
                     * 对组件是否出过屏幕做出判断。
                     * 第四个参数减去20的主要的原因是titlebar  状态栏的高度。
                     */
                    if(l<0||r>winwidth||t<0||b>winHeight-20){
                        break;

                    }


                    /**
                     * 对图片的高度的判断, 以确定上下TextView的显示和隐藏。
                     */
                    if(t<winHeight/2){
                        //下面显示 上面隐藏。
                        tvTop.setVisibility(View.INVISIBLE);
                        tvBottom.setVisibility(View.VISIBLE);


                    }else{
                        //上面显示, 下面隐藏。   

                        tvTop.setVisibility(View.VISIBLE);
                        tvBottom.setVisibility(View.INVISIBLE);

                    }


                    // 更新图片的位置。
                    ivDrag.layout(l, t, r, b);

                    // 重新初始化起点坐标。
                    startX = (int) event.getRawX();
                    startY = (int) event.getRawY();

                    break;

                case MotionEvent.ACTION_UP:
                    // 手抬起时 记录住最后的位置 左边 和上边 就能确定最后的位置。
                    Editor edit = mPref.edit();
                    edit.putInt("lastX", ivDrag.getLeft());
                    edit.putInt("lastY", ivDrag.getTop());
                    edit.commit();

                    break;

                default:
                    break;
                }

                return true; // 表示这个事件自己处理不交给父类。   就是拦截事件。
            }
        });

当触摸事件发生在电话窗口位置时需要注意;

params.type = WindowManager.LayoutParams.TYPE_PHONE;  //type类型为phone类型。

需要添加权限:

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>  //系统的弹窗。
view.setOnTouchListener(new OnTouchListener() {

            private int startX;
            private int startY;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                switch (event.getAction()) {
                // 触摸事件, 手指按下时。
                case MotionEvent.ACTION_DOWN:

                    startX = (int) event.getRawX();
                    startY = (int) event.getRawY();

                    break;
                // 移动时,
                case MotionEvent.ACTION_MOVE:

                    int endX = (int) event.getRawX();
                    int endY = (int) event.getRawY();

                    // 偏移量:
                    int dX = endX - startX;
                    int dY = endY - startY;

                    // 更新浮窗的位置。

                    params.x += dX;
                    params.y += dY;
                    /**
                     * 在这里限制xy防止坐标偏离屏幕。
                     */

                    if(params.x<0){
                        params.x=0;
                    }
                    if(params.x>winWidth-v.getWidth()){
                        params.x=winWidth-v.getWidth();
                    }
                    if(params.y<0){
                        params.y=0;
                    }
                    if(params.y>winHeight-v.getHeight()){
                        params.y=winHeight-v.getHeight();
                    }
                    Log.e("params.x=", params.x+"");
                    Log.e("params.y=", params.y+"");

                    mwm.updateViewLayout(v, params);

                    // 重新初始化坐标。
                    int startX = (int) event.getRawX();
                    int startY = (int) event.getRawY();

                    break;

                case MotionEvent.ACTION_UP:

                    Editor edit = mPref.edit();
                    edit.putInt("lastX", params.x);
                    edit.putInt("lastY", params.y);
                    edit.commit();

                    break;

                default:
                    break;
                }

                return false;
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值