public class MoveActivity extends Activity {
private LinearLayout mLl_move;
private int mWidth;
private int mHeight;
private long[] mNum = new long[2];
private int mStartY;
private int mStartX;
private SharedPreferences sp ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_move);
mLl_move = (LinearLayout) findViewById(R.id.ll_move);
sp = getSharedPreferences("config", MODE_PRIVATE);
WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
mWidth = metrics.widthPixels;
mHeight = metrics.heightPixels;
int x = sp.getInt("x", 100);
int y = sp.getInt("y", 100);
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) mLl_move.getLayoutParams();
params.leftMargin = x;
params.topMargin = y ;
mLl_move.setLayoutParams(params);
showMove();
doubleEvent();
}

/**
* 双击事件
* */
private void doubleEvent() {
mLl_move.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.arraycopy(mNum , 1 , mNum , 0 ,mNum.length-1 );
mNum[1] = SystemClock.uptimeMillis();
if (mNum[0] >= (SystemClock.uptimeMillis() - 500)){
int l = (mWidth - mLl_move.getWidth()) / 2;
int t = (mHeight - mLl_move.getHeight()-25) / 2;
mLl_move.layout(l , t , l+mLl_move.getWidth() , t+mLl_move.getHeight());
}
}
});
}
/**
* 拖动事件
* */
private void showMove() {
mLl_move.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
LogUtil.d("按下的事件","sssss");
mStartX = (int) event.getRawX();
mStartY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
LogUtil.d("移动的事件","sssss");
int newX = (int) event.getRawX();
int newY = (int) event.getRawY();
int dX = newX - mStartX ;
int dY = newY - mStartY ;
int left = mLl_move.getLeft();
int top = mLl_move.getTop();
left += dX;
top += dY;
int right = left + mLl_move.getWidth();
int bottom = top + mLl_move.getHeight();
if (left < 0 || top < 0 || right > mWidth || bottom > mHeight-25 ){
break;
}
mLl_move.layout(left, top ,right ,bottom);
mStartX = newX;
mStartY = newY;
break;
case MotionEvent.ACTION_UP:
LogUtil.d("抬起的事件","sssss");
int x = mLl_move.getLeft();
int y = mLl_move.getTop();
SharedPreferences.Editor edit = sp.edit();
edit.putInt("x" , x);
edit.putInt("y" , y);
edit.apply();
break;
}
return false;
}
});
}
}
- 触摸事件和点击事件的冲突
- 点击事件 : 一组事件的集合,按下+抬起
- 触摸事件 : 每个事件都是一个单独的事件,按下,移动,抬起
如果只有触摸事件:return true表示事件执行
如果点击事件和触摸事件共同存在,触摸事件的事件是会点击事件消费掉
先执行触摸 : 然后执行其他事件
点击 : 按下+抬起
1.
return false
触摸 : 按下 执行完 -> 移动 执行完 -> 抬起
触摸+点击 : 按下(触摸) 拦截 - > 按下(点击) 执行 - > 抬起(触摸) 拦截 - > 抬起(点击) 执行 - > 输出(触摸) - > 输出(点击)
2.
return true
触摸 : 按下 -> 移动 -> 抬起
触摸+点击 按下(触摸) 执行 -> 移动(触摸) -> 抬起(触摸)
*****
如果只有触摸事件:return true;
如果触摸+点击事件:触摸事件return false