您好,登錄后才能下訂單哦!
今天小編給大家分享一下Android中如何實現放大與縮小手勢的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
放大與縮小手勢(1)
放大與縮小手勢對應TransformGestureEvent. GESTURE_ZOOM事件類型,使用時要求兩個手指觸摸屏幕,同時向外或向內做放縮動作。
放縮手勢操作起來簡單且直觀,在觸摸屏設備上的應用范圍很廣,比如瀏覽網頁時控制頁面上的字體大小,查看地圖時控制地圖的縮放級別等。
下面的實例程序GestureZoom演示了如何使用ZOOM手勢來控制圖片的放縮。對loader對象添加手勢監聽器,事件響應函數根據手勢動作,實現放大或縮小加載的圖片。主程序Main.as的代碼如下:
package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.TransformGestureEvent; import flash.geom.Point; import flash.net.URLRequest; public class Main extends AppBase { private var loader:Loader; override protected function init():void { //使用Loader對象加載圖片 loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete); addChild(loader); //加載目錄下的圖片 loader.load( new URLRequest("dog.jpg") ); } //處理加載事件 private function onLoadComplete(e:Event):void { loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoadComplete); //判斷設備是否支持手勢事件 if ( Multitouch.supportsGestureEvents ) { //對loader對象添加手勢事件監聽器 loader.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom); } } //響應放縮手勢 private function onZoom(e:TransformGestureEvent):void { //記錄下手勢作用點的位置,采用loader對象中的本地坐標 var p:Point = new Point( e.localX, e.localY ); //將坐標轉換為父級容器的本地坐標 var parent_p:Point = this.globalToLocal(loader.localToGlobal(p)); //對loader對象做放縮處理 loader.scaleX *= e.scaleX; loader.scaleY *= e.scaleY; //loader對象縮放后,p點在loader對象中的坐標沒有變,但在父級容器中的坐標已發生變化,因此要//重新計算 var parent_p2:Point = this.globalToLocal(loader.localToGlobal(p)); //移動loader,使得點p在父級容器的坐標保持不變 loader.x += (parent_p.x - parent_p2.x); loader.y += (parent_p.y - parent_p2.y); } }
在本例中,使用Loader對象加載程序目錄下的圖片。加載完成后,對loader對象添加手勢事件監聽器,代碼如下:
if ( Multitouch.supportsGestureEvents )
{
loader.addEventListener(TransformGestureEvent.GESTURE_ZOOM, onZoom);
}
放大與縮小手勢(2)
由于Multitouch類的inputMode屬性默認為處理手勢事件,因此無需更改交互模式即可處理手勢事件。使用手勢事件之前,對Multitouch類的supportsGestureEvents屬性做判斷是一個好習慣。事實上,僅僅做這一個判斷并不能確保設備就一定會支持所有的手勢。要做到萬無一失,還需要檢查Multitouch的supportedGestures屬性,檢查的過程如下:
var index:int = -1; if ( Multitouch.supportedGestures != null ) { index = Multitouch.supportedGestures.indexOf(TransformGestureEvent.GESTURE_ZOOM); } if(Multitouch.supportsGestureEvents && index != -1 ) { //添加其他代碼 }
supportedGestures是一個Vector類型的數組,包含了設備支持的所有手勢類型。每個元素代表一個事件類型,如果設備任何一個手勢都不支持,supportedGestures的值為null。因此,要檢測設備是否支持某個手勢,可以使用Vector的indexOf方法進行查找,確保代碼在設備上能夠正確運行。
處理GESTURE_ZOOM 事件時,使用TransformGestureEvent 對象的scaleX與scaleY,即可分別獲取水平方向與垂直方向的縮放值。如果手指向外滑動,表示放大,對應的scaleX與scaleY值大于1,反之小于1。因此,用以下兩行代碼就可以實現放縮控制:
loader.scaleX *= e.scaleX; loader.scaleY *= e.scaleY;
如果只是簡單地對loader對象做放縮處理,會帶來一個問題,那就是每次都是以loader的原點為中心點進行縮放。而符合邏輯的做法,應該是以手勢動作的作用點為中心進行縮放。也就是說,要將手勢動作的作用點設置為loader對象的注冊點。雖然ActionScript并沒有提供修改可視元件注冊點的功能,但可以模擬這個行為。整個過程并不難,關鍵在于坐標轉換,步驟如下:
步驟1 記錄手勢作用點在loader對象中的本地坐標,記為點p,它將是新的“注冊點”。
步驟2 以loader對象的父級容器為參照物,計算出點p在父級容器中的本地坐標,記為點parent_p。
步驟3 對loader對象進行縮放。
步驟4 計算縮放后點p在父級容器中的本地坐標,記為點parent_p2。
步驟5 移動loader對象的坐標,讓點p在父級容器中的坐標保持不變。
第5步操作的原理是:點p是loader對象的本地坐標,因此對loader對象進行縮放并不影響點p的值,但點p相對父級容器而言位置發生了變化,所以,根據縮放前后點p在父級容器中的位移,更改loader對象的坐標,就能夠讓點p在父級容器的坐標保持不變,從而達到了更改loader對象注冊點的目的。起決定性作用的兩行代碼如下:
loader.x += (parent_p.x - parent_p2.x);
loader.y += (parent_p.y - parent_p2.y);
請注意,程序GestureZoom的屏幕朝向設置為橫屏模式,在程序描述文件中對應的設置項如下:
<aspectRatio>landscape</aspectRatio>
以上就是“Android中如何實現放大與縮小手勢”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。