程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> java-關於ontouchlistener的監聽問題

java-關於ontouchlistener的監聽問題

編輯:編程解疑
關於ontouchlistener的監聽問題

寫了一個類似鼠標的東西 在屏幕上有個view 然後加一個ontouchlistener(不是加給view的) 以下是部分代碼 一個浮動框的代碼 和 ontouch事件的代碼
mWM = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
ivCursor = new ImageView(getBaseContext());
ivCursor.setImageResource(R.drawable.ic_launcher);
mParams = new WindowManager.LayoutParams();// 對ivCursor對象的參數描述對象
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;// 寬度自適應
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;// 高度自適應
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 設置成不能獲取焦點
mParams.type = LayoutParams.TYPE_PHONE;
// 設置圖片格式,效果為背景透明
mParams.format = PixelFormat.RGBA_8888;
//mParams.gravity = Gravity.TOP | Gravity.LEFT;
mParams.x = 0;// 相對於屏幕原點的x軸距離
mParams.y = 0;// 相對於屏幕原點的y軸距離
mWM.addView(ivCursor, mParams);

    relativeLayout.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                x=event.getRawX();
                y=event.getRawY();          
                break;
            case MotionEvent.ACTION_MOVE:
                mx=event.getRawX();
                my=event.getRawY();
                rx=mx-x;
                ry=my-y;
                mParams.x =(int) rx;
                mParams.y =(int)ry;
                mWM.updateViewLayout(ivCursor, mParams);
                break;
            case MotionEvent.ACTION_UP:
                break;
            }
            return true;
        }
    });

    然後問題就出現了 第一次去 down --move -- up 很正常 那個浮動框也跟著動 up之後也就停在了移動過後的位置 但是第二次 再去 down -- move 的時候 當出現move事件的時候那個浮動框就回到了剛開始的初始位置 然後再去跟著移動再停止  這是怎麼回事啊 為什麼會出現這樣的情況啊 有沒有大神幫忙解決下啊 很急!!

最佳回答:


這個是因為你在回調MotionEvent.ACTION_MOVE的方法裡,mParams.x和mParams.y每次都是以原點為基准進行移動的,請用以下代碼試試:

 private int mParamsX, mParamsY;
            relativeLayout.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                x=event.getRawX();
                y=event.getRawY();  

                                // 先記錄一下在手指按下時view所在位置
                                mParamsX = mParams.x;
                                mParamsX = mParams.x;
                break;
            case MotionEvent.ACTION_MOVE:
                mx=event.getRawX();
                my=event.getRawY();
                rx=mx-x;
                ry=my-y;
                mParams.x = mParamsX + (int) rx;
                mParams.y = mParamsY + (int) ry;
                mWM.updateViewLayout(ivCursor, mParams);
                break;
            case MotionEvent.ACTION_UP:
                break;
            }
            return true;
        }
    });
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved