View 拖动&插入

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

 

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

 

[代码 步骤]

 

1. 定义布局:main.xml :

 

Xml代码
  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2.   
  3.   
  4. < LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"   
  5.   
  6.   
  7.     android:orientation = "vertical"   
  8.   
  9.   
  10.     android:layout_width = "fill_parent"   
  11.   
  12.   
  13.     android:layout_height = "fill_parent"   
  14.   
  15.   
  16.     android:id = "@+id/linear"   
  17.   
  18.   
  19.     >   
  20.   
  21.   
  22. < ImageButton   
  23.   
  24.   
  25.     android:layout_width = "100dip"    
  26.   
  27.   
  28.     android:layout_height = "100dip"    
  29.   
  30.   
  31.     android:src = "@drawable/beijing1_b" />   
  32.   
  33.   
  34. < ImageButton   
  35.   
  36.   
  37.     android:layout_width = "100dip"    
  38.   
  39.   
  40.     android:layout_height = "100dip"    
  41.   
  42.   
  43.     android:src = "@drawable/beijing2_b" />   
  44.   
  45.   
  46. < ImageButton   
  47.   
  48.   
  49.     android:layout_width = "100dip"    
  50.   
  51.   
  52.     android:layout_height = "100dip"    
  53.   
  54.   
  55.     android:src = "@drawable/beijing3_b" />   
  56.   
  57.   
  58. < ImageButton   
  59.   
  60.   
  61.     android:layout_width = "100dip"    
  62.   
  63.   
  64.     android:layout_height = "100dip"    
  65.   
  66.   
  67.     android:src = "@drawable/beijing3_b" />   
  68.   
  69.   
  70. </ LinearLayout >   

 

 

2. 变量初始化

 

Java代码
  1. lLayout = (LinearLayout)findViewById(R.id.linear);  
lLayout = (LinearLayout)findViewById(R.id.linear);


 

 

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

 

Java代码
  1. touchListener =  new  OnTouchListener(){  
  2.             @Override   
  3.             public   boolean  onTouch(View v, MotionEvent event) {  
  4.                 // TODO Auto-generated method stub   
  5.                 int  action = event.getAction();  
  6.                   
  7.                 int  x = ( int ) event.getRawX();  
  8.                 int  y = ( int ) event.getRawY();  
  9.                   
  10.                 switch (action){  
  11.                 //鼠标按下 拖拉动作开始   
  12.                 case  MotionEvent.ACTION_DOWN:  
  13.                     point1 = v.getTop();  
  14.                       
  15.                     startX = (int )event.getX();  
  16.                     startY = y - v.getTop();  
  17.                       
  18.                     break ;  
  19.                       
  20.                 //鼠标移动 拖拉动作进行中   
  21.                 case  MotionEvent.ACTION_MOVE:  
  22.                     v.layout(x - startX, y - startY, x + v.getWidth()  
  23.                             - startX, y - startY + v.getHeight());  
  24.                     v.bringToFront();  
  25.                     v.postInvalidate();  
  26.                       
  27.                     break ;  
  28.                 //鼠标释放 拖拉动作结束   
  29.                 case  MotionEvent.ACTION_UP:  
  30.                     point2 = v.getTop();  
  31.                       
  32.                     //计算插入位置 位于哪两个相邻View之间   
  33.                     int  dest = getLocation(v);  
  34.                       
  35.                     //remove ori view, and then add view here   
  36.                     lLayout.removeView(v);  
  37.                     lLayout.addView(v, dest);  
  38.                     break ;  
  39.                 }  
  40.                 return   false ;  
  41.             }  
  42.               
  43.         };  
  44.           
  45.         //to listener all ImageView   
  46.         for ( int  i= 0 ;i<lLayout.getChildCount();i++){  
  47.             ImageView iv = (ImageView)lLayout.getChildAt(i);  
  48.               
  49.             if (iv != null ){  
  50.                 iv.setOnTouchListener(touchListener);  
  51.             }  
  52.             else  {  
  53.             //error, view is null!   
  54.             }  
  55.         }  
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 之间  实现为:

 

Java代码
  1. public   int  getLocation(View v){  
  2.         for ( int  i= 0 ;i<lLayout.getChildCount()- 1 ;i++){  
  3.             ImageView iv = (ImageView)lLayout.getChildAt(i);  
  4.             ImageView iv2 = (ImageView)lLayout.getChildAt(i+1 );  
  5.               
  6.             if (iv.getTop()< v.getTop() && iv2.getTop() > v.getTop()){  
  7.                 //refer delta of point1 & point2   
  8.                 if (point1 < point2){ //drag to bottom   
  9.                     return  i+ 1 ;  
  10.                 }  
  11.                 else  { //drag to up   
  12.                     return  i+ 1 ;  
  13.                 }  
  14.             }  
  15.               
  16.         }  
  17.         //otherwise return last location   
  18.         return  lLayout.getChildCount()- 1 ;  
  19.     }  
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 运行截图:

 

- 拖拉前:

 

 

 

- 拖拉后:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值