David Morrissey | 44e2492 | 2017-11-20 10:36:41 +0000 | [diff] [blame^] | 1 | package com.davemorrissey.labs.subscaleview.test.viewpager; |
David Morrissey | 742b037 | 2017-04-04 10:41:23 +0100 | [diff] [blame] | 2 | |
| 3 | import android.content.Context; |
| 4 | import android.support.v4.view.ViewPager; |
| 5 | import android.util.AttributeSet; |
| 6 | import android.view.MotionEvent; |
| 7 | import android.view.View; |
| 8 | |
| 9 | /** |
| 10 | * From http://stackoverflow.com/a/22797619/2719186 |
| 11 | */ |
| 12 | public class VerticalViewPager extends ViewPager { |
| 13 | |
| 14 | public VerticalViewPager(Context context) { |
| 15 | super(context); |
| 16 | init(); |
| 17 | } |
| 18 | |
| 19 | public VerticalViewPager(Context context, AttributeSet attrs) { |
| 20 | super(context, attrs); |
| 21 | init(); |
| 22 | } |
| 23 | |
| 24 | private void init() { |
| 25 | setPageTransformer(true, new VerticalPageTransformer()); |
| 26 | setOverScrollMode(OVER_SCROLL_NEVER); |
| 27 | } |
| 28 | |
| 29 | private class VerticalPageTransformer implements ViewPager.PageTransformer { |
| 30 | |
| 31 | @Override |
| 32 | public void transformPage(View view, float position) { |
| 33 | if (position < -1) { |
| 34 | view.setAlpha(0); |
| 35 | } else if (position <= 1) { |
| 36 | view.setAlpha(1); |
| 37 | view.setTranslationX(view.getWidth() * -position); |
| 38 | float yPosition = position * view.getHeight(); |
| 39 | view.setTranslationY(yPosition); |
| 40 | } else { |
| 41 | view.setAlpha(0); |
| 42 | } |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | private MotionEvent swapXY(MotionEvent ev) { |
| 47 | float width = getWidth(); |
| 48 | float height = getHeight(); |
| 49 | float newX = (ev.getY() / height) * width; |
| 50 | float newY = (ev.getX() / width) * height; |
| 51 | ev.setLocation(newX, newY); |
| 52 | return ev; |
| 53 | } |
| 54 | |
| 55 | @Override |
| 56 | public boolean onInterceptTouchEvent(MotionEvent ev){ |
| 57 | boolean intercepted = super.onInterceptTouchEvent(swapXY(ev)); |
| 58 | swapXY(ev); |
| 59 | return intercepted; |
| 60 | } |
| 61 | |
| 62 | @Override |
| 63 | public boolean onTouchEvent(MotionEvent ev) { |
| 64 | return super.onTouchEvent(swapXY(ev)); |
| 65 | } |
| 66 | |
Frieder Bluemle | b2d4dad | 2017-03-23 18:25:23 +0800 | [diff] [blame] | 67 | } |