1. 程式人生 > >Android 可拖拽的GridView效果實現, 長按可拖拽和item實時交換

Android 可拖拽的GridView效果實現, 長按可拖拽和item實時交換

Android開發中,我們常常用到ListView和GridView,而有的時候系統的ListView,GridView並不能滿足我們的需求,所以我們需要自己定義一個ListView或者GridView,我的上一篇文章中就是自定義的一個左右滑動刪除item的例子,大家有興趣的可以去看看 Android 使用Scroller實現絢麗的ListView左右滑動刪除Item效果,今天這篇文章就給大家來自定義GridView的控制元件,GridView主要是來顯示網格的控制元件,在Android的開發中使用很普通,相對於TextView,Button這些控制元件來說要來的複雜些,今天給大家帶來長按GridView的item,然後將其拖拽其他item上面,使得GridView的item發生交換,比較典型的就是我們的Launcher,網上有很多關於GridView的拖動的Demo,但是大部分都是相同的,而且存在一些Bug,而且大部分都是點選GridView的item然後進行拖動,或者item之間不進行實時交換,今天給大家更加詳細的介紹GridView拖拽,並且將Demo做的更完美,大家更容易接受,也許很多人聽到這個感覺實現起來很複雜,就關掉的這篇文章,其實告訴大家,只要知道了思路就感覺一點都不復雜了,不信大家可以接著往下看看,首先還是跟大家說說實現的思路

  1. 根據手指按下的X,Y座標來獲取我們在GridView上面點選的item
  2. 手指按下的時候使用Handler和Runnable來實現一個定時器,假如定時時間為1000毫秒,在1000毫秒內,如果手指擡起了移除定時器,沒有擡起並且手指點選在GridView的item所在的區域,則表示我們長按了GridView的item
  3. 如果我們長按了item則隱藏item,然後使用WindowManager來新增一個item的映象在螢幕用來代替剛剛隱藏的item
  4. 當我們手指在螢幕移動的時候,更新item映象的位置,然後在根據我們移動的X,Y的座標來獲取移動到GridView的哪一個位置
  5. 到GridView的item過多的時候,可能一螢幕顯示不完,我們手指拖動item映象到螢幕下方,要觸發GridView想上滾動,同理,當我們手指拖動item映象到螢幕上面,觸發GridView向下滾動
  6. GridView交換資料,重新整理介面,移除item的映象
看完上面的這些思路你是不是找到了些感覺了呢,心裡癢癢的想動手試試吧,好吧,接下來就帶大家根據思路來實現可拖拽的GridView,新建一個專案就叫DragGridView
新建一個類DragGridView繼承GridView,先來看看DragGridView的程式碼,然後在根據程式碼進行相關的講解

  1. package com.example.draggridview;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import
     android.graphics.Bitmap;  
  5. import android.graphics.PixelFormat;  
  6. import android.graphics.Rect;  
  7. import android.os.Handler;  
  8. import android.os.Vibrator;  
  9. import android.util.AttributeSet;  
  10. import android.view.Gravity;  
  11. import android.view.MotionEvent;  
  12. import android.view.View;  
  13. import android.view.WindowManager;  
  14. import android.widget.AdapterView;  
  15. import android.widget.GridView;  
  16. import android.widget.ImageView;  
  17. /** 
  18.  * @blog http://blog.csdn.net/xiaanming  
  19.  *  
  20.  * @author xiaanming 
  21.  * 
  22.  */
  23. publicclass DragGridView extends GridView{  
  24.     /** 
  25.      * DragGridView的item長按響應的時間, 預設是1000毫秒,也可以自行設定 
  26.      */
  27.     privatelong dragResponseMS = 1000;  
  28.     /** 
  29.      * 是否可以拖拽,預設不可以 
  30.      */
  31.     privateboolean isDrag = false;  
  32.     privateint mDownX;  
  33.     privateint mDownY;  
  34.     privateint moveX;  
  35.     privateint moveY;  
  36.     /** 
  37.      * 正在拖拽的position 
  38.      */
  39.     privateint mDragPosition;  
  40.     /** 
  41.      * 剛開始拖拽的item對應的View 
  42.      */
  43.     private View mStartDragItemView = null;  
  44.     /** 
  45.      * 用於拖拽的映象,這裡直接用一個ImageView 
  46.      */
  47.     private ImageView mDragImageView;  
  48.     /** 
  49.      * 震動器 
  50.      */
  51.     private Vibrator mVibrator;  
  52.     private WindowManager mWindowManager;  
  53.     /** 
  54.      * item映象的佈局引數 
  55.      */
  56.     private WindowManager.LayoutParams mWindowLayoutParams;  
  57.     /** 
  58.      * 我們拖拽的item對應的Bitmap 
  59.      */
  60.     private Bitmap mDragBitmap;  
  61.     /** 
  62.      * 按下的點到所在item的上邊緣的距離 
  63.      */
  64.     privateint mPoint2ItemTop ;   
  65.     /** 
  66.      * 按下的點到所在item的左邊緣的距離 
  67.      */
  68.     privateint mPoint2ItemLeft;  
  69.     /** 
  70.      * DragGridView距離螢幕頂部的偏移量 
  71.      */
  72.     privateint mOffset2Top;  
  73.     /** 
  74.      * DragGridView距離螢幕左邊的偏移量 
  75.      */
  76.     privateint mOffset2Left;  
  77.     /** 
  78.      * 狀態列的高度 
  79.      */
  80.     privateint mStatusHeight;   
  81.     /** 
  82.      * DragGridView自動向下滾動的邊界值 
  83.      */
  84.     privateint mDownScrollBorder;  
  85.     /** 
  86.      * DragGridView自動向上滾動的邊界值 
  87.      */
  88.     privateint mUpScrollBorder;  
  89.     /** 
  90.      * DragGridView自動滾動的速度 
  91.      */
  92.     privatestaticfinalint speed = 20;  
  93.     /** 
  94.      * item發生變化回撥的介面 
  95.      */
  96.     private OnChanageListener onChanageListener;  
  97.     public DragGridView(Context context) {  
  98.         this(context, null);  
  99.     }  
  100.     public DragGridView(Context context, AttributeSet attrs) {  
  101.         this(context, attrs, 0);  
  102.     }  
  103.     public DragGridView(Context context, AttributeSet attrs, int defStyle) {  
  104.         super(context, attrs, defStyle);  
  105. 相關推薦

    Android GridView效果實現, item實時交換

    在Android開發中,我們常常用到ListView和GridView,而有的時候系統的ListView,GridView並不能滿足我們的需求,所以我們需要自己定義一個ListView或者GridView,我的上一篇文章中就是自定義的一個左右滑動刪除item的例子,大家有興趣

    Android GridView效果實現, item實時交換

    在Android開發中,我們常常用到ListView和GridView,而有的時候系統的ListView,GridView並不能滿足我們的需求,所以我們需要自己定義一個ListView或者GridView,我的上一篇文章中就是自定義的一個左右滑動刪除item的例子

    android自動化測試中實現

    android應用自動化過程中,會遇見需要長按並拖動的場景,例如類似UC瀏覽器中,長按某個導航中的圖示,使其處於可移動狀態,然後再將其移動到另一個地方,與其它導航圖示換個位置,在robotium中有個drag(float fromX, float toX, float f

    RecyclerView的Item點選事件,增加刪除Item瀑布流動畫效果Item,RecyclerView複雜佈局、實現新聞頻道選擇器

    RecyclerView的Item點選事件的實現,增加和刪除Item使用瀑布流動畫效果,長按拖動Item,RecyclerView複雜佈局的實現使用、RecyclerView去實現今日頭條新聞頻道選擇器。 使用ItemTouchHelper實現Item的拖動交換,由於Recy

    android launcher3事件響應解析事件處理

            AndroidICS4.0版本的launcher拖拽的流程,基本和2.3的相似。就是比2.3寫的封裝的介面多了一些,比如刪除類的寫法就多了個類。等等。4.0的改變有一些,但是不是特別大。這個月一直在改動Launcher的縮圖的效果,4.0的縮圖的功能沒

    android:多次點選效果實現

    public class MainActivity extends AppCompatActivity{ private final static int COUNTS = 5;//點選次數 private final static long VALIDTIME = 1300;/

    Android 卡片邊框模糊陰影效果實現

    1. 使用<shape>標籤實現 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    通過DGUS觸控式螢幕實現、短按鍵啟動不同功能的效果

    DGUS中有一個功能,可能用的人不多,所以不太瞭解,叫“觸控式螢幕按壓狀態返回”。這個控制元件也是一個觸控控制元件,配合頁面上的按鈕來實現觸控功能。“觸控式螢幕按壓狀態返回”與普通的“基本觸控”的主要區別在於,它除了可以實現基本觸控的功能(按鍵效果,頁面切換)外,還可以判斷觸

    在機頂盒應用上,如何實現,並可以持續操作的效果

    專案需求:操作機頂盒應用上的虛擬方向鍵,可以控制攝像頭的上下左右移動,點選一下,響應一次調整攝像頭,這個容易實現;需求是需要長按某個虛擬鍵時,能持續調整攝像頭直到鬆開。 解決方法: 每個View有On

    Android 動態Tab分頁效果實現

        當前專案使用的是TabHost+Activity進行分頁,目前要做個報表功能,需要在一個Tab頁內進行Activity的切換。比方說我有4個Tab頁分別為Tab1,Tab2,Tab3,Tab4,現在的需求是需要將Tab1內的Activity動態切換。找了很多資料最終使用了ActivityGroup解

    Android view滑動懸浮固定效果實現

    1.背景 在專案開發過程中,有時候會碰到這樣的需求:在滑動的過程中,在某時要將子view固定在頂部(常見的是將介面中的tab在滑動到頂部的時候進行固定)。 之前寫過一篇滑動元件懸浮固定在頂部的部落格,但感覺還是有些複雜,因此就有了這次的實現。效果圖: 2.思路 (Coor

    Android RecyclerView (四)初學,實現刪除一個Item.

    在上一篇中,我學到了如何給RecyclerView新增Item監聽器,在這裡,我想做到類似於可以長按某個Item然後彈出一個選單,選擇刪除這個Item的功能。這裡的程式碼我們還是使用前面寫的程式碼. PopupMenu繫結一個menu然後進行顯示。 首先

    h5頁面實現刪除的效果

    直接貼上複製到編輯器中進行檢視效果 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatib

    Android view滑動懸浮固定效果實現-踩坑記

    android新特性:使用CollapsingToolbarLayout實現摺疊效果及問題解決[有比較嚴重的卡頓感]https://www.jianshu.com/p/485223349703CollapsingToolbarLayout有滑動摺疊有嚴重的卡頓,不順暢,實現一

    android中RecyclerView控件實現彈出PopupMenu菜單功能

    mage 有一個 手工 sim pat 創建 .get mco span 之前寫過一篇文章:android中實現簡單的聊天功能 現在是在之前功能的基礎上,添加一個長按聊天記錄,刪除對應聊天記錄的功能 RecyclerView控件,沒有對應的長按事件,我們需要自己手工添加

    RecyclerView的item動排序效果實現它的ItemTouchHelper詳解

    recyclerview這個控制元件太強大了,自帶各種特效,很多高逼格效果需要我們自己簡單組合一下就呈現出來,比如拖動排序!它對拓展簡直是非常open(OCP原則),廢話不扯了,先看效果: 說明: 1.實現這個效果的核心類是:ItemTouchHelpe

    Android中主流狀態列效果實現

    Android在早期的系統版本中,狀態列是不支援修改的,所以開啟任何應用程式會發現頂部的狀態列始終是黑條。在Android 4.4(KitKat)之後,系統的狀態列開始支援開發者定製和修改,包括顯示或隱藏,更改顏色等(嗯,一定是抄襲ios的...),又在Android 5.

    Android setOnCreateContextMenuListener實現ListItem彈出不同選單

        前一段時間做專案需要做一個效果:一個ListActivity,長按不同的item彈出的選單不一樣;如下圖所示我們長按不同的item需要彈出不同標題的menu:     長按事件可以使用ListView的setOnItemLongClick函式進行關聯,但是在響應的onItemLongClick函式裡面

    Android開發之ViewPager+ActionBar+Fragment實現響應式滑動Tab

                      按照一般的思路,我們或許會這麼做:首先,使用getActionBar()方法獲得操作欄,然後我們將操作欄的導航模式設定為Tab,並新增一些Tab,然後實現TabListener介面;其次,我們將多個佈局通過Inflater()方法變成View,然後

    Android廣告輪播圖效果實現

    效果如下: 首先看下一下佈局檔案: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schem