运用贝塞尔曲线描绘android翻页效果(浏览图片时,图片间切换达到书本翻页的效果).
效果图:
如何使用首先你需要创建Pager实例,并添加到布局中DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
screenWidth = displayMetrics.widthPixels;//获取屏幕的宽度
screenHeight = displayMetrics.heightPixels;
pager = new Pager(this, screenWidth, screenHeight);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
addContentView(pager, layoutParams);//将pager添加到布局中
Pager是核心代码,由它来控制手势实现翻书的。
2. 分别创建俩组Bitmap、canvas。代表当前页和下一页的mCurPageBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
mNextPageBitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888);
mCurPageCanvas = new Canvas(mCurPageBitmap);
mNextPageCanvas = new Canvas(mNextPageBitmap);
pager.setBitmaps(mCurPageBitmap, mCurPageBitmap);//设置bitmap到pager中,初始时可以都设置成当前的bitmap
3. 让Pager监听手势操作pager.setOnTouchListener(new View.OnTouchListener() {
// private int count = pages.length;
// private int currentIndex = 0;
// private int lastIndex = 0;
// private Bitmap lastBitmap = null;
@Override
public boolean onTouch(View v, MotionEvent e) {
boolean ret = false;
if (v == pager) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
pager.calcCornerXY(e.getX(), e.getY());//获得触碰的起始点位置,用于判断向左翻还是向右翻。
// lastBitmap = currentBitmap;
// lastIndex = currentIndex;
//
// pagerFactory.onDraw(mCurPageCanvas, currentBitmap);
// if (pager.DragToRight()) { // 向右滑动,显示前一页
// if (currentIndex == 0) return false;
// pager.abortAnimation();
// currentIndex--;
// loadImage(mNextPageCanvas, currentIndex);
// } else { // 向左滑动,显示后一页
// if (currentIndex + 1 == count) return false;
// pager.abortAnimation();
// currentIndex++;
// loadImage(mNextPageCanvas, currentIndex);
// }
} else if (e.getAction() == MotionEvent.ACTION_MOVE) {
} else if (e.getAction() == MotionEvent.ACTION_UP) {
// if (!pager.canDragOver()) {
// currentIndex = lastIndex;
// currentBitmap = lastBitmap;
// }
}
ret = pager.doTouchEvent(e);
return ret;
}
return false;
}
});
未注释的部分是必须要有的。
4. 加载图片pagerFactory = new PagerFactory(getApplicationContext());private void loadImage(final Canvas canvas, int index) {
Bitmap bitmap = getBitmap(pages[index]);
currentBitmap = bitmap;
pagerFactory.onDraw(canvas, bitmap);
pager.setBitmaps(mCurPageBitmap, mNextPageBitmap);
pager.postInvalidate();
}
PagerFactory是用于渲染Bitmap的。
5. 加载第一张图片loadImage(mCurPageCanvas, 0);