2011-08-17 11 views
1

私はViewFlipperを使って子要素を反転させるAndroidプロジェクトに取り組んでいます。このため私はカスタマイズされたフリッパーを使用しました。これで私はonTouchEvent()メソッドをオーバーライドします。 フリッパーには各子供の画像が含まれていますが、フリップしようとするとタッチイベントは発生しません。 ViewGroupメソッドonInterceptTouchEvent()を無効にしてtrueを返すと、反転が行われますが、これによって各画像のonClickEvent()が受信されません。ViewFlipperはタッチイベントを受け取りません

問題の所在地がわかりません。 falseonInterceptTouchEvent()から返すと、クリックイベントは受信されていますが、タッチイベントは受信されていません。

私には何が欠けていますか? ViewFlipperため

コード:

public class MyViewFlipper extends ViewFlipper { 

    static final String logTag = "ViewFlipper"; 
    static final int MIN_DISTANCE = 30; 
    private float downX, downY, upX, upY; 
    Animation slideLeftIn; 
    Animation slideLeftOut; 
    Animation slideRightIn; 
    Animation slideRightOut; 
    Context context; 
    ViewFlipper viewFlipper; 

    public MyViewFlipper(Context context) { 
     super(context); 
     viewFlipper=this; 
     this.context=context; 
     System.out.println("I am in MyFlipper() counstructor..."); 
    } 

    public MyViewFlipper(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context=context; 
     viewFlipper=this; 
     System.out.println("I am in MyFlipper() counstructor..."); 
     slideLeftIn = 
      AnimationUtils.loadAnimation(context, R.anim.slide_left_in); 
     slideLeftOut = 
      AnimationUtils.loadAnimation(context, R.anim.slide_left_out); 
     slideRightIn = 
      AnimationUtils.loadAnimation(context, R.anim.slide_right_in); 
     slideRightOut = 
      AnimationUtils.loadAnimation(context, R.anim.slide_right_out); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: { 
       downX = event.getX(); 
       downY = event.getY(); 
       return true; 
      } 
      case MotionEvent.ACTION_UP: { 
       upX = event.getX(); 
       upY = event.getY(); 

       float deltaX = downX - upX; 
       float deltaY = downY - upY; 

       // swipe horizontal? 
       if (Math.abs(deltaX) > MIN_DISTANCE) { 
        // left or right 
        if (deltaX < 0) { 
         this.onLeftToRightSwipe(); 
         return true; 
        } 
        if (deltaX > 0) { 
         this.onRightToLeftSwipe(); 
         return true; 
        } 
       } else { 
        if(Math.abs(deltaX)<15){ 
         onClickEvent(); 
        } 
        //Log.i(logTag, "Swipe was only " + Math.abs(deltaX) 
        //+ " long, need at least " + MIN_DISTANCE); 
       } 
       // swipe vertical? 
       if (Math.abs(deltaY) > MIN_DISTANCE) { 
        // top or down 
        if (deltaY < 0) { 
         this.onTopToBottomSwipe(); 
         return true; 
        } 
        if (deltaY > 0) { 
         this.onBottomToTopSwipe(); 
         return true; 
        } 
       } else { 
        Log.i(logTag, "Swipe was only " + Math.abs(deltaX) 
         + " long, need at least " + MIN_DISTANCE); 
       } 

       return true; 
      } 
     } 
     return false; 

    } 

    public void onRightToLeftSwipe() { 

     viewFlipper.setInAnimation(slideLeftIn); 
     viewFlipper.setOutAnimation(slideLeftOut); 
     viewFlipper.showNext(); 
    } 

    public void onLeftToRightSwipe() { 

     viewFlipper.setInAnimation(slideRightIn); 
     viewFlipper.setOutAnimation(slideRightOut); 
     viewFlipper.showPrevious(); 
    } 

    public void onTopToBottomSwipe() { 
     Log.i(logTag, "onTopToBottomSwipe!"); 
     // activity.doSomething(); 
    } 

    public void onBottomToTopSwipe() { 
     Log.i(logTag, "onBottomToTopSwipe!"); 
     // activity.doSomething(); 
    } 

    public void onClickEvent(){ 
     Toast.makeText(context, "Click",Toast.LENGTH_SHORT); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return true; // Here if true then Flipping done. 
         // And if false then click event done. 
    } 

} 
+0

post logcat errors – Randroid

+0

私のlogCatにエラーはありません。タッチイベントまたはクリックイベントのいずれかを処理しました。 –

答えて

4

私は同様の問題がありました。 ここに私がしたことがあります。私はビューフリッパーでリストビューを持っていました。リストビューの​​をオーバーライドし、そこからビューフリッパーをアニメーション化しました。それは私のために働いた。

​​をImageViewに変更してみてください。

+0

返信いただきありがとうございます。しかしここでは、私のフリッパーの子供が2つ以上の画像を含んでいること、つまり3列と3列の画像(鳥のようにグリッドは使わない)を意味することを明確にしたい。私はイメージ上でsetOnTouchListener()を実装する場合、私は反転するための十分な&正しいmovemntを得ることができます。 –

+0

こんにちはShafi、私は私のイメージビューでsetOnTouchListener()をオーバーライドします。私が望むように完璧な仕事です。お返事をありがとうございます。しかし、私はちょうどフリッパータッチと子のクリックイベントを別々に処理するためのネイティブネイティブはないと尋ねたい。ありがとうございます –

+0

代替があるかどうかわかりません。 P.S.-答えが役に立つ場合は、投票して回答を受け入れてください。 – Shafi

関連する問題