@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DisplayMetrics dm = getResources().getDisplayMetrics();
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels - 50;//用来限制能移动到的位置
Button button=(Button)findViewById(R.id.btn);
ImageView imageView=(ImageView)findViewById(R.id.btn2);
imageView.setOnTouchListener(this);//对button和imageview都设置同样的监听
button.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
int action=event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
//按下时触发
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//移动时触发
int dx =(int)event.getRawX() - lastX;//计算x和y的变化量
int dy =(int)event.getRawY() - lastY;
int left = v.getLeft() + dx;//计算实时的坐标
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
//限制坐标,不能超过屏幕的上下左右
if(left < 0){
left = 0;
right = left + v.getWidth();
}
if(right > screenWidth){
right = screenWidth;
left = right - v.getWidth();
}
if(top < 0){
top = 0;
bottom = top + v.getHeight();
}
if(bottom > screenHeight){
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
}
return false;
}
MotionEvent 事件
MotionEvent.ACTION_DOWN:按下之后就会触发到这个事件。
MotionEvent.ACTION_MOVE:移动时触发
MotionEvent.ACTION_POINTER_DOWN:已经按下的时候,新的触点被按下时触发。
MotionEvent.ACTION_POINTER_UP:多个点被按住,松开其中一个点时触发(非最后一个点被放开时)
MotionEvent.ACTION_UP:松开时被触发。
MotionEvent.ACTION_SCROLL:非触摸滚动,鼠标、滚轮触发。
MotionEvent.ACTION_CANCEL:不是由用户直接触发,有系统再需要的时候触发,例如当父view通过使函数onInterceptTouchEvent()返回true,从子view拿回处理事件的控制权是,就会给子view发一个ACTION_CANCEL事件,这里了view就再也不会收到事件了。可以将其视为ACTION_UP事件对待。
获取view的位置
getGlobalVisibleRect跟getLocalVisibleRect
getLocalVisibleRect //返回一个Rect对象
Rect localRect = new Rect();
imageView.getLocalVisibleRect(localRect);
//获取视图本身可见的坐标区域,坐标以自己的左上角为原点(0,0)
//如果右下两条边没有被遮挡,rect里的第三第四个参数都等于自身的长宽,
//如果左上两天边被遮挡,rect对象的第一第二个参数为被遮挡的长度。
getGlobalVisibleRect//获取全局坐标系的一个视图区域, 返回一个填充的Rect对象;该Rect是基于总整个屏幕的
Rect globalRect = new Rect();
imageView.getGlobalVisibleRect(globalRect);
//返回可视范围的控件基于全局的四边长度
getLocationOnScreen//计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
int[] location = new int[2];
imageView.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
getLocationInWindow//计算该视图在它所在的widnow的坐标x,y值
getLeft , getTop, getBottom, getRight, 这一组是获取相对父控件的坐标
在Activity的OnCreate()中这些参数全为0,原因是view没有加载好
网友评论