您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 3浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

viewgroup实现item拖动效果

xiangzhihong8 发布时间:2013-12-27 09:18:16 ,浏览量:3

网络上关于GridView可拖动的例子已经不少了,包括带动画不带动画的都有一堆,但几乎都是通过继承Android原生控件GridView来扩展的,当然这种实现方式是很容易联想到的,也是最容易实现的。我随便百度了一下,就有一个:http://zhangcb666.blog.163.com/blog/static/4696352920124221043837/,大家可以参考一下,我这里就不赘述了。

今天跟大家分享另外一种方式,通过继承ViewGroup来实现,我们都知道,ViewGroup可以填充很多个View,因此,我觉得可以类似把GridView的每一个Item填充到我们自定义的ViewGroup中,然后监听长按时间,实现拖动的效果,同时加上动画效果,个人感觉比网上其他实现方式更加简洁和美观,唯一的缺点就是:没有setAdapter的函数,添加的item,需要我们手动add到ViewGroup中,如果item不是特别复杂和繁多,个人觉得也不算什么问题。好了,废话不多说,我们先来看看效果图,第一张是静态效果,第二张是拖动时的效果图。

  

其实代码也是很简单的,总共就两个类:一个自定义控件DragGridView,还有一个使用的例子MainActivity。

我们先来看看DragGridView的代码部分:

[java] view plain copy
  1. /** 
  2.  * 另外一种方式实现动画可拖动item的GridView 
  3.  *  
  4.  * @author way 
  5.  *  
  6.  */  
  7. public class DragGridView extends ViewGroup implements View.OnTouchListener,  
  8.         View.OnClickListener, View.OnLongClickListener {  
  9.     // layout vars  
  10.     public static float childRatio = .9f;  
  11.     protected int colCount, childSize, padding, dpi, scroll = 0;  
  12.     protected float lastDelta = 0;  
  13.     protected Handler handler = new Handler();  
  14.     // dragging vars  
  15.     protected int dragged = -1, lastX = -1, lastY = -1, lastTarget = -1;  
  16.     protected boolean enabled = true, touching = false;  
  17.     // anim vars  
  18.     public static int animT = 150;  
  19.     protected ArrayList newPositions = new ArrayList();  
  20.     // listeners  
  21.     protected OnRearrangeListener onRearrangeListener;  
  22.     protected OnClickListener secondaryOnClickListener;  
  23.     private OnItemClickListener onItemClickListener;  
  24.   
  25.     /** 
  26.      * 拖动item的接口 
  27.      */  
  28.     public interface OnRearrangeListener {  
  29.   
  30.         public abstract void onRearrange(int oldIndex, int newIndex);  
  31.     }  
  32.   
  33.     // CONSTRUCTOR AND HELPERS  
  34.     public DragGridView(Context context, AttributeSet attrs) {  
  35.         super(context, attrs);  
  36.         setListeners();  
  37.         handler.removeCallbacks(updateTask);  
  38.         handler.postAtTime(updateTask, SystemClock.uptimeMillis() + 500);  
  39.         setChildrenDrawingOrderEnabled(true);  
  40.   
  41.         DisplayMetrics metrics = new DisplayMetrics();  
  42.         ((Activity) context).getWindowManager().getDefaultDisplay()  
  43.                 .getMetrics(metrics);  
  44.         dpi = metrics.densityDpi;  
  45.     }  
  46.   
  47.     protected void setListeners() {  
  48.         setOnTouchListener(this);  
  49.         super.setOnClickListener(this);  
  50.         setOnLongClickListener(this);  
  51.     }  
  52.   
  53.     @Override  
  54.     public void setOnClickListener(OnClickListener l) {  
  55.         secondaryOnClickListener = l;  
  56.     }  
  57.   
  58.     protected Runnable updateTask = new Runnable() {  
  59.         public void run() {  
  60.             if (dragged != -1) {  
  61.                 if (lastY  0)  
  62.                     scroll -= 20;  
  63.                 else if (lastY > getBottom() - getTop() - (padding * 3)  
  64.                         && scroll = getChildCount())  
  65.             return -1;  
  66.         return index;  
  67.     }  
  68.   
  69.     protected int getColOrRowFromCoor(int coor) {  
  70.         coor -= padding;  
  71.         for (int i = 0; coor > 0; i++) {  
  72.             if (coor  -1)  
  73.             target = rightPos;  
  74.         else if (leftPos > -1)  
  75.             target = leftPos + 1;  
  76.         if (dragged   
  77.   
  78.   
  79.       
  80.   
  81.       
  82.   
  83.       
  84.   
  85.   
最后就可以直接在代码中调用了MainActivity:

[java] view plain copy
  1. /** 
  2.  * MainActivity 
  3.  *  
  4.  * @author way 
  5.  *  
  6.  */  
  7. public class MainActivity extends Activity {  
  8.     static Random random = new Random();  
  9.     static String[] words = "我 是 一 只 大 笨 猪".split(" ");  
  10.     DragGridView mDragGridView;  
  11.     Button mAddBtn, mViewBtn;  
  12.     ArrayList poem = new ArrayList();  
  13.   
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.   
  19.         mDragGridView = ((DragGridView) findViewById(R.id.vgv));  
  20.         mAddBtn = ((Button) findViewById(R.id.add_item_btn));  
  21.         mViewBtn = ((Button) findViewById(R.id.view_poem_item));  
  22.   
  23.         setListeners();  
  24.     }  
  25.   
  26.     private void setListeners() {  
  27.         mDragGridView.setOnRearrangeListener(new OnRearrangeListener() {  
  28.             public void onRearrange(int oldIndex, int newIndex) {  
  29.                 String word = poem.remove(oldIndex);  
  30.                 if (oldIndex 
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.0450s