Android中轮播所用到viewPager.PageTransformer 页面滑动时候处理图片缩放效果代码

本文介绍了一种自定义ViewPager.PageTransformer实现滑动时页面缩放及透明度变化的效果。通过计算图片的缩放比例、边距及透明度,使得在滑动过程中,非中心页面会逐渐缩小并半透明显示,而中心页面则保持正常状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class ScalePagerTransformer implements ViewPager.PageTransformer {
        //最小缩放率
        private static final float MIN_SCALE = 0.85f;
        //最小的透明度
        private static final float MIN_ALPHA = 0.5f;
        //这个就是在viewpager 页面滑动的时候会回调这个方法
        @Override
        public void transformPage(View view, float position) {
            //当前的图片位置 ,viewpager设置显示3个图片,最左边的为-1 中间为0  右边位置为1
            if (position >= -1 || position <= 1) {
                //图片高
                final float height = view.getHeight();
                //图片宽
                final float width = view.getWidth();
                //缩放因子,    如果是中间位置0,得到因子为1,不缩放,如果为-1或者1得到缩放因子为0.85,就进行缩放
                //                                    0.85        如果为中间位置,这就是0 ,Math.abs = 0
                final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
                //            求出来图片要进行缩放后的高度,如果为中间位置,scaleFactor =1 ,那么这个vertMargin = 0
                //          如果是两边位置scaleFactor = 0.85  得到vertMargin = height*0.15/2
                final float vertMargin = height * (1 - scaleFactor) / 2;
                final float horzMargin = width * (1 - scaleFactor) / 2;
                // 这个方法就是进行缩放所指定的中心点的位置,就是图片的中心点
                view.setPivotX(0.5f * height);
                view.setPivotY(0.5f * width);
                //这个是进行位移,应该是处理两个图片之间的间距
                if (position < 0) {
                    view.setTranslationX(horzMargin - vertMargin / 2);
                } else {
                    view.setTranslationX(-horzMargin + vertMargin / 2);
                }
                //进行缩放
                view.setScaleX(scaleFactor);
                view.setScaleY(scaleFactor);
                //进行透明度处理 ,比如如果是在中间位置  0.5 + (1 - 0.85)/(1-0.85)*(1-0.5)= 0.5+0.15/0.15 * 0.5 = 0.5+0.5 = 1
                            // 如果是两边位置 0.5 + (0.85 - 0.85)/(1-0.85)*(1-0.5) = 0.5,进行半透明处理
                view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值