`

Android 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< 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;

  }
分享到:
评论

相关推荐

    Android ListVIew 拖动Item 删除

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

    Android电子签名pdf加载 签名可拖拽

    在Android平台上,开发一个能够加载PDF文件、实现电子签名并允许签名可拖拽的应用是一项具有挑战性的任务。本文将深入探讨这一技术实现的关键知识点,包括Android PDF处理、电子签名技术以及用户交互设计。 首先,...

    android可拖动排序adapter

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

    安卓自定义View案例

    这两个自定义View案例都涉及到Android图形绘制和事件处理的基础知识,同时也体现了Android开发中的创新思维。在实际项目中,自定义View可以帮助我们实现独一无二的界面和交互,提升用户体验。理解并掌握自定义View的...

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

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

    android 继承viewgroup, 自定义布局,拖动效果,增删效果

    4. **增删效果**: 添加元素通常涉及在`ViewGroup`中插入新的`View`实例,并调用`addView()`方法。删除元素则需要找到要删除的`View`,并调用`removeView()`。为了提供更好的用户体验,我们在添加或删除元素时,不仅...

    Android自定义ListView实现仿QQ可拖拽列表功能

    在本案例中,我们将探讨如何实现一个仿QQ可拖拽列表功能,这个功能允许用户通过手势拖动ListView中的项来重新排序列表。下面我们将逐步解析这个功能的实现过程。 首先,我们需要创建一个布局文件`list_item.xml`,...

    可以拖动的listview

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

    Android 原生实现图文混排编辑器

    如果上述方法无法满足需求,可以考虑创建自定义`View`,继承自`ViewGroup`,并重写`onMeasure`和`onLayout`方法,以实现更复杂的图文混排逻辑。 8. **第三方库**: 虽然本文主要介绍原生实现,但实际开发中,可以...

    Android高级应用源码-类似表格,可拖动,查询信息,也可添加信息.zip

    这个Android高级应用源码主要展示了如何在Android平台上创建一个功能丰富的表格类视图,它具有可拖动、查询以及信息添加的功能。对于Android开发者来说,理解并掌握这些知识点是提升应用交互体验的关键。 首先,...

    Android高级应用源码一个最最基础的图形程序,圆可以拖动,两点触控是删除圆,3点触控是添加一个圆.zip

    这个源码项目"Android高级应用源码一个最最基础的图形程序,圆可以拖动,两点触控是删除圆,3点触控是添加一个圆.zip"提供了一个简单但有趣的实例,展示了如何在Android上实现动态图形操作和多点触控功能。...

    Android RefreshView下拉刷新,上拉加载更多

    android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /&gt; &lt;/androidx.swiperefreshlayout.widget.SwipeRefreshLayout&gt; ``` 2. 设置监听器: 在...

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

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

    安卓Android源码——ListView 中的item随意拖动.zip

    此外,如果拖动的item与其它item重叠,需要有一种机制来决定item的新位置,比如采用交换位置或者插入位置的方式。 最后,考虑到性能问题,我们不能在主线程中执行大量计算或更新操作,以免阻塞UI。因此,数据更新和...

    Android代码-类似表格可拖动查询信息也可添加信息.rar

    2. **Drag and Drop**:实现元素的拖放功能,可以使用Android提供的Draggable View API。通过在RecyclerView的ItemView上启用拖放功能,用户可以轻松地对数据进行重新排序。这通常涉及到实现OnItemTouchListener接口...

    Android ListView下拉刷新 Demo.rar

    SwipeRefreshLayout是Android SDK中内置的一个组件,它可以包裹一个子View,当用户下拉该子View时,会显示一个刷新指示器,同时触发刷新事件。 在"Android ListView下拉刷新 Demo"中,主要涉及以下技术点: 1. **...

    android 新组件RecyclerView及CardView 使用详解

    2. **ItemAnimator**: 支持动画效果,如插入、删除和移动项时的平滑过渡。 3. **Adapter**: 作为数据源与视图之间的桥梁,处理数据与视图的绑定。 4. **ViewHolder**: 提供缓存机制,减少findViewById的调用,提高...

    DayTopNewsChangeTabs-仿今日头条、网易新闻首页动态添加tab,并实现拖拽排序,编辑等.zip

    - 在运行时动态地添加或移除`View`,需要对Android布局管理器有深入理解,比如`LinearLayoutManager`或`GridLayoutManager`。 6. **Adapter模式**: - 为了将数据与UI元素关联,项目中必然使用了`Adapter`,它将...

Global site tag (gtag.js) - Google Analytics