【问题标题】:Android Vertical View Pager like NewsInShort ApplicationAndroid Vertical Viewpager,如 NewsInShorts 应用程序
【发布时间】:2015-12-15 21:59:18
【问题描述】:

如何像在 NewsInShort 应用程序中一样在 android 中创建垂直视图寻呼机。 https://play.google.com/store/apps/details?id=com.nis.app

这个应用程序包含新闻提要,当我们向上滑动当前新闻时,下一条新闻会以动画形式出现,就像我将当前新闻向上滑动一点,然后下一条新闻就会以这种方式显示。 向下滑动也是如此。

我在 Github 上找到了一个库。
https://github.com/rharter/ViewPager-Android

但是这个库不提供像 NewsInShort App 这样的东西。

如果有人曾经创建过这样的视图或库,请告诉我。

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    虽然回答为时已晚,但它可以帮助其他想要创建动画(viewpager 转换器)的人,比如 inshorts 应用程序。

    public class VerticalViewPager extends ViewPager {
    
    public VerticalViewPager(Context context) {
        super(context);
        init();
    }
    
    public VerticalViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    
    private void init() {
        setPageTransformer(true, new DepthPageTransformer());
        setOverScrollMode(OVER_SCROLL_NEVER);
    }
    
    
    /**
     * Swaps the X and Y coordinates of your touch event.
     */
    private MotionEvent swapXY(MotionEvent ev) {
        float width = getWidth();
        float height = getHeight();
    
        float newX = (ev.getY() / height) * width;
        float newY = (ev.getX() / width) * height;
    
        ev.setLocation(newX, newY);
    
        return ev;
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
        swapXY(ev); // return touch coordinates to original reference frame for any child views
        return intercepted;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(swapXY(ev));
    }
    
    public class DepthPageTransformer implements ViewPager.PageTransformer {
        private static final float MIN_SCALE = 0.75f;
    
        public void transformPage(View view, float position) {
            int pageWidth = view.getWidth();
    
            if (position < -1) { // [-Infinity,-1)
                // This page is way off-screen to the left.
                view.setAlpha(0);
    
            } else if (position <= 0) { // [-1,0]
                // Use the default slide transition when moving to the left page
                view.setAlpha(1);
                view.setTranslationX(view.getWidth() * -position);
    
                //set Y position to swipe in from top
                float yPosition = position * view.getHeight();
                view.setTranslationY(yPosition);
                view.setScaleX(1);
                view.setScaleY(1);
    
            } else if (position <= 1) { // (0,1]
                // Fade the page out.
                view.setAlpha(1 - position);
    
                // Counteract the default slide transition
                view.setTranslationX(pageWidth * -position);
    
                // Scale the page down (between MIN_SCALE and 1)
                float scaleFactor = MIN_SCALE
                        + (1 - MIN_SCALE) * (1 - Math.abs(position));
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);
    
            } else { // (1,+Infinity]
                // This page is way off-screen to the right.
                view.setAlpha(0);
            }
        }
    }
    

    }

    你需要在xml中使用VerticalViewPager

    【讨论】:

      【解决方案2】:

      经过长时间的研究,我找到了解决方案。
      对于 ViewPager,我们可以设置 pageTransformer 属性并可以分配自定义 Transformation。
      我想要的转换是 DepthPageTransformer。以下是记录此转换的链接。
      https://stuff.mit.edu/afs/sipb/project/android/docs/training/animation/screen-slide.html#depth-page

      public class DepthPageTransformer implements ViewPager.PageTransformer {
          private static float MIN_SCALE = 0.75f;
      
          public void transformPage(View view, float position) {
              int pageWidth = view.getWidth();
      
              if (position < -1) { // [-Infinity,-1)
                  // This page is way off-screen to the left.
                  view.setAlpha(0);
      
              } else if (position <= 0) { // [-1,0]
                  // Use the default slide transition when moving to the left page
                  view.setAlpha(1);
                  view.setTranslationX(0);
                  view.setScaleX(1);
                  view.setScaleY(1);
      
              } else if (position <= 1) { // (0,1]
                  // Fade the page out.
                  view.setAlpha(1 - position);
      
                  // Counteract the default slide transition
                  view.setTranslationX(pageWidth * -position);
      
                  // Scale the page down (between MIN_SCALE and 1)
                  float scaleFactor = MIN_SCALE
                          + (1 - MIN_SCALE) * (1 - Math.abs(position));
                  view.setScaleX(scaleFactor);
                  view.setScaleY(scaleFactor);
      
              } else { // (1,+Infinity]
                  // This page is way off-screen to the right.
                  view.setAlpha(0);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多