複数ViewにまたがるTouchの当たり判定メモ
こちらも自メモ。
最近はOpenGLやHTML5のCanvas当たりでゴニョゴニョするのが流行りみたいなので
需要はないと思うので(苦笑
話的にはこういう話
ただ、この実装コードは自分の頭では理解むずかしかったので、自分なりに頭悩ませてみた
- 前提条件的には
- imgarr配列に複数のViewが入っています
- それぞれのViewに
と設定するイメージ
for(View iv:imgarr){
iv.setOnTouchListener(listner);
}
- 実装側
悩んだのは
event.getX,event.getY が対象のview上の座標
つうオチでRECTの当たり判定がうまくHitしなかったんですね(汗
ロケーション座標で補正するというお話。
ググると
event.getRowX()、event.getRowY()で取れば良いよ
な話が出てくるんだけど、これだとマルチタッチ判定は出来ない><
- テストコード側
ただテストに関しては、なんでHandlerが使えないのかが不明だったりorz
しか動かない感じでしたね・・・(テストボタン等をアプリ側に設定すればHandlerは動く
[NG]//new Handler().postDelayed(m_runnable,time+i); //普通のActivity内に書くと動く
[NG]//new Handler().post(m_runnable);
[OK] mActivity.runOnUiThread(m_runnable);
ちなみに
- performItemClick は OnClickListnerしている物が対象
- 上記の場合は setOnTouchListener ( new View.OnTouchListener() { している物が対象
というのを勘違いしていて、なんで動かないんだ〜とか馬鹿もやっていました(苦笑
Handlerをテストコードに使う話は
な話なのかな。もう少し調べてみような研究課題かな
テストコードに対する追記)
でOKでした。
new Handler(mActivity.getMainLooper()).postDelayed(m_runnable,time+i);
runOnUiThreadと同じようなスコープで作業しないとテストが通らないとのお話
mActivity.getMainLooper() だとメインスレッドキューに登録される動きらしい。
HandlerThreadで試してたけど、Activityスレッドである事が重要なのかな。。
実装に対する追記)
タッチゲームとかで
2個View同時押しをした場合
- 瞬間的に2回飛んでくる(View1回押したのと、2回押されたの)
で直前の処理をキャンセルしてやる必要があり
なぜ同時押しみたいな挙動をサポートするかというと
あと上記のコードでは記載していないけど
- 実際はImageView自体にtagで情報を付けて sortしてやらないと順番に判定できない
- IS01までサポートする場合はLazyLoadするためにMouseUtil等のべつクラスを作成する必要が有
実際のところは
- IS01だと殆どの人Wifi運用
- Wifi表示の端末に対してAd会社の人が単価の高い広告を表示していない
- AdMob自体もtarget8(2.2)以下の物に対してエラーを吐いてる挙動をしてる<GAでAdの統計情報をとる処理のあたり
でも
- IS01でも動く=凄い軽量なアプリ
というブランディング力は一応あるとのこと
確かに流行りのUnityとかは結構スペックいるからなー
- colAR Mix とかまともに動かなかった。
だからつい最近また
- cocos2d-xあたりでネイティブよりに作ろうぜ
の路線で本がまた大量に出版され始めている気がする*1
TLメモ)
onTouchEventが取れないよー。どうしたらとれるんだろー
2013-07-23 20:33:08 via web
@kerukerupappa 下の子viewにタッチ通す、通さないの関数とか有りませんてしたっけ?
@kimukou_26 ありますた。ただ欲しい部分が下viewじゃ無く隣のviewのイベントなので困っている状態なんです。多分event取得用のviewを画面全体に広げれば行けそうな気がするのです。#日本語がおかしい
@kerukerupappa であればscreenToClientでスクリーン座標補正取得、そのでーたを元にマウス座標、view等の辺り判定をしてやる形がベストかと
@kimukou_26 あざーす。そもそも元となるタッチイベントがとれていないのでそこから頑張ります。
2013-07-24 09:59:22 via web to @kimukou_26
horizontalscrollview#onTouchEventはx軸の差異がでるとonTouchEventを発行し始める。y軸のみ差異ではイベントを発行せず。。全てのイベントをキャッチする場合はonInterceptTouchEventをOverrideする。
2013-07-24 10:42:57 via web