新作も変わらず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