• [Android-Demo]Android View的拖动


    请善用目录

    Demo下载地址:http://download.csdn.net/detail/u011634756/5959637 (免积分哦~

    -----------------------------华丽的分割线---------------------------------

    一. 骨头

    1. view的拖动首先我们的获取拖动的坐标即 : onTouchEvent 事件
    2. 坐标获取到了,那么我们需要把坐标给实现 即: View.layout(left, top, right, bottom);

    3. 在实现这个坐标的时候我们的有一个小小的逻辑 即: 移动的距离和坐标的转换

    二. 肉

    1. OnTouchListener 这个的实现就不赘述了

    2. 讲一下View.layout(left, top, right, bottom)  这四个参数


    从上图中可以很清晰的看到 left, top, right, bottom 4个分别是对应的是和父View的距离。 

    为了证明我们说的是对的,这里我们的demo中进行了研究

    当固定X轴的时候 ,也就是 left = 0 right = view的宽度

    v.layout(0, top, v.getWidth(), bottom);

    当拖动的时候一直是在方框的最左边一直在上下移动


    当固定Y轴的时候 , 也就是 top = 0 ; bottom= view的高度

    v.layout(left, 0, right, v.getHeight());

    当拖动的时候一直是在方框的最顶端左右移动

    注意: 我们的父组件是那个方框 上下左右都有空隙的哦, 大家一定要哈下满的getRawX 区分开来

    3. 小逻辑

    在拖动的时候 我们有一个MotionEvent.getX()和 MotionEvent.getRawX() ,这个应该也有好多小伙伴不明白,下面上图讲述看一下


    结论:getX是获取以widget左上角为坐标原点计算的X轴坐标直.
    getRawX 获取的是以屏幕左上角为坐标原点计算的X轴坐标直.

    在详细一点可以去这个博文看一下

    4. 主要的源码

    	/**
    	 * onTouchEvent的监听事件,
    	 * 拖动的主要实现方法
    	 * @author yuhaiyang
    	 */
    	private class MyOnTouchListener implements OnTouchListener{
    		
    		/**
    		 * 这有一点要说明的是 ****小理解点*******
    		 * 1. event.getX : 是以 widget(控件) 的左上角 为 原点的 X坐标
    		 *    event.getRawX() : 是以 屏幕左上角 为原点的 X坐标
    		 * 2. View.layout(left, top, right, bottom);
    		 * 		left   :   控件左端以   父  控件的 左上角为原点的X坐标
    		 * 		top    :   控件顶端以   父  控件的 左上角为原点的Y坐标
    		 * 		right  :   控件右端以   父  控件的 左上角为原点的X坐标
    		 * 		bottom :  控件底端以   父  控件的 左上角为原点的Y坐标
    		 * 这个地方如果不明白会在博客上图说明。
    		 */
    
    		@Override
    		public boolean onTouch(View v, MotionEvent event) {
    			/**
    			 * 这个地方的逻辑是:
    			 * 在 down 的时候记录一下距离屏幕左上角的距离
    			 * 然后move的时候来再来计算一下距离
    			 * 2着的差值就是分别 x轴和y轴移动的距离
    			 */
    			switch(event.getAction()){
    			case MotionEvent.ACTION_DOWN :
    				//   按下的时候距离屏幕左上角的距离
    				lastX = (int) event.getRawX();
    				lastY = (int) event.getRawY();				
    				break;
    			case MotionEvent.ACTION_MOVE :
    				//   移动的时候距离屏幕左上角的距离
    				int nowX = (int)event.getRawX();
    				int nowY = (int)event.getRawY();
    				// X轴和Y轴移动的距离
    				int moveX = nowX - lastX;
    				int moveY = nowY -lastY;
    				// 分别计算距离
    				int top = v.getTop() + moveY;
    				int bottom = v.getBottom() + moveY;
    				int left =  v.getLeft() + moveX;
    				int right = v.getRight() + moveX;
    				
    				// 这个地方是控制 那个轴固定的的 
    				if(mFix == FIX_X){
    					v.layout(0, top, v.getWidth(), bottom);
    				}else if (mFix == FIX_Y){
    					v.layout(left, 0, right, v.getHeight());
    				}else{
    					v.layout(left, top, right, bottom);
    				}
    				
    				lastX = (int) event.getRawX();
    				lastY = (int) event.getRawY();		
    				
    				break;
    			case MotionEvent.ACTION_UP:
    				break;
    			}
    			return false;
    		}
    		
    	}
    	

    5. 效果图




    ====================关注小鱼===================

    新浪微博http://weibo.com/AwareMissing

    腾讯微博http://t.qq.com/y_haiyang



  • 相关阅读:
    终端时钟与时钟源偏差40秒异常处理
    (原创)odoo one2many字段以子列表形式显示
    (原创)odoo动态设置树形视图中的字段,每个用户可定制自己要显示的字段
    (原创)odoo14下qweb模板的前端与后端语法区别
    nginx安装前奏
    MySQL破解root用户密码
    Docker创建运行多个mysql容器
    判断pcie卡插在哪个cpu上
    虚拟化之Hypervisor
    HCIA-Cloud Computer笔记
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3262710.html
Copyright © 2020-2023  润新知