読者です 読者をやめる 読者になる 読者になる

複数ViewにまたがるTouchの当たり判定メモ

 こちらも自メモ。
 最近はOpenGLHTML5Canvas当たりでゴニョゴニョするのが流行りみたいなので
需要はないと思うので(苦笑

話的にはこういう話

ただ、この実装コードは自分の頭では理解むずかしかったので、自分なりに頭悩ませてみた

  • 前提条件的には
    • imgarr配列に複数のViewが入っています
    • それぞれのViewに


for(View iv:imgarr){
iv.setOnTouchListener(listner);
}
と設定するイメージ

  • 実装側

悩んだのは
 event.getX,event.getY が対象のview上の座標
つうオチでRECTの当たり判定がうまくHitしなかったんですね(汗
ロケーション座標で補正するというお話。

 ググる
event.getRowX()、event.getRowY()で取れば良いよ
な話が出てくるんだけど、これだとマルチタッチ判定は出来ない><

  • テストコード側

ただテストに関しては、なんでHandlerが使えないのかが不明だったりorz


[NG]//new Handler().postDelayed(m_runnable,time+i); //普通のActivity内に書くと動く
[NG]//new Handler().post(m_runnable);
[OK] mActivity.runOnUiThread(m_runnable);
しか動かない感じでしたね・・・(テストボタン等をアプリ側に設定すればHandlerは動く

 ちなみに

  • performItemClick は OnClickListnerしている物が対象
  • 上記の場合は setOnTouchListener ( new View.OnTouchListener() { している物が対象

というのを勘違いしていて、なんで動かないんだ〜とか馬鹿もやっていました(苦笑


 Handlerをテストコードに使う話は

な話なのかな。もう少し調べてみような研究課題かな



テストコードに対する追記)

new Handler(mActivity.getMainLooper()).postDelayed(m_runnable,time+i);
でOKでした。
runOnUiThreadと同じようなスコープで作業しないとテストが通らないとのお話
mActivity.getMainLooper() だとメインスレッドキューに登録される動きらしい。

HandlerThreadで試してたけど、Activityスレッドである事が重要なのかな。。


実装に対する追記)

タッチゲームとかで
2個View同時押しをした場合

  • 瞬間的に2回飛んでくる(View1回押したのと、2回押されたの)

で直前の処理をキャンセルしてやる必要があり

なぜ同時押しみたいな挙動をサポートするかというと

  1. Androidはタッチ精度が悪いので、IOSと同じタッチ反応を目指そうとすると同時押しをサポートしないと再現できない

あと上記のコードでは記載していないけど

  1. 実際はImageView自体にtagで情報を付けて sortしてやらないと順番に判定できない
  2. IS01までサポートする場合はLazyLoadするためにMouseUtil等のべつクラスを作成する必要が有
    1. Android1.6(IS01)で発生する java.lang.VerifyError の対処メモ - exception think あたりの話

実際のところは

  • IS01だと殆どの人Wifi運用
  • Wifi表示の端末に対してAd会社の人が単価の高い広告を表示していない
    • AdMob自体もtarget8(2.2)以下の物に対してエラーを吐いてる挙動をしてる<GAでAdの統計情報をとる処理のあたり

でも

  • IS01でも動く=凄い軽量なアプリ

というブランディング力は一応あるとのこと

確かに流行りのUnityとかは結構スペックいるからなー

  • colAR Mix とかまともに動かなかった。

だからつい最近また

  • cocos2d-xあたりでネイティブよりに作ろうぜ

の路線で本がまた大量に出版され始めている気がする*1



TLメモ)

*1:ユーザにとってどのフレームワークで作るとかは関係なくて、サクサクかどうかですしね。。