Skip to content

Commit 23a8376

Browse files
committed
Merge pull request #50 from daisuke-nomura/master
reverse layout
2 parents 0f88312 + 0a6722f commit 23a8376

File tree

5 files changed

+204
-8
lines changed

5 files changed

+204
-8
lines changed

app/src/main/AndroidManifest.xml

+6
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
android:name=".MaterialDemoActivity"
3333
android:theme="@style/Theme.DesignDemo">
3434
</activity>
35+
<activity
36+
android:name=".ReverseSingleFlingPagerActivity" >
37+
</activity>
38+
<activity
39+
android:name=".ReverseVerticalPagerActivity" >
40+
</activity>
3541
</application>
3642

3743
</manifest>

app/src/main/java/com/lsjwzh/widget/recyclerviewpagerdeomo/MainActivity.java

+12
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,18 @@ void onClick() {
7474
startActivity(new Intent(MainActivity.this, LoopPagerActivity.class));
7575
}
7676
});
77+
mDemoListAdapter.add(new DemoItem("Reverse Single Fling Pager(like official ViewPager)") {
78+
@Override
79+
void onClick() {
80+
startActivity(new Intent(MainActivity.this, ReverseSingleFlingPagerActivity.class));
81+
}
82+
});
83+
mDemoListAdapter.add(new DemoItem("Reverse Vertical ViewPager Demo") {
84+
@Override
85+
void onClick() {
86+
startActivity(new Intent(MainActivity.this, ReverseVerticalPagerActivity.class));
87+
}
88+
});
7789
mDemoListAdapter.add(new DemoItem("3D effect Demo(TODO)") {
7890
@Override
7991
void onClick() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.lsjwzh.widget.recyclerviewpagerdeomo;
2+
3+
import android.support.v7.widget.LinearLayoutManager;
4+
import android.support.v7.widget.RecyclerView;
5+
import android.util.Log;
6+
import android.view.View;
7+
8+
import com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager;
9+
10+
public class ReverseSingleFlingPagerActivity extends SingleFlingPagerActivity {
11+
@Override
12+
protected void initViewPager() {
13+
mRecyclerView = (RecyclerViewPager)findViewById(R.id.viewpager);
14+
LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
15+
true);
16+
mRecyclerView.setLayoutManager(layout);
17+
mRecyclerView.setAdapter(new LayoutAdapter(this, mRecyclerView));
18+
mRecyclerView.setHasFixedSize(true);
19+
mRecyclerView.setLongClickable(true);
20+
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
21+
@Override
22+
public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) {
23+
// updateState(scrollState);
24+
}
25+
26+
@Override
27+
public void onScrolled(RecyclerView recyclerView, int i, int i2) {
28+
// mPositionText.setText("First: " + mRecyclerViewPager.getFirstVisiblePosition());
29+
int childCount = mRecyclerView.getChildCount();
30+
int width = mRecyclerView.getChildAt(0).getWidth();
31+
int padding = (mRecyclerView.getWidth() - width) / 2;
32+
// mCountText.setText("Count: " + childCount);
33+
34+
for (int j = 0; j < childCount; j++) {
35+
View v = recyclerView.getChildAt(j);
36+
//往左 从 padding 到 -(v.getWidth()-padding) 的过程中,由大到小
37+
float rate = 0;
38+
;
39+
if (v.getLeft() <= padding) {
40+
if (v.getLeft() >= padding - v.getWidth()) {
41+
rate = (padding - v.getLeft()) * 1f / v.getWidth();
42+
} else {
43+
rate = 1;
44+
}
45+
v.setScaleY(1 - rate * 0.1f);
46+
v.setScaleX(1 - rate * 0.1f);
47+
48+
} else {
49+
//往右 从 padding 到 recyclerView.getWidth()-padding 的过程中,由大到小
50+
if (v.getLeft() <= recyclerView.getWidth() - padding) {
51+
rate = (recyclerView.getWidth() - padding - v.getLeft()) * 1f / v.getWidth();
52+
}
53+
v.setScaleY(0.9f + rate * 0.1f);
54+
v.setScaleX(0.9f + rate * 0.1f);
55+
}
56+
}
57+
}
58+
});
59+
mRecyclerView.addOnPageChangedListener(new RecyclerViewPager.OnPageChangedListener() {
60+
@Override
61+
public void OnPageChanged(int oldPosition, int newPosition) {
62+
Log.d("test", "oldPosition:" + oldPosition + " newPosition:" + newPosition);
63+
}
64+
});
65+
66+
mRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
67+
@Override
68+
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
69+
if (mRecyclerView.getChildCount() < 3) {
70+
if (mRecyclerView.getChildAt(1) != null) {
71+
if (mRecyclerView.getCurrentPosition() == 0) {
72+
View v1 = mRecyclerView.getChildAt(1);
73+
v1.setScaleY(0.9f);
74+
v1.setScaleX(0.9f);
75+
} else {
76+
View v1 = mRecyclerView.getChildAt(0);
77+
v1.setScaleY(0.9f);
78+
v1.setScaleX(0.9f);
79+
}
80+
}
81+
} else {
82+
if (mRecyclerView.getChildAt(0) != null) {
83+
View v0 = mRecyclerView.getChildAt(0);
84+
v0.setScaleY(0.9f);
85+
v0.setScaleX(0.9f);
86+
}
87+
if (mRecyclerView.getChildAt(2) != null) {
88+
View v2 = mRecyclerView.getChildAt(2);
89+
v2.setScaleY(0.9f);
90+
v2.setScaleX(0.9f);
91+
}
92+
}
93+
94+
}
95+
});
96+
}
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.lsjwzh.widget.recyclerviewpagerdeomo;
2+
3+
import android.support.v7.widget.LinearLayoutManager;
4+
import android.support.v7.widget.RecyclerView;
5+
import android.view.View;
6+
7+
import com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager;
8+
9+
public class ReverseVerticalPagerActivity extends VerticalPagerActivity {
10+
@Override
11+
protected void initViewPager() {
12+
mRecyclerView = (RecyclerViewPager) findViewById(R.id.viewpager);
13+
14+
LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL,
15+
true);
16+
mRecyclerView.setTriggerOffset(0.15f);
17+
mRecyclerView.setFlingFactor(0.25f);
18+
mRecyclerView.setLayoutManager(layout);
19+
mRecyclerView.setAdapter(new LayoutAdapter(this, mRecyclerView));
20+
mRecyclerView.setHasFixedSize(true);
21+
mRecyclerView.setLongClickable(true);
22+
23+
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
24+
@Override
25+
public void onScrollStateChanged(RecyclerView recyclerView, int scrollState) {
26+
27+
}
28+
29+
@Override
30+
public void onScrolled(RecyclerView recyclerView, int i, int i2) {
31+
// mPositionText.setText("First: " + mRecyclerViewPager.getFirstVisiblePosition());
32+
int childCount = mRecyclerView.getChildCount();
33+
int width = mRecyclerView.getChildAt(0).getWidth();
34+
int padding = (mRecyclerView.getWidth() - width) / 2;
35+
36+
for (int j = 0; j < childCount; j++) {
37+
View v = recyclerView.getChildAt(j);
38+
//往左 从 padding 到 -(v.getWidth()-padding) 的过程中,由大到小
39+
float rate = 0;
40+
if (v.getLeft() <= padding) {
41+
if (v.getLeft() >= padding - v.getWidth()) {
42+
rate = (padding - v.getLeft()) * 1f / v.getWidth();
43+
} else {
44+
rate = 1;
45+
}
46+
v.setScaleY(1 - rate * 0.1f);
47+
} else {
48+
//往右 从 padding 到 recyclerView.getWidth()-padding 的过程中,由大到小
49+
if (v.getLeft() <= recyclerView.getWidth() - padding) {
50+
rate = (recyclerView.getWidth() - padding - v.getLeft()) * 1f / v.getWidth();
51+
}
52+
v.setScaleY(0.9f + rate * 0.1f);
53+
}
54+
}
55+
}
56+
});
57+
}
58+
}

lib/src/main/java/com/lsjwzh/widget/recyclerviewpager/RecyclerViewPager.java

+31-8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.os.Build;
1010
import android.os.Parcelable;
1111
import android.support.annotation.NonNull;
12+
import android.support.v7.widget.LinearLayoutManager;
1213
import android.support.v7.widget.RecyclerView;
1314
import android.util.AttributeSet;
1415
import android.util.Log;
@@ -44,6 +45,7 @@ public class RecyclerViewPager extends RecyclerView {
4445
int mMinTopWhenDragging = Integer.MAX_VALUE;
4546
private int mPositionOnTouchDown = -1;
4647
private boolean mHasCalledOnPageChanged = true;
48+
private boolean reverseLayout = false;
4749

4850
public RecyclerViewPager(Context context) {
4951
this(context, null);
@@ -138,6 +140,15 @@ public RecyclerViewPagerAdapter getWrapperAdapter() {
138140
return mViewPagerAdapter;
139141
}
140142

143+
@Override
144+
public void setLayoutManager(LayoutManager layout) {
145+
super.setLayoutManager(layout);
146+
147+
if (layout instanceof LinearLayoutManager) {
148+
reverseLayout = ((LinearLayoutManager) layout).getReverseLayout();
149+
}
150+
}
151+
141152
@Override
142153
public boolean fling(int velocityX, int velocityY) {
143154
boolean flinging = super.fling((int) (velocityX * mFlingFactor), (int) (velocityY * mFlingFactor));
@@ -216,6 +227,8 @@ public int getCurrentPosition() {
216227
* adjust position before Touch event complete and fling action start.
217228
*/
218229
protected void adjustPositionX(int velocityX) {
230+
if (reverseLayout) velocityX *= -1;
231+
219232
int childCount = getChildCount();
220233
if (childCount > 0) {
221234
int curPosition = ViewUtils.getCenterXChildPosition(this);
@@ -239,9 +252,11 @@ protected void adjustPositionX(int velocityX) {
239252
View centerXChild = ViewUtils.getCenterXChild(this);
240253
if (centerXChild != null) {
241254
if (mTouchSpan > centerXChild.getWidth() * mTriggerOffset * mTriggerOffset && targetPosition != 0) {
242-
targetPosition--;
255+
if (!reverseLayout) targetPosition--;
256+
else targetPosition++;
243257
} else if (mTouchSpan < centerXChild.getWidth() * -mTriggerOffset && targetPosition != mViewPagerAdapter.getItemCount() - 1) {
244-
targetPosition++;
258+
if (!reverseLayout) targetPosition++;
259+
else targetPosition --;
245260
}
246261
}
247262
}
@@ -276,6 +291,8 @@ public void clearOnPageChangedListeners() {
276291
* adjust position before Touch event complete and fling action start.
277292
*/
278293
protected void adjustPositionY(int velocityY) {
294+
if (reverseLayout) velocityY *= -1;
295+
279296
int childCount = getChildCount();
280297
if (childCount > 0) {
281298
int curPosition = ViewUtils.getCenterYChildPosition(this);
@@ -296,9 +313,11 @@ protected void adjustPositionY(int velocityY) {
296313
View centerYChild = ViewUtils.getCenterYChild(this);
297314
if (centerYChild != null) {
298315
if (mTouchSpan > centerYChild.getHeight() * mTriggerOffset && targetPosition != 0) {
299-
targetPosition--;
316+
if (!reverseLayout) targetPosition--;
317+
else targetPosition++;
300318
} else if (mTouchSpan < centerYChild.getHeight() * -mTriggerOffset && targetPosition != mViewPagerAdapter.getItemCount() - 1) {
301-
targetPosition++;
319+
if (!reverseLayout) targetPosition++;
320+
else targetPosition--;
302321
}
303322
}
304323
}
@@ -381,16 +400,20 @@ public void onScrollStateChanged(int state) {
381400
int spanX = mCurView.getLeft() - mFisrtLeftWhenDragging;
382401
// if user is tending to cancel paging action, don't perform position changing
383402
if (spanX > mCurView.getWidth() * mTriggerOffset && mCurView.getLeft() >= mMaxLeftWhenDragging) {
384-
targetPosition--;
403+
if (!reverseLayout) targetPosition--;
404+
else targetPosition ++;
385405
} else if (spanX < mCurView.getWidth() * -mTriggerOffset && mCurView.getLeft() <= mMinLeftWhenDragging) {
386-
targetPosition++;
406+
if (!reverseLayout) targetPosition++;
407+
else targetPosition--;
387408
}
388409
} else {
389410
int spanY = mCurView.getTop() - mFirstTopWhenDragging;
390411
if (spanY > mCurView.getHeight() * mTriggerOffset && mCurView.getTop() >= mMaxTopWhenDragging) {
391-
targetPosition--;
412+
if (!reverseLayout) targetPosition--;
413+
else targetPosition++;
392414
} else if (spanY < mCurView.getHeight() * -mTriggerOffset && mCurView.getTop() <= mMinTopWhenDragging) {
393-
targetPosition++;
415+
if (!reverseLayout) targetPosition++;
416+
else targetPosition--;
394417
}
395418
}
396419
}

0 commit comments

Comments
 (0)