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;

コメントを残す

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