IngressAchievementsっていうView作った

IngressAchievements


amyu/IngressAchievements · GitHub
コレ作ったはいいんですけど、ライブラリ化するのとか作ってる最中にめんどくさくなってきて。
そのうち暇になったらまた進化させます。

六角形の部分のTouchEvent


Regionに六角形のPathをセットして、ViewのonTouchEventでRegionの範囲内の時にListenerを叩くといった感じ。

で、上の画像のView構成は、AchievementViewというView拡張したViewをIngressListViewで表示してる感じなんです。
その時に、Viewの重なった部分のTouchEventが被るため、onInterceptTouchEventを常にfalseを返してViewにTouchEventがいくようにしるんですよー。

ViewGroup#addViewの時の処理

ViewGroupのコード読んだら

public void addView(View child, int index, LayoutParams params){
//...
}

の処理でaddViewが終わっていた。
なので、色々と変えたいんだったらこんな感じかな?

@Override
public void addView(View child, int index, LayoutParams params) {
    if (!(child instanceof AchievementView)) {
        throw new IllegalArgumentException("AchievementView以外が来てるよーーーーー");
    }
    ((AchievementView) (child)).setOnClickListener(mOnClickListener);
    super.addView(child, index, params);
}

これだけ書いておけば、addView(View child)でも勝手にいい感じになりますね。

AttributeSetを始めてちゃんと使った

ライブラリ化した時に使う側とファイル名が被らないようにしないといけないっぽい。
今は
View名_attrs.xml
にしてるけどちゃんとした命名規則があるんだったら知りたいな。

六角形の描画

60度ずつの変化のため、sinとcosの値を定数で持っておけばよかったと後悔。
のちのちに汎用性を持たせたかったと言い訳を...

それぞれの絶妙な計算

IngressListViewで並べるときやAchievementViewリサイズするときになんだかんだ結構計算してるですよー。
ほんと理系でよかった。

できてない所

AchievementViewに画像をセットすることが出来るんですけど、これバグの塊で。
onSizeChangedでセットする画像のBitmapのリサイズ処理が走るんですけど、IngressListViewでたくさんAchievementViewが入ってる時、すべてのAchievementViewでリサイズで処理が走りOOMで落ちるという。
ココらへんちゃんとImageViewとかのコードよんだほうがいいっすね。
はー。

最後に

使い道がないViewがまた世に生まれてしまった...
ではではー