参考http://www.blogjava.net/wangxinsh55/archive/2011/09/21/359146.html实现,具体代码如下:

public class PageWidget extends View {private Bitmap foreImage;private Bitmap bgImage;private PointF touchPt;private int screenWidth;private int screenHeight;private GradientDrawable shadowDrawableRL;private GradientDrawable shadowDrawableLR;private ColorMatrixColorFilter mColorMatrixFilter;private Scroller mScroller;private int lastTouchX;public PageWidget(Context context) {super(context);// TODO Auto-generated constructor stubtouchPt = new PointF(-1,-1);//ARGB A(0-透明,255-不透明)    int[] color = { 0xb0333333 ,0x00333333};    shadowDrawableRL = new GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, color);    shadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT);    shadowDrawableLR = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, color);    shadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT);             float array[] = { 0.55f,    0,    0,     0, 80.0f,            0    ,0.55f,    0,     0, 80.0f,              0    ,    0,0.55f,     0, 80.0f,            0    ,    0,    0,  0.2f, 0};        ColorMatrix cm = new ColorMatrix();        cm.set(array);        /*         * |A*0.55 + 80|         * |R*0.55 + 80|         * |G*0.55 + 80|         * |B*0.2|         *///      cm.setSaturation(0);        mColorMatrixFilter = new ColorMatrixColorFilter(cm);        //利用滚动条来实现接触点放开后的动画效果        mScroller = new Scroller(context);}@Overridepublic void computeScroll() {// TODO Auto-generated method stubif (mScroller.computeScrollOffset()) {touchPt.x = mScroller.getCurrX();touchPt.y = mScroller.getCurrY();postInvalidate();}else{//touchPt.x = -1;//touchPt.y = -1;}super.computeScroll();}public void SetScreen(int screenWidth,int screenHeight){this.screenWidth = screenWidth;this.screenHeight = screenHeight;}public Bitmap getForeImage() {return foreImage;}public void setForeImage(Bitmap foreImage) {this.foreImage = foreImage;}public Bitmap getBgImage() {return bgImage;}public void setBgImage(Bitmap bgImage) {this.bgImage = bgImage;}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubdrawPageEffect(canvas);super.onDraw(canvas);}/** * 画前景图片 * @param canvas */private void drawForceImage(Canvas canvas) {// TODO Auto-generated method stubPaint mPaint = new Paint();if (foreImage!=null) {canvas.drawBitmap(foreImage, 0, 0, mPaint);}}/** * 画背景图片 * @param canvas */private void drawBgImage(Canvas canvas,Path path) {// TODO Auto-generated method stubPaint mPaint = new Paint();if (bgImage!=null) {canvas.save();//只在与路径相交处画图canvas.clipPath(path,Op.INTERSECT);canvas.drawBitmap(bgImage, 0, 0, mPaint);canvas.restore();}}/** * 画翻页效果 * @param canvas */private void drawPageEffect(Canvas canvas) {// TODO Auto-generated method stubdrawForceImage(canvas);Paint mPaint = new Paint();if (touchPt.x!=-1 && touchPt.y!=-1) {//翻页左侧书边canvas.drawLine(touchPt.x, 0, touchPt.x,screenHeight, mPaint);//左侧书边画阴影shadowDrawableRL.setBounds((int)touchPt.x - 20, 0 ,(int)touchPt.x, screenHeight);shadowDrawableRL.draw(canvas);//翻页对折处float halfCut = touchPt.x + (screenWidth - touchPt.x)/2;canvas.drawLine(halfCut, 0, halfCut, screenHeight, mPaint);//对折处左侧画翻页页图片背面Rect backArea = new Rect((int)touchPt.x,0,(int)halfCut,screenHeight);Paint backPaint = new Paint();backPaint.setColor(0xffdacab0);canvas.drawRect(backArea, backPaint);//将翻页图片正面进行处理水平翻转并平移到touchPt.x点Paint fbPaint = new Paint();fbPaint.setColorFilter(mColorMatrixFilter);Matrix matrix = new Matrix();matrix.preScale(-1,1);matrix.postTranslate(foreImage.getWidth() + touchPt.x,0);canvas.save();canvas.clipRect(backArea);canvas.drawBitmap(foreImage, matrix, fbPaint);canvas.restore();//对折处画左侧阴影shadowDrawableRL.setBounds((int)halfCut - 50, 0 ,(int)halfCut, screenHeight);shadowDrawableRL.draw(canvas);Path bgPath = new Path();//可以显示背景图的区域bgPath.addRect(new RectF(halfCut,0,screenWidth,screenHeight), Direction.CW);//对折出右侧画背景drawBgImage(canvas,bgPath);//对折处画右侧阴影shadowDrawableLR.setBounds((int)halfCut, 0 ,(int)halfCut + 50, screenHeight);shadowDrawableLR.draw(canvas);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubif (event.getAction() == MotionEvent.ACTION_DOWN) {touchPt.x = event.getX();touchPt.y =event.getY();}else if(event.getAction() == MotionEvent.ACTION_MOVE){lastTouchX = (int)touchPt.x;touchPt.x = event.getX();touchPt.y =event.getY();postInvalidate();}else if(event.getAction() == MotionEvent.ACTION_UP){int dx,dy;dy = 0;//向右滑动if (lastTouchX

效果图如下:


更多相关文章

  1. android从相册中获取图片并将其显示在当前界面
  2. 如何让Android支持GIF图片
  3. Android实现下载图片并保存到SD卡中
  4. android中实现从相册中一次性获取多张图片与拍照,并将选中的图片
  5. EditText插入表情图片
  6. android操作sqlite3的blob字段,显示数据中的图片
  7. android 获取SD卡的图片及其路径

随机推荐

  1. 简单实现Android文件上传
  2. Android实现延迟退出主界面功能
  3. GitHub上受欢迎的Android(安卓)UI 库2
  4. android LayoutInflater实例化的方法
  5. android监控应用(app)前后台切换(状态)
  6. Android实现简单的电子词典
  7. Android上关于view的事件问题
  8. (Linux平台)在Android中调用JNI
  9. PhoneGap0.9.5 for Android源码
  10. View编程(5): 自定义View_01_ApiDemo源码