Titanium mobile でscrollイベントについて調べた話

2012/11/16

この記事は、@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;

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です