美文网首页
MotionEvent+layout 控件随触点移动

MotionEvent+layout 控件随触点移动

作者: chauI | 来源:发表于2016-11-14 15:01 被阅读72次
    @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 控件随触点移动

          本文链接:https://www.haomeiwen.com/subject/gcjfyttx.html