`
gryphone
  • 浏览: 433508 次
  • 性别: 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  
直接上完整代码撒,看片段不爽

相关推荐

    HexView_hexview如何使用_hexview教程_hexviewdll_hexBIN浏览_hexview_源码.zip

    《HexView工具详解:从基础到精通》 HexView是一款强大的十六进制查看与编辑工具,对于计算机专业人士,特别是程序员、系统管理员以及数据分析师来说,它是一个不可或缺的实用工具。本文将详细介绍HexView的使用...

    QT实现可拖拽排序的表格

    为了使拖拽效果流畅,可以使用QGraphicsView和QGraphicsItem来创建一个临时的行表示,随着鼠标移动而显示。这可以通过创建一个新的QGraphicsView类,添加行的QGraphicsItem,并在鼠标移动时更新其位置来实现。当鼠标...

    PPT中要实现图片或图形的任意拖拽

    在PPT中,为了实现图片或图形的动态交互,例如任意拖拽,通常需要借助于VBA(Visual Basic for Applications)编程。VBA是Microsoft Office应用程序内置的一种编程接口,允许用户自定义功能和操作。在PPT中,我们...

    安卓自定义View案例

    4. **附加功能**:例如,添加图片功能可能需要集成ImageSpan,使用户能够在文本中插入图片,并确保图片随着文本的编辑而正确对齐和缩放。 这两个自定义View案例都涉及到Android图形绘制和事件处理的基础知识,同时...

    Swift基础之仿资讯类实现频道的长按拖拽

    在这个基类中,我们可以定义与拖拽相关的属性,如拖动状态、初始位置等。同时,我们需要监听触摸事件,以便在用户长按时启动拖拽操作。 ```swift class RearrangeableView: UIView { var isDragging = false var ...

    Android-看板视图支持整列拖拽单个Item拖拽跨列拖拽放大缩小等

    此功能需要精确的坐标计算,确保Item在拖动过程中能正确地插入到新的列中。 4. 放大缩小:看板视图的放大缩小功能提供了一种查看细节或全局视图的方式。在Android中,可以利用ScaleGestureDetector来检测用户的缩放...

    一个可拖动、好看的歌词View.zip

    在Android开发中,为应用程序添加生动且用户友好的功能总是能提升用户体验,"一个可拖动、好看的歌词View.zip"就是一个这样的开源项目,专为Android平台设计,旨在提供美观且互动性强的歌词显示功能。这个项目名为...

    systemview教程

    - **文档整合能力**: SystemView支持将仿真结果以图形形式插入到Word等文档中,便于撰写技术报告。 - **多层次设计**: 通过MetaSystem(子系统)功能,可以构建复杂的系统层级结构,使得设计更加清晰有序。 - **多...

    QT 拖拽实现2个控件的数据交互

    对于QTreeWidget和QTableWidget,我们可能还需要处理数据的插入、移动或删除操作,确保模型(model)和视图(view)保持同步。 在实现自排序拖放时,我们可能需要在`dropEvent()`中对模型进行排序。例如,我们可以...

    QlikView Tutorial (zh-CN).pdf

    - **移动工作表对象**:直接拖拽对象到目标位置。 - **撤销布局更改**:如果误操作,可以撤销最近的操作。 - **复制工作表对象**:使用复制和粘贴功能。 - **调整工作表对象大小**:拖动对象边缘改变大小。 - *...

    android可拖动排序adapter

    - **拖动过程**:在拖动过程中,`DragSortAdapter`会实时更新列表,将原位置的项暂时移除,同时在新位置插入浮动视图,以模拟拖动效果。 - **拖动结束**:用户松手后,`DragSortAdapter`会根据当前的位置更新数据源...

    QGraphicsview_test.7z

    在给定的“QGraphicsview_test.7z”压缩包文件中,我们可以推测它包含了一些与Qt库中的QGraphicsView组件相关的示例或测试代码。QGraphicsView是Qt GUI编程中一个重要的部件,用于显示复杂的2D图形场景,支持缩放、...

    Android ListVIew 拖动Item 删除

    为了实现拖动功能,我们还需要一个自定义的Adapter,它需要知道如何在数据集中插入、删除和更新项。在ACTION_DRAG_ENDED时,我们调用Adapter的notifyDataSetChanged()方法,让ListView重新渲染,反映数据集的变化。 ...

    在EditText中插入图片

    需要注意的是,这只是一个基本框架,实际开发中可能需要根据项目需求进行更多的定制和优化,例如支持多图插入、图片缩放、拖动调整等。 在项目实践中,可以参考压缩包中的文件`insert pic into edittext`,这些文件...

    QT 画图工具 源码 图片插入,画图

    QT 画图工具是一款基于Qt库开发的应用程序,它提供了用户友好的图形界面,用于创建、编辑和插入图片。在这款应用中,你可以利用Qt的绘图功能进行自由绘画,或者导入图片进行处理。以下是对这个项目源码的详细解析和...

    QT Tree View控件的使用

    用户可以通过拖动列头调整列宽,通过展开和折叠节点来显示或隐藏子节点。 二、添加同级节点 在QT Tree View中,添加同级节点通常涉及到QStandardItemModel或QAbstractItemModel的使用。首先创建一个QStandardItem...

    可以拖动的listview

    7. **性能优化**: ListView通常会复用视图(view recycling),以提高性能。在拖动排序时,要注意在`getView()`中正确设置每个item的状态,避免因视图复用导致的显示混乱。 8. **状态保存与恢复**: 如果应用在拖动...

    可拖动listview

    总的来说,实现可拖动的ListView并支持分组管理涉及到了Android的Drag and Drop API、自定义View、数据模型和适配器的改造等多个方面。通过这些技术,我们可以创建出更加互动和用户友好的应用界面,提升用户体验。在...

    listview 拖拽移位

    "listview 拖拽移位"是指在ListView的基础上增加一个特性,允许用户通过触摸屏幕并拖动ListView中的条目来改变它们的顺序。这种功能在很多应用中都有应用,例如待办事项列表或联系人管理器,让用户可以直观地调整...

    treeview之间的拖拽以及右键,保存到数据库

    这可能涉及到SQL查询的编写,数据的插入、更新或删除操作。 6. **规则验证(Rules.cs)**:在某些情况下,可能需要在操作前进行一些验证,例如检查拖放的目标位置是否合法,或者在保存到数据库前确认数据的完整性和...

Global site tag (gtag.js) - Google Analytics