ScrollTransitionFragment.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package com.yxf.clippathlayout.sample;
  2. import android.os.Bundle;
  3. import android.support.annotation.NonNull;
  4. import android.support.annotation.Nullable;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.widget.NestedScrollView;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.ImageView;
  11. import com.yxf.clippathlayout.Utils;
  12. import com.yxf.clippathlayout.transition.ProgressController;
  13. import com.yxf.clippathlayout.transition.TransitionAdapter;
  14. import com.yxf.clippathlayout.transition.TransitionFrameLayout;
  15. public class ScrollTransitionFragment extends Fragment implements NestedScrollView.OnScrollChangeListener {
  16. private static final String TAG = Utils.getTAG(ScrollTransitionFragment.class);
  17. private NestedScrollView mLayout;
  18. private TransitionFrameLayout mImageContainer;
  19. private ImageView mBelowView, mAboveView;
  20. private ProgressController mController;
  21. private TransitionAdapter mTransitionAdapter;
  22. private boolean mAbove = true;
  23. private boolean mOver = true;
  24. @Nullable
  25. @Override
  26. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  27. mLayout = (NestedScrollView) inflater.inflate(R.layout.fragment_scroll_transition, null);
  28. mImageContainer = mLayout.findViewById(R.id.image_container);
  29. mBelowView = mLayout.findViewById(R.id.below_image);
  30. mAboveView = mLayout.findViewById(R.id.above_image);
  31. mLayout.setOnScrollChangeListener(this);
  32. mLayout.post(new Runnable() {
  33. @Override
  34. public void run() {
  35. if (mController == null) {
  36. initController();
  37. }
  38. }
  39. });
  40. return mLayout;
  41. }
  42. @Override
  43. public void onScrollChange(NestedScrollView nestedScrollView, int i, int i1, int i2, int i3) {
  44. int top = mImageContainer.getTop();
  45. int height = mImageContainer.getHeight();
  46. int scrollCenter = i1 + nestedScrollView.getHeight() / 2;
  47. if (scrollCenter < top && mAbove) {
  48. mOver = true;
  49. } else if (scrollCenter > top + height && !mAbove) {
  50. mOver = true;
  51. } else {
  52. mOver = false;
  53. }
  54. controlProgress(scrollCenter - top, height);
  55. }
  56. private void controlProgress(int current, int total) {
  57. if (mOver) {
  58. if (mController != null) {
  59. mTransitionAdapter.finish();
  60. mController = null;
  61. }
  62. } else {
  63. if (mController == null) {
  64. initController();
  65. }
  66. if (mAbove) {
  67. current = total - current;
  68. }
  69. mController.setProgress(current / (total * 1f));
  70. }
  71. }
  72. private void initController() {
  73. if (mAbove) {
  74. int x = mImageContainer.getWidth() * 3 / 4;
  75. int y = mImageContainer.getHeight() * 3 / 4;
  76. mTransitionAdapter = mImageContainer.switchView(mBelowView);
  77. mTransitionAdapter.setPathCenter(x, y);
  78. mController = mTransitionAdapter.getController();
  79. mAbove = false;
  80. } else {
  81. int x = mImageContainer.getWidth() / 4;
  82. int y = mImageContainer.getHeight() / 4;
  83. mTransitionAdapter = mImageContainer.switchView(mAboveView);
  84. mTransitionAdapter.setPathCenter(x, y);
  85. mController = mTransitionAdapter.getController();
  86. mAbove = true;
  87. }
  88. }
  89. }