天天看點

Android拖動和縮放拖拽和縮放

多點觸控的理論學完了之後,這裡開始實踐。本節主要介紹使用<code>onTouchEvent()</code>方法處理觸控事件。

用touch手勢把一個對象從螢幕的一邊拽到另一邊是很常見的一種用法。以下代碼展示了如何拖拽一個

螢幕上的圖檔。但是主要一下内容:

在一個拖動(或者叫做scroll)操作裡,app需要知道開始觸控點,不管有幾根指頭放在螢幕上

隻需要記住第一根指頭的點。但是,在拖動圖檔的過程中,使用者有放上了好幾個手指,然後把第一個觸控的

手指拿開了螢幕。如果你的app隻記錄單個手指的觸控操作,那麼就需要把第二個手指的觸控點作為預設觸控點

并把圖檔移動到該位置。

為了防止上面的情況發生,你的app需要區分初始觸控點和其他的觸控點。要記錄初始觸控點以外的觸控點,就需要用到

前文所說的<code>ACTION_POINTER_DOWN</code>和<code>ACTION_POINTER_UP</code>事件。<code>ACTION_POINTER_DOWN</code>和<code>ACTION_POINTER_UP</code>

可以在<code>onTouchEvent()</code>回調中取得。

在<code>ACTION_POINTER_UP</code>發生的時候,下面的示例代碼可以擷取到index,并確定觸控ID指向的觸控事件是有效的。如果

觸控點已經無效,則擷取一個有效的,并擷取其X和Y坐标。這個坐标是在<code>ACTION_MOVE</code>事件中擷取,圖檔将被移動到該位置。

以下代碼會記錄起始觸控點的位置,追蹤手指移動的新位置,并把圖檔移動到該位置。并按照上面描述的方法處理可能的異常情況。

注意以下代碼用了<code>getActionMasked()</code>方法。為了保證相容可以使<code>MotionEventCompat.getActionMasked()</code>來擷取觸控的<code>MotionEvent</code>。

補充說明,為了不讓讀者态度困惑。是以沒有使用Google的示例代碼。原來的示例代碼并沒有突出在Activity中拖動一個View的功能。而是主要在一個View内部如何相應拖動和縮放功能。這和前文所述的主題有一定的不符合,是以筆者做了下面的修改。如有不妥請指出。

總結以下上述内容:

觸控ID(pointer Id)可以唯一制定一個觸控事件

index對應的觸控事件可能發生改變。但是,隻有通過觸控的index可以獲得觸控的坐标。

是以,使用的時候先在ACTION_DOWN裡得到觸控index,再用觸控index獲得觸控Id存起來。之後每次在ACTION_MOVE事件中,

用觸控Id得到觸控index,再用這個index得到觸控的坐标。

在ACTION_UP、ACTION_CANCEL事件裡把觸控Id設定為空(或者無效)。在ACTION_POINTER_UP裡把廢棄的觸控Id置換為有效的觸控Id。

這個是關于觸控的坐标的。在預設的Activity裡實作這個拖拽的功能,你會發現這個圖檔在拖動的一瞬間圖檔會下移一定的距離。

由于圖檔的大小設定為50dp,下移的距離和這個距離非常接近。在設定為全屏的時候,下移不會再發生。說明觸控點的坐标是基于全屏的,

但是ImageView定位的坐标是基于目前的ViewGroup的。這一點也非常重要,如果你需要保留ActionBar的話,坐标資料需要從全屏轉化為目前

ImageView所在的ViewGroup的。

to be continued...

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sunshine-anycall/p/5248662.html,如需轉載請自行聯系原作者

繼續閱讀