配置 ViewPager 画廊效果(居中显示,两侧露出相邻页面)--建议收藏

效果图:

xml布局

XML 复制代码
            <!-- 关键修改:添加 clipToPadding 和 padding 实现两侧露出效果 -->
            <!-- 使用 FrameLayout 包裹,确保内容居中 -->
            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <android.support.v4.view.ViewPager
                    android:id="@+id/viewPagerPoster"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:clipToPadding="false"
                    android:paddingStart="40dp"
                    android:paddingEnd="40dp"
                    android:overScrollMode="never" />

            </FrameLayout>

关键代码:

java 复制代码
    /**
     * 配置 ViewPager 画廊效果(居中显示,两侧露出相邻页面)
     */
    private void setupGalleryViewPager() {
        // 设置预加载页面数,确保相邻页面已加载
        viewPagerPoster.setOffscreenPageLimit(2);

        // 设置页面间距(item之间的间距)
        viewPagerPoster.setPageMargin(getResources().getDimensionPixelSize(R.dimen.dp_6));

        // 设置 PageTransformer 实现缩放效果(可选,增强视觉层次)
        viewPagerPoster.setPageTransformer(false, new ViewPager.PageTransformer() {
            private static final float MIN_SCALE = 0.9f; // 最小缩放比例
            private static final float MAX_SCALE = 1.0f; // 最大缩放比例

            @Override
            public void transformPage(View page, float position) {
                // position: -1(左侧页面)  0(当前页面)  1(右侧页面)
                if (position < -1 || position > 1) {
                    page.setAlpha(0.5f);
                    page.setScaleX(MIN_SCALE);
                    page.setScaleY(MIN_SCALE);
                } else {
                    // 计算缩放比例:当前页面最大,两侧页面缩小
                    float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position) * 0.1f);
                    page.setScaleX(scaleFactor);
                    page.setScaleY(scaleFactor);

                    // 透明度变化
                    page.setAlpha(0.9f + (scaleFactor - MIN_SCALE) / (MAX_SCALE - MIN_SCALE) * 0.5f);
//                    page.setAlpha(1);
                }
            }
        });

        // 重要:设置点击事件,让两侧页面可点击切换
        viewPagerPoster.setOnTouchListener(new View.OnTouchListener() {
            private float startX;

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startX = event.getX();
                        break;
                    case MotionEvent.ACTION_UP:
                        float endX = event.getX();
                        float width = v.getWidth();

                        // 点击左侧区域切换到上一页
                        if (startX < width * 0.2f && currentPosition > 0) {
                            viewPagerPoster.setCurrentItem(currentPosition - 1, true);
                            return true;
                        }
                        // 点击右侧区域切换到下一页
                        else if (startX > width * 0.8f && currentPosition < posterUrls.size() - 1) {
                            viewPagerPoster.setCurrentItem(currentPosition + 1, true);
                            return true;
                        }
                        break;
                }
                return false;
            }
        });
    }

    /**
     * 更新页码指示器
     */
    private void updatePageIndicator() {
        if (posterUrls != null && !posterUrls.isEmpty()) {
            int currentPage = currentPosition + 1;
            int totalPages = posterUrls.size();
            tvPageIndicator.setText(currentPage + "/" + totalPages);
        } else {
            tvPageIndicator.setText("0/0");
        }
    }
相关推荐
律宏阔30 分钟前
Android 手机通过 adblib 使用 ADB Wi-Fi 控制 Android 9 开发板
android
律宏阔34 分钟前
Android App 里实现开机动画替换
android
消失的旧时光-19431 小时前
Android 系统层扫盲 05:Android 开机后发生了什么?从 Bootloader 到 Launcher
android·zygote·fork·aosp·cow
hunterandroid2 小时前
Android 线上卡顿治理:从布局层级到主线程负载的全链路排查
android
恋猫de小郭3 小时前
Dart Skills CLI 1.0 :AI 时代的 Dart 交付支持
android·前端·flutter
2501_916007473 小时前
使用Apple Dashboards显示和自定iOS应用性能指标与数据可视化指南
android·ios·小程序·https·uni-app·iphone·webview
蜡台4 小时前
# 已解决|MySQL 8\.4\.11 密码正确仍报错1045 \(28000\) Access denied 终极修复方案
android·mysql·adb
JMchen1234 小时前
2026年六款主流AI编程工具深度实测:Cursor、Copilot、Claude Code等对比与选型思考
android·kotlin·copilot·ai编程·开发工具·cursor·claude code
mmsx4 小时前
osmdroid 地图实战 05|让地图动起来:三个实时能力 + 六条工程排雷清单
android
码农coding4 小时前
android12 SystemUI组件之StatusBar启动
android