//最小缩放率
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));
}
}
}