【问题标题】:ViewPager with multiple visible children and selected biggerViewPager 有多个可见的孩子并选择更大
【发布时间】:2014-12-13 18:34:08
【问题描述】:

在我的 Activity 中,我使用 Dave Smith 的 PagerContainer 示例添加了一个 Gallery 类似 View,我用来实例化它的代码与他的示例中的 PagerActivity 非常相似,虽然我更改了布局,因为我需要使用布局权重:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.myapp.PagerContainer
        android:id="@+id/pager_container"
        android:layout_width="match_parent"
        android:overScrollMode="never"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_height="0dp"
        android:layout_weight="0.66"
        >
        <android.support.v4.view.ViewPager
            android:layout_width="150dp"
            android:overScrollMode="never"
            android:layout_height="match_parent"
            android:layout_gravity="center" />
    </com.example.myapp.PagerContainer>

    <ImageView
        android:layout_width="150dp"
        android:layout_height="0dp"
        android:layout_weight="0.34"
        android:id="@+id/current_selection_logo"
        android:layout_gravity="center_horizontal"/>

</LinearLayout>

现在我的ViewPager 工作正常,看起来像这样(我省略了底部的ImageView

但我想调整未选中项目的大小,旨在强调居中的项目(选择),例如:

或:

我已找到this 问题的公认答案,但实施该解决方案意味着我将使选择大于其当前尺寸(这已经是可能的最大值)。

所以我想在PagerAdapter 中编辑instantiateItem 以设置减小的宽度和高度,并在onPageSelected 中使用问题中显示的方法。

问题是我不确定我应该调用哪种LayoutParams,然后在instantiateItem 中调用getWidth()getHeight() 返回0

目前我正在使用:

View v = container.getChildAt(position);
PagerContainer.LayoutParams params = (PagerContainer.LayoutParams)v.getLayoutParams();

但它有时会起作用,有时会抛出 NPE。

我的方法是正确的还是应该以其他方式进行? 在这两种情况下,我应该改变什么来实现我想要的?

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

    为了达到这个结果,我最终使用了PixPlicity's MultiViewPager 并按照@Blackbelt 的建议编写了一个简单的PageTransformer

    private float mScale = 0.8f;
    private class ScalePageTransformer implements ViewPager.PageTransformer{
        @Override
        public void transformPage(View view, float position) {
            if(position==0){
                ViewCompat.setScaleX(view, 1);
                ViewCompat.setScaleY(view, 1);
            }
            else{
                ViewCompat.setScaleX(view, mScale);
                ViewCompat.setScaleY(view, mScale);
            }
        }
    }
    

    结果类似于:

    【讨论】:

    • 不客气@KishanSoni,如果你玩一下浮动position 参数,你甚至可以根据与中心项目的距离设置不同的大小。
    【解决方案2】:

    为此,您必须使用PageTransform。您必须实现的回调接收两个参数。前者是 View 对象,后者是 int。当它的值为零时,表示视图对象指向中心的完全可见对象。 -1 和 -1 分别是左侧和右侧的完全可见视图。您可以使用此值来实现所需的转换。例如,使用 ViewCompat,您可以更改 translateX、translationY 和 Scale 值

    【讨论】:

    • 如果我理解正确的话,PageTransform 只会影响选中的页面和相邻的两个页面。如果我在平板电脑或横向模式下实际上可以一次看到三个以上的页面怎么办?
    • 使用普通实现时确实如此。使用 PageContainer 技巧,您将获得更多。这是我最近发现的。我可以建议你尝试一下
    • 我结束了使用自定义PageTransformer。即使可见页面超过三页,效果也能正常显示!
    • 我的做法一模一样。但我想一次在屏幕上显示 3 页。我已经成功完成了,但问题是缩放的页面,即(第一和第三)页面的视图不可点击。中间的没有缩放,它的视图是可点击的。
    • @ZeeshanShabbir,您必须继承 ViewPager 并处理触摸事件。您可能需要在 View.getLocationOnScreen() 和/或 getLocationInWindow() 之间使用一个
    【解决方案3】:

    我有同样的问题。 我的解决方案是使用MultipleViewPager + PagerTransformer

    而且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2019-03-28
      • 2015-03-07
      • 2023-01-17
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多