2010年12月28日火曜日

androidのViewを重ねて色々した時の問題。特にsetOnTouchListenerについて不勉強だった件について

public class example extends Activity{
private View1 view1 = new View1();
private View1 view2 = new View2();
private FrameLayout layout = new FrameLayout();

private Handler handler= new Handler();
private boolean view2Flag = false;

@Override
public void onCreate(Bundle savedInstanceState) {
layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
layout.addView(view1);

//view1がタッチされた際にView2を表示する
view1.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
if(view2Flag){
return false;
}else{
view2Flag = true;
//View2を追加してアニメーションでスライドさせてくる。
layout.addView(view2);
AnimationSet animationset = new AnimationSet(true);
animationset.addAnimation(new TranslateAnimation(0, 0, getHeight(), 0));
animationset.setDuration(500);
view2.startAnimation(animationset);

//View2を5000ms秒後にスライドさせたあとlayoutから削除する処理をhandlerに投げておく
handler.postDelayed(new Runnable() {
public void run() {
AnimationSet animationset = new AnimationSet(true);
animationset.addAnimation(new TranslateAnimation(0, 0, 0, getHeight()));
animationset.setDuration(500);
view2.startAnimation(animationset);
layout.removeView(view2);
view2Flag = false;
}
}, 5000);

return false;
}
}
return false;
}
});

}
}

イメージとしてはView1がメインのViewでView2が独自のメニュー画面みたいなイメージのアプリを作ってた。
で、View1でonFlingを取っていたが何故か取れなくなった。
理由はOntouchListenrでreturnでtrueを返していたから。
どうやらtrueを返したら、viewで継承、オーバーライドしたonFlingとかを無視するみたい。
というかタッチイベントすべて無視する。

リファレンスに書いてあった。
OnTouchListenerのonTouchの項目に
Returns
True if the listener has consumed the event, false otherwise.
って書いてあった。

いつも何も考えずにreturn false書き続けてたから理解してなかった。

#追記
中途半端に解決してた状況というかonFlingだけしか動かない状況っていうのは
if(event.getAction() == MotionEvent.ACTION_UP)でreturn trueとかしちゃった場合。
onFlingは内部でACTION_UPが検出された時点でフリックした距離とか返してくれるから動かない。
ただしonScrollはACTION_DOWNとACTION_MOVE辺りを取得して処理してるから問題ない。
そんな感じだったみたい?
これは何かの役に立つかは微妙だけど、覚えておく。

0 件のコメント:

コメントを投稿