2016-10-20 4 views
0

私は150dpのmarginTopで始まるrecyclerViewを持っています。 recyclerViewを上にスクロールすると、marginTopが0に達するまで減らされ、画面全体が占有され、逆にスクロールして150dp marginTopに戻るようにします。RecyclerView - プログラムで変更する代わりにマージンを変更するアニメーション

現在、私は次のよう

final RecyclerView v = (RecyclerView) findViewById(R.id.recycler_view); 
//calculate px given the 150dp 
DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
final int px = (int)((150 * displayMetrics.density) + 0.5); 

v.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy){ 
       offset += dy; 
       ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); 
       lp.setMargins(0, px - offset, 0, 0); 
       v.setLayoutParams(lp); 
      } 
     }); 

でこれを実現していますこれは正常に動作しますが、しばしばそれは非常に滑らかではなく、非常に「ギザギザ」感じています。この関数を実装するためのより良い、よりスムーズな方法がありますか?おそらく、いくつかのタイプのアニメーションがありますか?

EDIT:一部の人には解決策を提示しましたが、正確には探していません。フォローアップの質問のコメントをご覧ください。

+0

http://stackoverflow.com/questions/40167073/recyclerview-itemdecoration-blocks-touch-access-to-viewpager-behind-it – user3277633

答えて

0

これは潜在的な解決策です。

class PaddingItemDecoration extends RecyclerView.ItemDecoration { 
    private final int size; 

    PaddingItemDecoration(int size) { 
     this.size = size; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     super.getItemOffsets(outRect, view, parent, state); 

     if (parent.getChildAdapterPosition(view) == 0) { 
      outRect.top += size; 
     } 
    } 
} 

次のクラスを作成し、これはあなたがこの背後に持つかもしれない、画面上のタッチイベントを無効にすることに注意、しかしそう

recyclePosts.addItemDecoration(new PaddingItemDecoration((int)size); 

のようなあなたのrecyclerViewでそれを設定することができます高さがsizeの「見えない」パディングが、それらを触手不能にします。

関連する問題