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