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< p>  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< p>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;  }

更多相关文章

  1. Android(安卓)ViewDragHelper
  2. Android(安卓)常用的intent Action整理
  3. Android(安卓)Things HelloWorld
  4. Android(安卓)ListView拖动一条记录时,整体背景全黑的问题
  5. ListView/GridView 按住拖动黑线框/桌面背景透上来【已解决】
  6. 画图轻量级
  7. Android手势:单指拖动、双指缩放图片
  8. Android(安卓)SQLite批量插入数据速度解决方案
  9. Android(安卓)Framework移植----长按返回键结束程序

随机推荐

  1. TaskAffinity
  2. Android(安卓)Permission大全
  3. TabLayout+ViewPager+Fragment实现底部导
  4. Android权限系统(二):开机授予运行时权限
  5. android Intent的FLAG_ACTIVITY_CLEAR_TO
  6. 向sdcard添加文件fail可能的情况
  7. android操作SQLite
  8. Android数据的四种存储方式SharedPrefere
  9. Android(安卓)studio 为项目添加启动等待
  10. android 如何快速生成jar包