`
gryphone
  • 浏览: 426879 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

View 拖动&插入 研究

阅读更多

 

 

View 拖动&插入

 

 

即: 支持 拖动图标 然后把之插入 2个View 之间

 

 

为了降低难度 选用了若干ImageView 放入ViewGroup : vertical LinearLayout

 

 

 

[代码 步骤]

 

1. 定义布局:main.xml :

 

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


    android:orientation="vertical"


    android:layout_width="fill_parent"


    android:layout_height="fill_parent"


    android:id="@+id/linear"


    >


<ImageButton


    android:layout_width="100dip" 


    android:layout_height="100dip" 


    android:src="@drawable/beijing1_b"/>


<ImageButton


    android:layout_width="100dip" 


    android:layout_height="100dip" 


    android:src="@drawable/beijing2_b"/>


<ImageButton


    android:layout_width="100dip" 


    android:layout_height="100dip" 


    android:src="@drawable/beijing3_b"/>


<ImageButton


    android:layout_width="100dip" 


    android:layout_height="100dip" 


    android:src="@drawable/beijing3_b"/>


</LinearLayout>


 

 

2. 变量初始化

 

lLayout = (LinearLayout)findViewById(R.id.linear);


 

 

3. 定义OnTouchListener 用于监听所有动作  并注册LinearLayour的所有View 实现为:

 

touchListener = new OnTouchListener(){
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				int action = event.getAction();
				
				int x = (int) event.getRawX();
				int y = (int) event.getRawY();
				
				switch(action){
				//鼠标按下 拖拉动作开始
				case MotionEvent.ACTION_DOWN:
					point1 = v.getTop();
					
					startX = (int)event.getX();
					startY = y - v.getTop();
					
					break;
					
				//鼠标移动 拖拉动作进行中
				case MotionEvent.ACTION_MOVE:
					v.layout(x - startX, y - startY, x + v.getWidth()
							- startX, y - startY + v.getHeight());
					v.bringToFront();
					v.postInvalidate();
					
					break;
				//鼠标释放 拖拉动作结束
				case MotionEvent.ACTION_UP:
					point2 = v.getTop();
					
					//计算插入位置 位于哪两个相邻View之间
					int dest = getLocation(v);
					
					//remove ori view, and then add view here
					lLayout.removeView(v);
					lLayout.addView(v, dest);
					break;
				}
				return false;
			}
        	
        };
        
        //to listener all ImageView
        for(int i=0;i<lLayout.getChildCount();i++){
        	ImageView iv = (ImageView)lLayout.getChildAt(i);
        	
        	if(iv !=null){
        		iv.setOnTouchListener(touchListener);
        	}
        	else {
        	//error, view is null!
        	}
        }
 

 

 

 

4. getLocation(View) 用于: 根据目标View 判断待插入的位置 即:哪2个相邻ImageView 之间  实现为:

 

public int getLocation(View v){
    	for(int i=0;i<lLayout.getChildCount()-1;i++){
    		ImageView iv = (ImageView)lLayout.getChildAt(i);
    		ImageView iv2 = (ImageView)lLayout.getChildAt(i+1);
    		
    		if(iv.getTop()< v.getTop() && iv2.getTop() > v.getTop()){
    			//refer delta of point1 & point2
    			if(point1 < point2){//drag to bottom
        			return i+1;
    			}
    			else {//drag to up
    				return i+1;
    			}
    		}
    		
    	}
    	//otherwise return last location
    	return lLayout.getChildCount()-1;
    }

 

 

 

5. emulator 运行截图:

 

- 拖拉前:

 

 

 

- 拖拉后:

 

 

 

分享到:
评论
5 楼 yang_Zhao 2011-11-07  
 
4 楼 han0917 2011-10-20  
mini_dev 写道
如果是9宫格 实现拖放 效果怎么弄呢? GridView能实现么

同问哇!有办法实现么? 
3 楼 mini_dev 2010-08-12  
如果是9宫格 实现拖放 效果怎么弄呢? GridView能实现么
2 楼 zyl小星星 2010-07-05  
拖拽到第一张图片为什么老是和最后一张图片交换位置呢,貌似和第一张图片都换不了位置的。LZ给个解释。
1 楼 xuehui.hf 2010-06-29  
直接上完整代码撒,看片段不爽

相关推荐

    Android代码-AssembleEssay

    自定义 LayoutManager 实现一个流动布局,可以用作文章展示,也可以用作标签展示,并且可以很方便地为其添加布局动画,示例代码里添加了拖拽插入的动画,如效果图。 对齐方式可选4中: 向左对齐 向右对齐 居中对齐 ...

    ios-bar-chart-view:iOS条形图是一种出色的工具,可以用优雅而简单的方式表示数据。 默认外观具有精美的平面设计,它具有用于呈现,插入,删除和更新动作的内置动画功能,并且是完全可自定义的,能够通过属性属性和委托方法来更改颜色,标签文本,字体。 内容由遵循Apple内置控件标准的数据源对象管理

    默认外观具有精美的平面设计,它具有用于呈现,插入,删除和更新动作的内置动画功能,并且是完全可自定义的,能够通过属性属性和委托方法来更改颜色,标签文本,字体。 内容由遵循Apple内置控件标准的数据源对象...

    visio教程PDF

    13.2 使用MS Quick View预览和打开文件 13.2.1 预览和打开Visio文件 13.2.2 打开非Visio文件 13.3 小结 第14章 绘图预览和打印 14.1 使用打印预览窗口 14.1.1 打印预览按钮 14.1.2 其他打印预览...

    Visio 2000 技术大全

    13.2 使用MS Quick View预览和打开文件 13.2.1 预览和打开Visio文件 13.2.2 打开非Visio文件 13.3 小结 第14章 绘图预览和打印 14.1 使用打印预览窗口 14.1.1 打印预览按钮 14.1.2 其他...

    【原型设计工具】Balsamiq Mockups

    但这都不是重点,你完全不用看懂它的语言也可以进行原型设计(该软件本身就是靠自己设计出来),我们也可以在Balsamiq Mockups的菜单里选择View -&gt; Use System Font来输入中文。 Balsamiq Mockups的优点和特色: ...

    微信小程序swiper组件实现抖音翻页切换视频功能的实例代码

    有其他需求也可用 cover-view 添加 收藏 点赞 评论等功能 效果图: video官方介绍: https://developers.weixin.qq.com/miniprogram/dev/component/video.html swiper官方介绍: ...

    FastReport问题集

    A: 拖动页标签到目的位置。 Q: 我想查看所有的字段及变量,我想在报表中使用列表来实现它? A: 设置 TfrReport.MixVariablesAndDBFields := True.现在,所有的数据字段及变量可在“插入数据字段”对话框中可存取...

    autocad命令全集

    序号 CAD命令 简写 用途 1 3D   创建三维实体 2 3DARRAY 3A 三维阵列 3 3DCLIP   设置剪切平面位置 4 3DCORBLT   继续执行3DORBIT命令 5 3DDISTANCE   距离调整 6 3DFACE 3F 绘制三维曲面 ...302 VIEW –V...

    计算机应用基础(专升本)阶段性作业2学习资料.doc

    要设置幻灯片背景为view.jpg图画,需要对幻灯片进行的操作是_____。(4分) (A) 插入 图片 来至文件 (B) 插入 图片 剪贴画 (C) 背景 效果填充 图片 (D) 背景 渐变 预设 参考答案:C 8. 设置背景时,若使所选择的...

    JavaScript Table行定位效果

    ps:该效果用来做tr的拖动会很方便。 接着想到的是给table插入一个新tr,克隆原来的tr,并设置这个tr为fixed(ie6为absolute),例如: Code &lt;!DOCTYPE ...

    EXCEL集成工具箱V6.0

    【插入行数】 对工作表隔行插入行并可以复制标题行,其中对相隔行数、插入行数等可以自定义。 【注解样式】 可以插入多达50种样式的注解,支持随时切换当前注解样式为指定的样式。 【工作表拆分】 将当前工作表的...

    js使用小技巧

    查看网页源代码 onclick="window.location = "view-source:"+ "http://www.csdn.net/""&gt; 关闭输入法 自动全选 ()"&gt; ENTER键可以让光标移到下一个输入框 (event.keyCode==13)event.keyCode=9"&gt; 文本框的...

    flash shiti

    6.Flash查看(View)菜单中,Work Area表示? A. 将作品编辑区域以“工作区”方式显示 B. 在编辑区域中显示标尺 C. 在编辑区域中显示底格辅助线 D. 设置“磁铁”功能 7.Flash5中,Common Library默认共有几类公用...

    Altium Designer Beta 19.0.10完整版安装包+安装教程+和谐文件

    解决了IPC Compliant Footprint Wizard中的回归问题,当未选择Full Matrix时,无法更改(或插入)LGA,BGA包布局选项的任何参数。 26459 修复了“属性”面板中的“网络类别”排序,以匹配软件其他区域中使用的网络...

    C#编程经验技巧宝典

    43 &lt;br&gt;0061 树的实现 44 &lt;br&gt;3.2 排序 48 &lt;br&gt;0062 如何实现选择排序算法 48 &lt;br&gt;0063 如何实现冒泡排序算法 49 &lt;br&gt;0064 如何实现快速排序算法 50 &lt;br&gt;0065 如何实现插入排序算法 ...

    delphi 开发经验技巧宝典源码

    0089 实现直接插入法排序 61 第4章 函数应用 63 4.1 字符串处理函数 64 0090 使用Uppercase函数将小写字母转换为大写字母 64 0091 使用Lowercase函数将大写字母转换为小写字母 64 0092 使用Copy函数获取...

    delphi 开发经验技巧宝典源码06

    0089 实现直接插入法排序 61 第4章 函数应用 63 4.1 字符串处理函数 64 0090 使用Uppercase函数将小写字母转换为大写字母 64 0091 使用Lowercase函数将大写字母转换为小写字母 64 0092 使用Copy函数获取...

Global site tag (gtag.js) - Google Analytics