寫了一個類似鼠標的東西 在屏幕上有個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;
}
});