Android為View添加拖放效果的方法實(shí)例
1.引言
在開發(fā)中,拖放是一種比較常見的手勢(shì)操作,使用它能夠讓應(yīng)用的交互更加地便捷和友好,本文將簡(jiǎn)要介紹如何為Android中的View添加拖放效果。
2.主要方法和類介紹
2.1 startDragAndDrop()和startDrag()
要實(shí)現(xiàn)View的拖放,需要調(diào)用View的startDragAndDrop()或startDrag()方法,其中startDragAndDrop()方法要求API版本為24或以上,調(diào)用方法后,View便可以拖動(dòng)了,此方法需要傳遞的參數(shù)如下:
//data:拖放操作要傳遞的數(shù)據(jù) //shadowBuilder:拖放陰影 //myLocalState:一個(gè)包含與拖放操作有關(guān)的數(shù)據(jù)的對(duì)象 //flags:控制拖放操作的標(biāo)志位 public final boolean startDragAndDrop(ClipData data, DragShadowBuilder shadowBuilder,Object myLocalState, int flags)
2.2 setOnDragListener()
接收拖放事件的View我們暫且稱之為目標(biāo)View,目標(biāo)View調(diào)用setOnDragListener(),并實(shí)現(xiàn)其中的方法onDrag()后可以接收拖放事件的回調(diào)。
2.3 View.DragShadowBuilder
在拖放操作進(jìn)行的時(shí)候,需要顯示正在拖動(dòng)的圖片,View.DragShadowBuilder類提供了可以傳入View的構(gòu)造方法,這個(gè)View是被拖放的View,我們將通過DragShadowBuilder創(chuàng)建的拖動(dòng)圖片稱為拖動(dòng)陰影,這個(gè)將作為參數(shù)傳入startDragAndDrop()或startDrag()方法中,如若有需要的話,還可以繼承View.DragShadowBuilder類去實(shí)現(xiàn)自定義的效果。
2.4 DragEvent
此類主要定義了拖放事件的類型,通過event.getAction()可以獲取不同的事件類型,主要有以下幾種:
//DragEvent.ACTION_DRAG_STARTED:表示拖動(dòng)已經(jīng)開始 //DragEvent.ACTION_DRAG_ENTERED:表示拖動(dòng)陰影已經(jīng)進(jìn)入目標(biāo)View //DragEvent.ACTION_DRAG_LOCATION:拖動(dòng)陰影在目標(biāo)View邊界內(nèi)移動(dòng)時(shí)會(huì)多次響應(yīng)此事件 //DragEvent.ACTION_DRAG_EXITED:表示拖動(dòng)陰影離開了目標(biāo)View的邊界 //DragEvent.ACTION_DROP:表示拖動(dòng)陰影被釋放 //DragEvent.ACTION_DRAG_ENDED:表示拖放操作即將結(jié)束,在此處需要通過調(diào)用event.getResult()的返回值來判斷拖放操作是否成功
3. 演示將一張圖片拖放到方框內(nèi)
現(xiàn)在演示將一張圖片拖放到方框內(nèi),來說明拖放操作的大致流程,其中方框是一個(gè)LinearLayout,為它設(shè)置了一個(gè)方框背景。
3.1 簡(jiǎn)易布局
布局如下:
<?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 操作被拖放的圖片
實(shí)現(xiàn)長(zhǎng)按拖動(dòng)圖片的效果,首先調(diào)用setOnLongClickListener()設(shè)置長(zhǎng)按事件回調(diào),之后構(gòu)建ClipData和拖動(dòng)陰影,然后調(diào)用startDragAndDrop()或startDrag()方法實(shí)現(xiàn)拖動(dòng),代碼如下:
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 方框接收?qǐng)D片
目標(biāo)View要接收?qǐng)D片需要先調(diào)用setOnDragListener()來接受拖放事件的回調(diào),使用event.getAction()來獲取不同的拖放事件類型,然后根據(jù)事件類型執(zhí)行相應(yīng)的操作,示例如下:
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.總結(jié)
在開發(fā)的過程中,我們會(huì)使用各種各樣的View,實(shí)現(xiàn)拖放效果,主要包括拖動(dòng)陰影構(gòu)建、拖放方法調(diào)用以及對(duì)拖放事件的處理,在合適的場(chǎng)景下為View添加上拖放效果能讓應(yīng)用交互更加方便和友好。
到此這篇關(guān)于Android為View添加拖放效果的文章就介紹到這了,更多相關(guān)Android為View添加拖放內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程簡(jiǎn)單實(shí)現(xiàn)雷達(dá)掃描效果
這篇文章主要介紹了Android編程簡(jiǎn)單實(shí)現(xiàn)雷達(dá)掃描效果,涉及Android圖形繪制及顯示的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android中使用ScrollView指定view的頂部懸停效果
在項(xiàng)目開發(fā)中遇到這樣的需求,需要實(shí)現(xiàn)scrollview頂部的懸停效果,實(shí)現(xiàn)原理非常簡(jiǎn)單,下面小編通過本文給大家分享實(shí)例代碼,需要的朋友參考下2017-04-04
Android的Launcher啟動(dòng)器中添加快捷方式及小部件實(shí)例
這篇文章主要介紹了在Android的Launcher啟動(dòng)器中添加快捷方式及窗口小部件的方法,包括在自己的應(yīng)用程序中添加窗口小部件AppWidget的例子,需要的朋友可以參考下2016-02-02
android 線性布局LinearLayout實(shí)例代碼
android 線性布局LinearLayout實(shí)例代碼,需要的朋友可以參考一下2013-05-05
修改Android Studio 的 Logcat 緩沖區(qū)大小操作
這篇文章主要介紹了修改Android Studio 的 Logcat 緩沖區(qū)大小操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Android studio4.1更新后出現(xiàn)的問題詳解
這篇文章主要介紹了Android studio4.1更新后出現(xiàn)的問題詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
React-Native中使用驗(yàn)證碼倒計(jì)時(shí)的按鈕實(shí)例代碼
這篇文章主要介紹了React-Native中使用驗(yàn)證碼倒計(jì)時(shí)的按鈕實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-04-04
Android studio設(shè)置文件頭定制代碼注釋的方法
這篇文章主要介紹了Android studio設(shè)置文件頭定制代碼注釋的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08

