ViewPager具有多个可见子项并且选择更大

时间:2014-12-13 18:34:09

标签: android android-viewpager

在我的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

current viewpager

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

wanted_viewpager

或:

wanted_viewpager_min

我已找到this问题的已接受答案,但实施该解决方案意味着我将使选择大于其当前维度(已经是最大可能)。

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

问题在于,我不确定应该拨打哪种LayoutParams并在getWidth()中调用getHeight()instantiateItem返回0

目前我正在使用:

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

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

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

3 个答案:

答案 0 :(得分:7)

为了达到这个结果,我最终使用了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);
        }
    }
}

结果如下: result

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

它工作正常。