<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在開發中,拖放是一種比較常見的手勢操作,使用它能夠讓應用的互動更加地便捷和友好,本文將簡要介紹如何為Android中的View新增拖放效果。
要實現View的拖放,需要呼叫View的startDragAndDrop()或startDrag()方法,其中startDragAndDrop()方法要求API版本為24或以上,呼叫方法後,View便可以拖動了,此方法需要傳遞的引數如下:
//data:拖放操作要傳遞的資料 //shadowBuilder:拖放陰影 //myLocalState:一個包含與拖放操作有關的資料的物件 //flags:控制拖放操作的標誌位 public final boolean startDragAndDrop(ClipData data, DragShadowBuilder shadowBuilder,Object myLocalState, int flags)
接收拖放事件的View我們暫且稱之為目標View,目標View呼叫setOnDragListener(),並實現其中的方法onDrag()後可以接收拖放事件的回撥。
在拖放操作進行的時候,需要顯示正在拖動的圖片,View.DragShadowBuilder類提供了可以傳入View的構造方法,這個View是被拖放的View,我們將通過DragShadowBuilder建立的拖動圖片稱為拖動陰影,這個將作為引數傳入startDragAndDrop()或startDrag()方法中,如若有需要的話,還可以繼承View.DragShadowBuilder類去實現自定義的效果。
此類主要定義了拖放事件的型別,通過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()的返回值來判斷拖放操作是否成功
現在演示將一張圖片拖放到方框內,來說明拖放操作的大致流程,其中方框是一個LinearLayout,為它設定了一個方框背景。
佈局如下:
<?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>
實現長按拖動圖片的效果,首先呼叫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; } });
目標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; } });
在開發的過程中,我們會使用各種各樣的View,實現拖放效果,主要包括拖動陰影構建、拖放方法呼叫以及對拖放事件的處理,在合適的場景下為View新增上拖放效果能讓應用互動更加方便和友好。
到此這篇關於Android為View新增拖放效果的文章就介紹到這了,更多相關Android為View新增拖放內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45