7

現在、ViewPagerにビューを横向きに並べ、PagerAdapterでビューを循環させることができます。現在、スワイプで実行したい操作を実行するには、ビューのページでダブルタップする必要があります。コードを投稿することはできますが、必要な部分を抽出するのはやや難しいです...iOSアプリのような機能を実装するViewPagerでスワイプ - スワイプ - スムーススクロール

これらのビューで垂直方向にスワイプし、スワイプとフェードアウトで垂直方向に変換してから、デバイスの端から一定の距離に達すると、動作します。

私が何を考えているかを知るには、ギャラリーアプリで開いた写真をつまんでズームアウトし、水平のフィルムストリップビューを開きます。そこから写真/ビデオを上(または下)にスワイプして削除することができます。同じギャラリーアプリを持っていない人にとっては、iOS上のアプリケーションを閉じるのとまったく同じです。

私はギャラリーアプリのソースコードをスキャンしてみましたが、正しいアクティビティを見つけることはできません。

答えて

3

私はクローニングすることによって、この作業多かれ少なかれなってしまったがよく書かれたAndroid-SwipeToDismissライブラリであり、ListViewコードをViewPagerに置き換えるだけです。

完成品はこのように見えます。

end result

+0

viewpager用に実装したコードを投稿できますか? –

+0

私が質問に述べたように、最小のコードサンプルを抽出するのは難しいです。関係する5つのクラスと2つのインターフェイスがあります。私はライブラリへのリンクを提供しており、ViewPagerを使用するListViewの例を変更することは簡単です(私の意見では) –

+0

ListViewをViewPagerに置き換えるだけでいいですか? –

4
view.setOnTouchListener(new View.OnTouchListener(){ 
    public boolean onTouch(View v, MotionEvent motion) { 
     float y = motion.getY(); 
     /* NOTE: the following line might need to be in runOnUiThread() */ 
     view.animate().alpha(1-Math.abs(y-height/2)/(height/2)).setDuration(50).start(); 
     return true; //false if you want to pass this event on to other listeners 
    } 
}); 

1-Math.abs(y-height/2)/(height/2)を使用するための説明は、私がセンターにいるとき、アルファが1になりたいということであり、それは、上部または下部にあるとき、αは0であることを。 heightの値の取得方法や、アルファを計算するために別の方法を使用する必要がある場合は、自分自身で判断する必要があります。ビューに対する相対的な位置ではなく、画面に対するタッチ位置を取得する場合は、getRawY()を使用します。

さらに、それはあなたがそれを知っているため、MotionEventが押しているかどうかを確認するために役立つこと、ドラッグ、またはそれぞれ、MotionEvent.ACTION_UP、MotionEvent.ACTION_MOVE、およびMotionEvent.ACTION_DOWNで motion.getAction() ==を使用し、イベントを解放することができます。

+0

また、私は変容的な変化ではなくアルファベットの位置的変化を望んでいますか?私は、元の位置またはそれがスワイプされているエッジのいずれかに関して、視界が退色したいと思います。 –

+0

これを反映するようにコードを更新しました。ジェスチャーを使用しなくなりました。 – geokavel

+0

それでは、ViewPagerでビューが翻訳されている間に翻訳する方法はありますか?このコードは、タッチ位置に基づいてビューをフェードアウトするようです。 –

1

、以下のコードをチェックし、あなたにこれがかもしれ役に立つ:

public class MainActivity extends Activity implements View.OnTouchListener{ 

    private RelativeLayout baseLayout; 

    private int previousFingerPosition = 0; 
    private int baseLayoutPosition = 0; 
    private int defaultViewHeight; 

    private boolean isClosing = false; 
    private boolean isScrollingUp = false; 
    private boolean isScrollingDown = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_popup); 
     baseLayout = (RelativeLayout) findViewById(R.id.base_popup_layout);//this is the main layout 
     baseLayout.setOnTouchListener(this); 
    } 


    public boolean onTouch(View view, MotionEvent event) { 

     // Get finger position on screen 
     final int Y = (int) event.getRawY(); 

     // Switch on motion event type 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 

      case MotionEvent.ACTION_DOWN: 
       // save default base layout height 
       defaultViewHeight = baseLayout.getHeight(); 

       // Init finger and view position 
       previousFingerPosition = Y; 
       baseLayoutPosition = (int) baseLayout.getY(); 
       break; 

      case MotionEvent.ACTION_UP: 
       // If user was doing a scroll up 
       if(isScrollingUp){ 
        // Reset baselayout position 
        baseLayout.setY(0); 
        // We are not in scrolling up mode anymore 
        isScrollingUp = false; 
       } 

       // If user was doing a scroll down 
       if(isScrollingDown){ 
        // Reset baselayout position 
        baseLayout.setY(0); 
        // Reset base layout size 
        baseLayout.getLayoutParams().height = defaultViewHeight; 
        baseLayout.requestLayout(); 
        // We are not in scrolling down mode anymore 
        isScrollingDown = false; 
       } 
       break; 
      case MotionEvent.ACTION_MOVE: 
       if(!isClosing){ 
        int currentYPosition = (int) baseLayout.getY(); 

        // If we scroll up 
        if(previousFingerPosition >Y){ 
         // First time android rise an event for "up" move 
         if(!isScrollingUp){ 
          isScrollingUp = true; 
         } 

        // Has user scroll down before -> view is smaller than it's default size -> resize it instead of change it position 
        if(baseLayout.getHeight()<defaultViewHeight){ 
         baseLayout.getLayoutParams().height = baseLayout.getHeight() - (Y - previousFingerPosition); 
         baseLayout.requestLayout(); 
        } 
        else { 
         // Has user scroll enough to "auto close" popup ? 
         if ((baseLayoutPosition - currentYPosition) > defaultViewHeight/4) { 
          closeUpAndDismissDialog(currentYPosition); 
          return true; 
         } 

         // 
        } 
        baseLayout.setY(baseLayout.getY() + (Y - previousFingerPosition)); 

       } 
       // If we scroll down 
       else{ 

        // First time android rise an event for "down" move 
        if(!isScrollingDown){ 
         isScrollingDown = true; 
        } 

        // Has user scroll enough to "auto close" popup ? 
        if (Math.abs(baseLayoutPosition - currentYPosition) > defaultViewHeight/2) 
        { 
         closeDownAndDismissDialog(currentYPosition); 
         return true; 
        } 

        // Change base layout size and position (must change position because view anchor is top left corner) 
        baseLayout.setY(baseLayout.getY() + (Y - previousFingerPosition)); 
        baseLayout.getLayoutParams().height = baseLayout.getHeight() - (Y - previousFingerPosition); 
        baseLayout.requestLayout(); 
       } 

       // Update position 
       previousFingerPosition = Y; 
      } 
      break; 
     } 
     return true; 
    } 
} 

アニメーションのために以下のメソッドを使用します。

public void closeUpAndDismissDialog(int currentPosition){ 
    isClosing = true; 
    ObjectAnimator positionAnimator = ObjectAnimator.ofFloat(baseLayout, "y", currentPosition, -baseLayout.getHeight()); 
    positionAnimator.setDuration(300); 
    positionAnimator.addListener(new Animator.AnimatorListener() 
    { 
     . . . 
     @Override 
     public void onAnimationEnd(Animator animator) 
     { 
      finish(); 
     } 
     . . . 
    }); 
    positionAnimator.start(); 
} 

public void closeDownAndDismissDialog(int currentPosition){ 
    isClosing = true; 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int screenHeight = size.y; 
    ObjectAnimator positionAnimator = ObjectAnimator.ofFloat(baseLayout, "y", currentPosition, screenHeight+baseLayout.getHeight()); 
    positionAnimator.setDuration(300); 
    positionAnimator.addListener(new Animator.AnimatorListener() 
    { 
     . . . 
     @Override 
     public void onAnimationEnd(Animator animator) 
     { 
      finish(); 
     } 
     . . . 
    }); 
    positionAnimator.start(); 
} 
+0

私はbaseLayoutがLinearLayoutではなくViewPagerになると思っていますか?また、私がこれをやろうとしている私のViewPagerがFragmentの中にあるかどうかは重要ですか? –

+0

baseLayoutはXMLレイアウトのルート親ビューです –

+0

アクティビティ全体が移動しないようにしたいのですが、現在ViewPagerで表示されているのは1つのビューだけです。 –

関連する問題