編輯:高級開發
拖動事件類
拖動監聽器
輔助方法和類
基本上有四個步驟,在拖放過程或狀態:
開始:此事件發生時開始拖動布局中的一個項目,應用類的tartDrag()方法來告訴系統啟動拖動。startDrag()方法的參數提供被拖動的數據,這些是數據的元數據和一個回調用於繪制的拖動陰影。
該系統首先通過回調應用程序,以獲得一個拖陰影的響應。然後顯示在設備上的拖影。
接下來,系統會發送拖曳事件動作類型ACTION_DRAG_STARTED在當前布局中的所有視圖對象拖動事件監聽器注冊。
若要繼續接收拖動事件,其中包括一個可能的放事件,一個拖事件偵聽器必須返回true,如果拖動事件偵聽器返回false,那麼它不會收到拖動事件當前的操作,直到系統發送一個動作類型的拖曳事件ACTION_DRAG_ENDED。
繼續:用戶可以繼續拖動。系統發送ACTION_DRAG_ENTERED動作,其次注冊拖動事件偵聽器的視圖中拖動點進入ACTION_DRAG_LOCATION動作。響應該事件監聽器可以選擇改變其對象的外觀或可以凸顯其觀點反應。用戶移動拖動視圖的邊框陰影外拖曳事件偵聽器接收ACTION_DRAG_EXITED動作。
拖動:用戶釋放拖動的項目視圖的邊框內。該系統發送對象的偵聽器拖動事件使用動作類型ACTION_DROP。
結果:操作類型ACTION_DROP之後,系統發出一個操作類型ACTION_DRAG_ENDED表示拖動操作結束的拖動事件。
dragEvent代表一個事件,就會由系統送出拖放操作過程中在不同的時間。這個類提供了一些常量和重要的方法在使用拖/放過程。
以下是所有常量作為部分 dragEvent 類整數。
以下是作為部分的 dragEvent 類提供一些重要的和最常用的方法。
如果想要的任何布局內視圖響應拖動事件,那麼視圖要麼實現 View.OnDragListener 或者設置 onDragEvent(DragEvent) 回調方法。當系統調用的方法或監聽器,它傳遞給上述 dragEvent 對象。可以查看對象的監聽器和一個回調方法。如果發生這種情況,系統首先調用監聽器,然後定義回調監聽器返回true。
組合 onDragEvent(DragEvent)方法 和 View.OnDragListener,類似於 onTouchEvent() 和 View.OnTouchListener 使用在舊版本 Android 觸摸事件的組合。
開始創建ClipData和移動數據ClipData.Item。作為ClipDataobject 的一部分提供的元數據被存儲在ClipDescription內ClipData對象。對於拖放操作,並不代表數據移動,可能想使用空(null)而不是實際的對象。
下一步,可以擴展 View.DragShadowBuilder 創建一個拖動視圖,或者使用 View.DragShadowBuilder(View) 創建一個默認的大小相同的View參數傳遞給它的拖影,觸摸拖動陰影點集中在拖影。
下面的例子顯示了一個簡單的拖放示例中使用View.setOnLongClickListener() 事件偵聽器和 View.OnDragEventListener().函數。
以下是修改主活動文件 src/com.yiibai.dragndropdemo/MainActivity.java 。這個文件可以包括每個生命周期基本方法。
package com.yiibai.dragndropdemo; import android.os.Bundle; import android.app.Activity; import android.content.ClipData; import android.content.ClipDescription; import android.util.Log; import android.view.DragEvent; import android.view.View; import android.view.View.DragShadowBuilder; import android.view.View.OnDragListener; import android.widget.*; public class MainActivity extends Activity{ ImageView ima; private static final String IMAGEVIEW_TAG = "Android Logo"; String msg; private android.widget.RelativeLayout.LayoutParams layoutParams; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ima = (ImageView)findViewById(R.id.iv_logo); // Sets the tag ima.setTag(IMAGEVIEW_TAG); ima.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { ClipData.Item item = new ClipData.Item((CharSequence)v.getTag()); String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN}; ClipData dragData = new ClipData(v.getTag().toString(), mimeTypes, item); // Instantiates the drag shadow builder. View.DragShadowBuilder myShadow = new DragShadowBuilder(ima); // Starts the drag v.startDrag(dragData, // the data to be dragged myShadow, // the drag shadow builder null, // no need to use local data 0 // flags (not currently used, set to 0) ); return true; } }); // Create and set the drag event listener for the View ima.setOnDragListener( new OnDragListener(){ @Override public boolean onDrag(View v, DragEvent event){ RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); switch(event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); Log.d(msg, "Action is DragEvent.ACTION_DRAG_STARTED"); // Do nothing break; case DragEvent.ACTION_DRAG_ENTERED: Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENTERED"); int x_cord = (int) event.getX(); int y_cord = (int) event.getY(); break; case DragEvent.ACTION_DRAG_EXITED : Log.d(msg, "Action is DragEvent.ACTION_DRAG_EXITED"); x_cord = (int) event.getX(); y_cord = (int) event.getY(); layoutParams.leftMargin = x_cord; layoutParams.topMargin = y_cord; v.setLayoutParams(layoutParams); break; case DragEvent.ACTION_DRAG_LOCATION : Log.d(msg, "Action is DragEvent.ACTION_DRAG_LOCATION"); x_cord = (int) event.getX(); y_cord = (int) event.getY(); break; case DragEvent.ACTION_DRAG_ENDED : Log.d(msg, "Action is DragEvent.ACTION_DRAG_ENDED"); // Do nothing break; case DragEvent.ACTION_DROP: Log.d(msg, "ACTION_DROP event"); // Do nothing break; default: break; } return true; } }); } }
下面是 res/layout/activity_main.xml 文件的內容:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/logo" android:contentDescription="@string/drag_drop" /> </RelativeLayout>
下面文件 res/values/strings.xml 的內容中定義兩個新的常量:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">DragNDropDemo</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="drag_drop">Click on the image to drag and drop</string> </resources>
以下是 AndroidManifest.xml 文件的默認內容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yiibai.guidemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yiibai.guidemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
我們嘗試運行 DragNDropDemo 應用程序。AVD安裝的應用程序,並啟動它,如果一切設置和應用都沒有問題,它會顯示以下模擬器窗口:
現在長時間點擊顯示Android的標志,會看到標志圖像經過1秒長的點擊它,開始拖動圖像的時候移動了一點。可以拖動它在屏幕上,並把它放在一個新的位置。
android到底有多少版手機?想必大家很難回答出來,就算說出來安裝android各個版本操作系統的手機的數量恐怕你也很難說清楚類似聯想“樂Phone”、創新工場“點心
; Log.v(BROADCAST_TAG, myBroadCast);}@Overridepublic void onReceive(Context context,
android最初是由Google開發的基於Linux平台的開源手機操作系統,而且不存在任何以往羁絆移動產業創新的專有權障礙,並迅速發展成為智能移動終端的操作系統。雖然
Google的android 2.1之前曾經歷過跳票的痛苦,但現在的發布正好迎合了Nexus One的發展。看來谷歌繼續對抗蘋果的iPhone的戰爭,才剛剛開始。And