Android為View添加拖放效果的方法實例
1.引言
在開發中,拖放是一種比較常見的手勢操作,使用它能夠讓應用的交互更加地便捷和友好,本文將簡要介紹如何為Android中的View添加拖放效果。
2.主要方法和類介紹
2.1 startDragAndDrop()和startDrag()
要實現View的拖放,需要調用View的startDragAndDrop()或startDrag()方法,其中startDragAndDrop()方法要求API版本為24或以上,調用方法後,View便可以拖動瞭,此方法需要傳遞的參數如下:
//data:拖放操作要傳遞的數據 //shadowBuilder:拖放陰影 //myLocalState:一個包含與拖放操作有關的數據的對象 //flags:控制拖放操作的標志位 public final boolean startDragAndDrop(ClipData data, DragShadowBuilder shadowBuilder,Object myLocalState, int flags)
2.2 setOnDragListener()
接收拖放事件的View我們暫且稱之為目標View,目標View調用setOnDragListener(),並實現其中的方法onDrag()後可以接收拖放事件的回調。
2.3 View.DragShadowBuilder
在拖放操作進行的時候,需要顯示正在拖動的圖片,View.DragShadowBuilder類提供瞭可以傳入View的構造方法,這個View是被拖放的View,我們將通過DragShadowBuilder創建的拖動圖片稱為拖動陰影,這個將作為參數傳入startDragAndDrop()或startDrag()方法中,如若有需要的話,還可以繼承View.DragShadowBuilder類去實現自定義的效果。
2.4 DragEvent
此類主要定義瞭拖放事件的類型,通過event.getAction()可以獲取不同的事件類型,主要有以下幾種:
//DragEvent.ACTION_DRAG_STARTED:表示拖動已經開始 //DragEvent.ACTION_DRAG_ENTERED:表示拖動陰影已經進入目標View //DragEvent.ACTION_DRAG_LOCATION:拖動陰影在目標View邊界內移動時會多次響應此事件 //DragEvent.ACTION_DRAG_EXITED:表示拖動陰影離開瞭目標View的邊界 //DragEvent.ACTION_DROP:表示拖動陰影被釋放 //DragEvent.ACTION_DRAG_ENDED:表示拖放操作即將結束,在此處需要通過調用event.getResult()的返回值來判斷拖放操作是否成功
3. 演示將一張圖片拖放到方框內
現在演示將一張圖片拖放到方框內,來說明拖放操作的大致流程,其中方框是一個LinearLayout,為它設置瞭一個方框背景。
3.1 簡易佈局
佈局如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/iv_drag" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerHorizontal="true" android:src="@mipmap/ic_launcher" /> <LinearLayout android:id="@+id/ll_accept" android:layout_width="300dp" android:layout_height="300dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="50dp" android:background="@drawable/black_bac" android:orientation="vertical"> </LinearLayout> </RelativeLayout>
3.2 操作被拖放的圖片
實現長按拖動圖片的效果,首先調用setOnLongClickListener()設置長按事件回調,之後構建ClipData和拖動陰影,然後調用startDragAndDrop()或startDrag()方法實現拖動,代碼如下:
iv_drag.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { CharSequence charSequence = (CharSequence) iv_drag.getTag(); ClipData.Item item = new ClipData.Item(charSequence); ClipData clipData = new ClipData(charSequence, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item); View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(iv_drag); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { iv_drag.startDragAndDrop(clipData, shadowBuilder, null, 0); } else { iv_drag.startDrag(clipData, shadowBuilder, null, 0); } return true; } });
3.3 方框接收圖片
目標View要接收圖片需要先調用setOnDragListener()來接受拖放事件的回調,使用event.getAction()來獲取不同的拖放事件類型,然後根據事件類型執行相應的操作,示例如下:
ll_accept.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: iv_drag.setVisibility(View.GONE); if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { return true; } return false; case DragEvent.ACTION_DRAG_ENTERED: isChangePos = true; ll_accept.setBackgroundResource(R.drawable.green_bac); return true; case DragEvent.ACTION_DRAG_LOCATION: x = event.getX(); y = event.getY(); return true; case DragEvent.ACTION_DRAG_EXITED: isChangePos = false; ll_accept.setBackgroundResource(R.drawable.black_bac); return true; case DragEvent.ACTION_DROP: return true; case DragEvent.ACTION_DRAG_ENDED: ll_accept.setBackgroundResource(R.drawable.black_bac); if (isChangePos && event.getResult()) { int left = ll_accept.getLeft(); int top = ll_accept.getTop(); x = x + left - (iv_drag.getWidth() / 2); y = y + top - (iv_drag.getHeight() / 2); iv_drag.setX(x); iv_drag.setY(y); } iv_drag.setVisibility(View.VISIBLE); return true; } return false; } });
4.總結
在開發的過程中,我們會使用各種各樣的View,實現拖放效果,主要包括拖動陰影構建、拖放方法調用以及對拖放事件的處理,在合適的場景下為View添加上拖放效果能讓應用交互更加方便和友好。
到此這篇關於Android為View添加拖放效果的文章就介紹到這瞭,更多相關Android為View添加拖放內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android實現控件拖動效果
- Android實現多點觸摸操作
- Android開發返回鍵明暗點擊效果的實例代碼
- Android 自定義精美界面包含選項菜單 上下文菜單及監聽詳解流程
- Android Studio實現幀動畫