【问题标题】:Multi ViewPager change paddingMulti ViewPager 更改填充
【发布时间】:2016-03-13 13:05:03
【问题描述】:

我正在 Android TV 上实现 ViewPager 以显示 3 个这样的项目(背景绿色/紫色是调试背景以描绘整个 ViewPager 的页面):

我使用:

<android.support.v4.view.ViewPager
...
        android:paddingLeft="300px"
        android:paddingRight="300px"
        android:clipToPadding="false"
... 
/>

失去焦点在 ViewPager 上时,我希望 中心项目 缩小并页面靠得更近。要实现插入动画:

                ValueAnimator animator = ValueAnimator.ofInt(300, 400);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator valueAnimator){
                        Integer paddingHorizontal = (Integer) valueAnimator.getAnimatedValue();
                        vpScreenshots.setPadding(paddingHorizontal, 0, paddingHorizontal, 0);
                    }
                });
                animator.setDuration(300);
                animator.start();

动画非常适合第一个元素:

但是,当移动到下一页(左右)时,填充动画开始表现得很奇怪。 移动时,例如向右 填充动画不对左侧项目执行操作,而是对中心和右侧项目执行操作。我越向右移动,效果就越深。结果是:

因此,当发生填充动画时,ViewPager 中的切换页面会破坏项目对齐。 为什么会发生?怎么解决?

【问题讨论】:

    标签: android android-viewpager android-animation android-sliding


    【解决方案1】:

    我设法解决了这个问题。唯一可行的方法是操纵左右项目的“x”参数。

    这里是焦点监听器的代码:

                  if (hasFocus) {
                    Map<Integer, View> neighbors = vpScreenshots.findNeighbors();
                    View leftNeighbor = neighbors.get(0);
                    View rightNeighbor = neighbors.get(1);
                    if (!firstFocus) {
                        leftNeighbor.animate().xBy(-100).setDuration(FOCUS_ANIMATION_DURATION).start();
                        rightNeighbor.animate().xBy(100).setDuration(FOCUS_ANIMATION_DURATION).start();
                    }
                    firstFocus = false;
                } else {
                    Map<Integer, View> neighbors = vpScreenshots.findNeighbors();
                    View leftNeighbor = neighbors.get(0);
                    View rightNeighbor = neighbors.get(1);
    
                    leftNeighbor.animate().xBy(100).setDuration(FOCUS_ANIMATION_DURATION).start();
                    rightNeighbor.animate().xBy(-100).setDuration(FOCUS_ANIMATION_DURATION).start();
                }
    

    查找邻居项附加到 MyViewPager 类:

        public Map<Integer, View> findNeighbors() {
        neighbors = new HashMap<>();
        int currentPosition = getCurrentItem();
        for (int i = 0; i < getChildCount(); i++) {
            View childView = getChildAt(i);
    
            int childPosition = (int) childView.getTag();
            if ((currentPosition - childPosition) == 1) {
                neighbors.put(0, childView);
            }
    
            if ((currentPosition - childPosition) == -1) {
                neighbors.put(1, childView);
            }
        }
    
        return neighbors;
    }
    

    【讨论】:

    • 这对我不起作用,能否请您粘贴整个代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2012-09-03
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多