AndroidView拖动&插入研究


  View拖动&插入

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

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

  [代码步骤]

  1.定义布局:main.xml:

  Xml代码

  <?xmlversion="1.0"encoding="utf-8"?>

  <LinearLayoutxmlns: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>

  <?xmlversion="1.0"encoding="utf-8"?>

  <LinearLayoutxmlns: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.变量初始化

  Java代码

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

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

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

  Java代码

  touchListener=newOnTouchListener(){

  @Override

  publicbooleanonTouch(Viewv,MotionEventevent){

  //TODOAuto-generatedmethodstub

  intaction=event.getAction();

  intx=(int)event.getRawX();

  inty=(int)event.getRawY();

  switch(action){

  //鼠标按下拖拉动作开始

  caseMotionEvent.ACTION_DOWN:

  point1=v.getTop();

  startX=(int)event.getX();

  startY=y-v.getTop();

  break;

  //鼠标移动拖拉动作进行中

  caseMotionEvent.ACTION_MOVE:

  v.layout(x-startX,y-startY,x+v.getWidth()

  -startX,y-startY+v.getHeight());

  v.bringToFront();

  v.postInvalidate();

  break;

  //鼠标释放拖拉动作结束

  caseMotionEvent.ACTION_UP:

  point2=v.getTop();

  //计算插入位置位于哪两个相邻View之间

  intdest=getLocation(v);

  //removeoriview,andthenaddviewhere

  lLayout.removeView(v);

  lLayout.addView(v,dest);

  break;

  }

  returnfalse;

  }

  };

  //tolistenerallImageView

  for(inti=0;i<p>

  ImageViewiv=(ImageView)lLayout.getChildAt(i);

接上页

  if(iv!=null){

  iv.setOnTouchListener(touchListener);

  }

  else{

  //error,viewisnull!

  }

  }

  touchListener=newOnTouchListener(){

  @Override

  publicbooleanonTouch(Viewv,MotionEventevent){

  //TODOAuto-generatedmethodstub

  intaction=event.getAction();

  intx=(int)event.getRawX();

  inty=(int)event.getRawY();

  switch(action){

  //鼠标按下拖拉动作开始

  caseMotionEvent.ACTION_DOWN:

  point1=v.getTop();

  startX=(int)event.getX();

  startY=y-v.getTop();

  break;

  //鼠标移动拖拉动作进行中

  caseMotionEvent.ACTION_MOVE:

  v.layout(x-startX,y-startY,x+v.getWidth()

  -startX,y-startY+v.getHeight());

  v.bringToFront();

  v.postInvalidate();

  break;

  //鼠标释放拖拉动作结束

  caseMotionEvent.ACTION_UP:

  point2=v.getTop();

  //计算插入位置位于哪两个相邻View之间

  intdest=getLocation(v);

  //removeoriview,andthenaddviewhere

  lLayout.removeView(v);

  lLayout.addView(v,dest);

  break;

  }

  returnfalse;

  }

  };

  //tolistenerallImageView

  for(inti=0;i<p>

  ImageViewiv=(ImageView)lLayout.getChildAt(i);

  if(iv!=null){

  iv.setOnTouchListener(touchListener);

  }

  else{

  //error,viewisnull!

  }

  }

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

  Java代码

  publicintgetLocation(Viewv){

  for(inti=0;i<p>

 接上页

  ImageViewiv=(ImageView)lLayout.getChildAt(i);

  ImageViewiv2=(ImageView)lLayout.getChildAt(i+1);

  if(iv.getTop()<v.getTop()&&iv2.getTop()>v.getTop()){

  //referdeltaofpoint1&point2

  if(point1<point2){//dragtobottom

  returni+1;

  }

  else{//dragtoup

  returni+1;

  }

  }

  }

  //otherwisereturnlastlocation

  returnlLayout.getChildCount()-1;

  }

  publicintgetLocation(Viewv){

  for(inti=0;i<p>

  ImageViewiv=(ImageView)lLayout.getChildAt(i);

  ImageViewiv2=(ImageView)lLayout.getChildAt(i+1);

  if(iv.getTop()<v.getTop()&&iv2.getTop()>v.getTop()){

  //referdeltaofpoint1&point2

  if(point1<point2){//dragtobottom

  returni+1;

  }

  else{//dragtoup

  returni+1;

  }

  }

  }

  //otherwisereturnlastlocation

  returnlLayout.getChildCount()-1;

  }

  5.emulator
运行截图:

  -拖拉前:

  -拖拉后:

更多相关文章

  1. Android中BroadcastReceiver(异步接收广播Intent)的使用
  2. Java,Android内存泄漏代码片段
  3. Android(安卓)本地代码中的LIKELY和UNLIKELY宏
  4. Android学习笔记(十七)——使用意图调用内置应用程序
  5. android 播放器合集打包(源码来源网络)
  6. android TextView实现自动滚动和Java中改变显示内容
  7. Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码
  8. android 10.0 以上隐藏方法无法调用 #Accessing hidden method
  9. AndroidStudio配置使用lambda

随机推荐

  1. android:xmlns的作用以及自定义
  2. Android(安卓)Activity启动流程分析
  3. Android作业之组建通讯与后台服务 1
  4. EPSON Printer 打印机 Sdk For Android
  5. 《Frida高级逆向》训练营,7 月再开营!
  6. Android(安卓)Studio中学习Android(安卓)
  7. 每天记录学习的新知识 :蓝牙BLE数据传输记
  8. Android之隐式意图(Intent)如何查找匹配
  9. android消息机制总结
  10. Develop--Training(二)Getting Started--