欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android為View添加拖放效果的方法實例

 更新時間:2022年02月18日 11:26:27   作者:QiShare  
這篇文章主要給大家介紹了關(guān)于Android為View添加拖放效果的相關(guān)資料,實現(xiàn)View的拖拽其實原理很簡單,無非就是獲取手指的位移信息,然后view根據(jù)手指的位移信息,移動對應(yīng)的位置,需要的朋友可以參考下

1.引言

在開發(fā)中,拖放是一種比較常見的手勢操作,使用它能夠讓應(yīng)用的交互更加地便捷和友好,本文將簡要介紹如何為Android中的View添加拖放效果。

2.主要方法和類介紹

2.1 startDragAndDrop()和startDrag()

要實現(xiàn)View的拖放,需要調(diào)用View的startDragAndDrop()或startDrag()方法,其中startDragAndDrop()方法要求API版本為24或以上,調(diào)用方法后,View便可以拖動了,此方法需要傳遞的參數(shù)如下:

//data:拖放操作要傳遞的數(shù)據(jù)
//shadowBuilder:拖放陰影
//myLocalState:一個包含與拖放操作有關(guān)的數(shù)據(jù)的對象
//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(),并實現(xiàn)其中的方法onDrag()后可以接收拖放事件的回調(diào)。

2.3 View.DragShadowBuilder

在拖放操作進(jìn)行的時候,需要顯示正在拖動的圖片,View.DragShadowBuilder類提供了可以傳入View的構(gòu)造方法,這個View是被拖放的View,我們將通過DragShadowBuilder創(chuàng)建的拖動圖片稱為拖動陰影,這個將作為參數(shù)傳入startDragAndDrop()或startDrag()方法中,如若有需要的話,還可以繼承View.DragShadowBuilder類去實現(xiàn)自定義的效果。

2.4 DragEvent

此類主要定義了拖放事件的類型,通過event.getAction()可以獲取不同的事件類型,主要有以下幾種:

//DragEvent.ACTION_DRAG_STARTED:表示拖動已經(jīng)開始
//DragEvent.ACTION_DRAG_ENTERED:表示拖動陰影已經(jīng)進(jìn)入目標(biāo)View
//DragEvent.ACTION_DRAG_LOCATION:拖動陰影在目標(biāo)View邊界內(nèi)移動時會多次響應(yīng)此事件
//DragEvent.ACTION_DRAG_EXITED:表示拖動陰影離開了目標(biāo)View的邊界
//DragEvent.ACTION_DROP:表示拖動陰影被釋放
//DragEvent.ACTION_DRAG_ENDED:表示拖放操作即將結(jié)束,在此處需要通過調(diào)用event.getResult()的返回值來判斷拖放操作是否成功

3. 演示將一張圖片拖放到方框內(nèi)

現(xiàn)在演示將一張圖片拖放到方框內(nèi),來說明拖放操作的大致流程,其中方框是一個LinearLayout,為它設(shè)置了一個方框背景。

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 操作被拖放的圖片

實現(xiàn)長按拖動圖片的效果,首先調(diào)用setOnLongClickListener()設(shè)置長按事件回調(diào),之后構(gòu)建ClipData和拖動陰影,然后調(diào)用startDragAndDrop()或startDrag()方法實現(xiàn)拖動,代碼如下:

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 方框接收圖片

目標(biāo)View要接收圖片需要先調(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ā)的過程中,我們會使用各種各樣的View,實現(xiàn)拖放效果,主要包括拖動陰影構(gòu)建、拖放方法調(diào)用以及對拖放事件的處理,在合適的場景下為View添加上拖放效果能讓應(yīng)用交互更加方便和友好。

到此這篇關(guān)于Android為View添加拖放效果的文章就介紹到這了,更多相關(guān)Android為View添加拖放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • zxing二維碼位矩陣轉(zhuǎn)換成Bitmap位圖的實戰(zhàn)教程

    zxing二維碼位矩陣轉(zhuǎn)換成Bitmap位圖的實戰(zhàn)教程

    二維碼的應(yīng)用已經(jīng)可以說是非常廣泛了,下面這篇文章主要給大家介紹了關(guān)于zxing二維碼位矩陣轉(zhuǎn)換成Bitmap位圖的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Android手把手教大家制作APP首頁(下拉刷新、自動加載)

    Android手把手教大家制作APP首頁(下拉刷新、自動加載)

    這篇文章主要為大家詳細(xì)介紹了Android手把手教大家制作APP首頁,實現(xiàn)下拉刷新、自動加載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android動畫實現(xiàn)原理和代碼

    Android動畫實現(xiàn)原理和代碼

    這篇文章主要介紹了Android動畫實現(xiàn)原理和代碼分析,如果你對此感興趣,跟著小編學(xué)習(xí)下吧。
    2017-12-12
  • Android編程實現(xiàn)下載圖片及在手機中展示的方法

    Android編程實現(xiàn)下載圖片及在手機中展示的方法

    這篇文章主要介紹了Android編程實現(xiàn)下載圖片及在手機中展示的方法,涉及Android針對圖形文件的遠(yuǎn)程下載及遍歷顯示相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • Android程序設(shè)計之AIDL實例詳解

    Android程序設(shè)計之AIDL實例詳解

    這篇文章主要介紹了Android程序設(shè)計的AIDL,以一個完整實例的形式較為詳細(xì)的講述了AIDL的原理及實現(xiàn)方法,需要的朋友可以參考下
    2014-09-09
  • kotlin Context使用詳解

    kotlin Context使用詳解

    這篇文章主要介紹了kotlin Context使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Kotlin如何安全訪問lateinit變量的實現(xiàn)

    Kotlin如何安全訪問lateinit變量的實現(xiàn)

    這篇文章主要介紹了Kotlin如何安全訪問lateinit變量的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Android中okhttp3.4.1+retrofit2.1.0實現(xiàn)離線緩存

    Android中okhttp3.4.1+retrofit2.1.0實現(xiàn)離線緩存

    這篇文章主要介紹了Android中okhttp3.4.1結(jié)合retrofit2.1.0實現(xiàn)離線緩存,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android常用布局使用技巧示例講解

    Android常用布局使用技巧示例講解

    本文詳細(xì)介紹了Android常用布局,包括LinearLayout、RelativeLayout、FrameLayout、ConstraintLayout等,分析了它們的適用場景、優(yōu)缺點和使用技巧,幫助開發(fā)者更好地選擇和使用合適的布局,提升UI設(shè)計和開發(fā)效率
    2023-04-04
  • Android中關(guān)于CoordinatorLayout的一些實用布局技巧

    Android中關(guān)于CoordinatorLayout的一些實用布局技巧

    大家都知道CoordinatorLayout是一個“加強版”的 FrameLayout,那么下面這篇文章主要給大家分享了Android中關(guān)于CoordinatorLayout的一些布局技巧,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06

最新評論