关闭

触摸事件

75人阅读 评论(0) 收藏 举报
分类:

触摸事件,确定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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26970次
    • 积分:1244
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论