package com.zhy.blogcodes.parallax_viewpager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Rect; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import com.zhy.blogcodes.R; /** * Created by zhy on 16/6/23. */ public class CustomViewPager extends ViewPager { private Bitmap mBg = BitmapFactory.decodeResource(getResources(), R.drawable.bg_home); public CustomViewPager(Context context, AttributeSet attrs) { super(context, attrs); } private static final int INVALID_POS = -1; private int mFirstPos = INVALID_POS; @Override protected void dispatchDraw(Canvas canvas) { if (mFirstPos == INVALID_POS) { mFirstPos = getCurrentItem(); } if (this.mBg != null) { int width = mBg.getWidth(); int height = mBg.getHeight(); int count = getAdapter().getCount(); int x = getScrollX() + mFirstPos * getWidth(); //每个Item需要显示图片的宽度 float widthForItem = width * 1.0f / count; //控件每移动一个像素,图片应该移动的像素值 float widthForPerPx = widthForItem * 1.0f / getWidth(); Rect src = new Rect((int) (x * widthForPerPx), 0 , (int) (x * widthForPerPx + widthForItem), height); Rect dest = new Rect( getScrollX(), 0, getScrollX() + getWidth(), getHeight()); canvas.drawBitmap(mBg, src, dest, null); } super.dispatchDraw(canvas); } }