如何使用Android的拖拽接口實(shí)現(xiàn)拖拽功能

轉(zhuǎn)載注明出處:簡書-十個雨點(diǎn)

簡介

拖拽操作在現(xiàn)在的智能手機(jī)中并不少見,老羅的OneStep更是把拖拽做成了一種令人拍手叫絕的交互方式。在錘子手機(jī)原生的Bigbang中,普通拖動是多選文字,長按選中的文字并拖動是觸發(fā)OneStep的分享功能。而我在模仿Bigbang的時候,覺得用戶可能需要對文字進(jìn)行一些微調(diào),所以我把長按設(shè)計(jì)成了細(xì)分詞(把詞語細(xì)分成單字),而拖拽的交互留給了排序功能(需要切換排序開關(guān))。

效果圖

長按細(xì)分詞,拖拽排序

也可以下載全能分詞體驗(yàn)

實(shí)現(xiàn)原理和步驟

其實(shí)Android已經(jīng)提供了拖拽功能的接口,在API level 11以上的View類中,直接調(diào)用startDrag()方法或者startDragAndDrop()即可。

View.startDrag()

渣翻一下:

public final boolean startDrag(ClipData data, DragShadowBuilder shadowBuilder,
                                   Object myLocalState, int flags) 
開始一個拖拽操作。

調(diào)用這個方法時,會將一個View.DragShadowBuilder對象傳遞給系統(tǒng)。

系統(tǒng)將調(diào)用這個View.DragShadowBuilder對象的onProvideShadowMetrics(Point, Point)方法來獲取拖拽陰影的metrics,
再調(diào)用其onDrawShadow(Canvas)方法來繪制拖拽陰影。

之后,系統(tǒng)開始拖拽操作,并將拖拽事件(drag events)發(fā)送給你應(yīng)用中所有visible的View對象。

拖拽事件是被發(fā)送到View對象的drag listener或者onDragEvent()方法。
drag listener和onDragEvent()方法接收的參數(shù)都是一個DragEvent對象,
對這個DragEvent對象執(zhí)行g(shù)etAction()方法的結(jié)果是ACTION_DRAG_STARTED。

startDrag()方法可以在任何attacked的View對象上調(diào)用,
而不需要是View.DragShadowBuilder使用的View對象,也不需要與被拖拽的View有任何關(guān)系。

整個拖拽過程中涉及到的類只有三個:ClipData,DragShadowBuilder和OnDragListener,步驟只有如下兩步:

1. 設(shè)置拖拽數(shù)據(jù),并開始拖拽

ClipData clipData = ClipData.newPlainText(lable, text);//這只是其中一種方式,還可以傳遞更豐富的數(shù)據(jù)
View.DragShadowBuilder myShadow = new DragShadowBuilder(view);
view.startDrag(clipData, myShadow, null, 0);

2. 在需要接收拖拽的View上設(shè)置監(jiān)聽

anotherView.setOnDragListener(new OnDragListener() {
    @Override
    public boolean onDrag(View v, DragEvent event) {        
        doSomething();
        return true;//true means consumed
    }
});

看完上面的介紹是不是發(fā)現(xiàn)實(shí)現(xiàn)拖拽操作很簡單呢?沒錯,借助系統(tǒng)方法,我們需要做的工作極少。

源碼

完整代碼參見Bigbang項(xiàng)目的BigBangLayout類的實(shí)現(xiàn),拖拽的部分從initView()方法和onTouchEvent()方法看起即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容