MotionEvent+layout 控件随触点移动

@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没有加载好

android MotionEvent中getX()和getRawX()的区别

你可能感兴趣的:(MotionEvent+layout 控件随触点移动)