新作も変わらずTitaniumでアプリを作っておりますが、
今回はもう少しマテリアルデザインぽくしたいなーと思い、
細かいアニメーションもなるべく資料に寄せるようにしているんですが、
例によってiphoneで動くのにandroidでは動かないみたいなことが多すぎて辟易しています。。
#以下の現象はSDK 3.5.0GAにて検証しています。
一番はまっていたのが
viewをタップしたら背景色を変更し、離したら背景色を元に戻すというものなんですが、
#いわゆるクリック感的なやつ
これを単純にbackgroundColorの入れ替えのみ行う分にはいいのですが、
それだとなんかせわしない感じなので、少しアニメーションにしたく。
//これはOK var W = Ti.UI.createWindow(); W.open(); var view = Ti.UI.createView({height:200,width:200,top:50,left:50,backgroundColor:'#ffffff'}); view = changeColor(view,{start:'#00ffff',end:'#ffffff'}); W.add(view); function changeColor(view,CSS){ //Touch and change background color. view.addEventListener('touchstart',function(e){ e.source.backgroundColor = CSS.start; }); view.addEventListener('touchend',function(e){ e.source.animate({backgroundColor:CSS.end}); }); view.addEventListener('touchcancel',function(e){ e.source.animate({backgroundColor:CSS.end}); }); return view; };
こんな感じで、viewにtouchstartなどのリスナーを設定すればうまくいくわけですが
これをカスタマイズしようとすると一気にバグり放題になります。
borderRadiusの罠
上記のviewにちょっとおしゃれにしようとか色気付いてborderRadiusを設定するといきなりバグります。
//これはダメ var view = Ti.UI.createView({height:200,width:200,top:50,left:50,backgroundColor:'#ffffff',borderRadius:10});
これを回避するにはborderRadiusを親のviewに設定してあげればOKです。
なのでこうなります。
//これはOK var parent = Ti.UI.createView({height:200,width:200,top:50,left:50,borderRadius:10}); var view = Ti.UI.createView({backgroundColor:'#ffffff'}); parent.add(view);
borderColorの罠
ではborderRadiusuでなくborderColorを足してみたらどうでしょうか。
嫌な予感しかしません。
//これはNG var parent = Ti.UI.createView({height:200,width:200,top:50,left:50}); var view = Ti.UI.createView({backgroundColor:'#ffffff',borderWidth:1,borderColor:'#ff0000'}); parent.add(view);
またバグりました。
同じようにborderColorも親のviewに渡しましょう
//これはOK var parent = Ti.UI.createView({height:200,width:200,top:50,left:50,borderRadius:10,borderWidth:1,borderColor:'#ff0000'}); var view = Ti.UI.createView({backgroundColor:'#ffffff'}); parent.add(view);
動きました!
結論
結論、titanium-androidで背景色アニメーションをするときは、
border関係をすべて別のviewに切り出しましょう。
ちょっと古いですが、下記のサイトでも同様のバグっぽいのがでていました。
3.1.3ですが、ずっと続いているものなんですね。
http://umi-uyura.hatenablog.com/entry/2013/12/03/170517