この記事は、@astronaughtsさん主催のTitanium mobile “early” Advent Calendar 2012に参加して書いております。16日目(11/16)担当でございます。
みんなが好きなイベントは?そうscrollイベントですね!
Titanium mobileのscrollイベントが思い通り動いてないっぽかったので、動きを調べてみました。(SDK2.1.4 GA、iOSシミュレータで検証)
scrollイベント
scrollViewをスワイプしてスライドさせたときに発火するのがscrollイベントです。
scrollしている間、scrollイベントが発火し続け、scrollが慣性で止まると、scrollEndが発火します。
以下のようなイメージ
[INFO] scroll x=345
[INFO] scroll x=346
[INFO] scroll x=347
[INFO] scroll x=348
[INFO] scroll x=349
[INFO] scroll x=350
[INFO] scroll x=351
[INFO] scrollEnd
xはscroll時の座標です。
疑問(1) scrollEndが発火しない?
scroll中にtapして強制的にscrollを止めた直後、scrollEndが発火しません。
が、tapを終えると(tapしたマウスのクリックを離すと)scrollEndが発火します。
疑問(2) scrollToしたら?
scrollToを使って、プログラムで移動させた場合、どうなるか?
結論:scrollのみ連続で発生
scrollToを使っても一瞬で移動する訳ではないので、移動の間scrollが発火し続けます。ただし、scrollEndは発火しません
[INFO] scroll x=476
[INFO] scroll x=497
[INFO] scroll x=519
[INFO] scroll x=538
[INFO] scroll x=556
[INFO] scroll x=571
[INFO] scroll x=584
[INFO] scroll x=593
[INFO] scroll x=598
[INFO] scroll x=600
こんな感じ。
scrollが終わってもscrollEndは発火してません。
疑問(3) viewの横幅変えると?
scrollのwidthや、scrollに乗っかるviewのwidthを変えるとscrollイベントは発火するのか?という疑問です。
正直最初発火しているように思ったのですが、ちゃんと検証したら発火していませんでした。これが実は個人的に一番やってよかった検証。。。
おわり
単発でイベントが発生するパターンが多い中、連続で発火するscrollは少しクセがあるように感じました。うまく使いこなせるようになりたいものです。
以下に検証用ソースコード貼っておきます。
function FirstView() { var self = Ti.UI.createView(); var scrollView = Titanium.UI.createScrollView({ height:300, width : 300, contentHeight : 300, contentWidth : 'auto', top : 50, backgroundColor:"#black", }); var scrollOnView = Ti.UI.createView({ top : 50, left: 0, height : 200, width : 1000, backgroundColor:"#blue", }); scrollView.add(scrollOnView); var text = "abcdefghigklmnopqrstuvwxyz"; text += "abcdefghigklmnopqrstuvwxyz"; text += "abcdefghigklmnopqrstuvwxyz"; text += "abcdefghigklmnopqrstuvwxyz"; var label = Ti.UI.createLabel({ text : text, }) scrollOnView.add(label); self.add(scrollView); scrollView.addEventListener("scroll",function(e){ Ti.API.info("scroll x=" + e.x); }); scrollView.addEventListener("scrollEnd",function(e){ Ti.API.info("scrollEnd"); }); var addWidthButton = Ti.UI.createButton({ title:"add width", top : 360, left : 10, }); self.add(addWidthButton); addWidthButton.addEventListener('click',function(){ scrollOnView.setWidth(scrollOnView.getWidth() + 10); scrollView.setWidth(scrollView.getWidth() + 10); }); var scrollButton = Ti.UI.createButton({ title:"scroll", top : 360, left : 120, }); self.add(scrollButton); var x=0; scrollButton.addEventListener('click',function(){ if(x==0){ x=600; }else{ x=0; } scrollView.scrollTo(x,0); }); return self; } module.exports = FirstView;