图片的简单特效翻页

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

[java]  view plain copy
  1. public class PageWidget extends View {  
  2.     private Bitmap foreImage;  
  3.     private Bitmap bgImage;  
  4.     private PointF touchPt;  
  5.     private int screenWidth;  
  6.     private int screenHeight;  
  7.     private GradientDrawable shadowDrawableRL;  
  8.     private GradientDrawable shadowDrawableLR;  
  9.     private ColorMatrixColorFilter mColorMatrixFilter;  
  10.     private Scroller mScroller;  
  11.     private int lastTouchX;  
  12.       
  13.     public PageWidget(Context context) {  
  14.         super(context);  
  15.         // TODO Auto-generated constructor stub  
  16.         touchPt = new PointF(-1,-1);  
  17.       
  18.         //ARGB A(0-透明,255-不透明)  
  19.         int[] color = { 0xb0333333 ,0x00333333};  
  20.         shadowDrawableRL = new GradientDrawable(GradientDrawable.Orientation.RIGHT_LEFT, color);  
  21.         shadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT);  
  22.   
  23.   
  24.         shadowDrawableLR = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, color);  
  25.         shadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT);  
  26.           
  27.          float array[] = { 0.55f,    0,    0,     080.0f,   
  28.                    0    ,0.55f,    0,     080.0f,   
  29.                    0    ,    0,0.55f,     080.0f,   
  30.                    0    ,    0,    0,  0.2f, 0};  
  31.         ColorMatrix cm = new ColorMatrix();  
  32.         cm.set(array);  
  33.         /* 
  34.          * |A*0.55 + 80| 
  35.          * |R*0.55 + 80| 
  36.          * |G*0.55 + 80| 
  37.          * |B*0.2| 
  38.          */  
  39. //      cm.setSaturation(0);  
  40.         mColorMatrixFilter = new ColorMatrixColorFilter(cm);  
  41.   
  42.         //利用滚动条来实现接触点放开后的动画效果  
  43.         mScroller = new Scroller(context);  
  44.     }  
  45.   
  46.     @Override  
  47.     public void computeScroll() {  
  48.         // TODO Auto-generated method stub  
  49.         if (mScroller.computeScrollOffset()) {  
  50.             touchPt.x = mScroller.getCurrX();  
  51.             touchPt.y = mScroller.getCurrY();  
  52.               
  53.             postInvalidate();  
  54.         }  
  55.         else{  
  56. //          touchPt.x = -1;  
  57. //          touchPt.y = -1;           
  58.         }  
  59.   
  60.         super.computeScroll();  
  61.     }  
  62.   
  63.     public void SetScreen(int screenWidth,int screenHeight){  
  64.         this.screenWidth = screenWidth;  
  65.         this.screenHeight = screenHeight;  
  66.     }  
  67.       
  68.     public Bitmap getForeImage() {  
  69.         return foreImage;  
  70.     }  
  71.   
  72.   
  73.     public void setForeImage(Bitmap foreImage) {  
  74.         this.foreImage = foreImage;  
  75.     }  
  76.   
  77.   
  78.     public Bitmap getBgImage() {  
  79.         return bgImage;  
  80.     }  
  81.   
  82.   
  83.     public void setBgImage(Bitmap bgImage) {  
  84.         this.bgImage = bgImage;  
  85.     }  
  86.       
  87.     @Override  
  88.     protected void onDraw(Canvas canvas) {  
  89.         // TODO Auto-generated method stub  
  90.         drawPageEffect(canvas);  
  91.         super.onDraw(canvas);  
  92.     }  
  93.   
  94.   
  95.     /** 
  96.      * 画前景图片 
  97.      * @param canvas 
  98.      */  
  99.     private void drawForceImage(Canvas canvas) {  
  100.         // TODO Auto-generated method stub  
  101.         Paint mPaint = new Paint();  
  102.           
  103.         if (foreImage!=null) {  
  104.             canvas.drawBitmap(foreImage, 00, mPaint);  
  105.         }         
  106.     }  
  107.   
  108.   
  109.     /** 
  110.      * 画背景图片 
  111.      * @param canvas 
  112.      */  
  113.     private void drawBgImage(Canvas canvas,Path path) {  
  114.         // TODO Auto-generated method stub  
  115.         Paint mPaint = new Paint();  
  116.           
  117.         if (bgImage!=null) {  
  118.             canvas.save();  
  119.               
  120.             //只在与路径相交处画图  
  121.             canvas.clipPath(path,Op.INTERSECT);  
  122.             canvas.drawBitmap(bgImage, 00, mPaint);  
  123.             canvas.restore();  
  124.         }  
  125.     }  
  126.   
  127.   
  128.     /** 
  129.      * 画翻页效果 
  130.      * @param canvas 
  131.      */  
  132.     private void drawPageEffect(Canvas canvas) {  
  133.         // TODO Auto-generated method stub  
  134.         drawForceImage(canvas);  
  135.         Paint mPaint = new Paint();  
  136.         if (touchPt.x!=-1 && touchPt.y!=-1) {  
  137.             //翻页左侧书边  
  138.             canvas.drawLine(touchPt.x, 0, touchPt.x,screenHeight, mPaint);  
  139.               
  140.             //左侧书边画阴影  
  141.             shadowDrawableRL.setBounds((int)touchPt.x - 200 ,(int)touchPt.x, screenHeight);  
  142.             shadowDrawableRL.draw(canvas);  
  143.               
  144.             //翻页对折处  
  145.             float halfCut = touchPt.x + (screenWidth - touchPt.x)/2;  
  146.             canvas.drawLine(halfCut, 0, halfCut, screenHeight, mPaint);  
  147.               
  148.             //对折处左侧画翻页页图片背面  
  149.             Rect backArea = new Rect((int)touchPt.x,0,(int)halfCut,screenHeight);  
  150.             Paint backPaint = new Paint();  
  151.             backPaint.setColor(0xffdacab0);  
  152.             canvas.drawRect(backArea, backPaint);  
  153.               
  154.             //将翻页图片正面进行处理水平翻转并平移到touchPt.x点  
  155.             Paint fbPaint = new Paint();  
  156.             fbPaint.setColorFilter(mColorMatrixFilter);  
  157.             Matrix matrix = new Matrix();  
  158.               
  159.             matrix.preScale(-1,1);  
  160.             matrix.postTranslate(foreImage.getWidth() + touchPt.x,0);  
  161.               
  162.             canvas.save();  
  163.             canvas.clipRect(backArea);  
  164.             canvas.drawBitmap(foreImage, matrix, fbPaint);  
  165.             canvas.restore();  
  166.               
  167.             //对折处画左侧阴影  
  168.             shadowDrawableRL.setBounds((int)halfCut - 500 ,(int)halfCut, screenHeight);  
  169.             shadowDrawableRL.draw(canvas);  
  170.               
  171.             Path bgPath = new Path();  
  172.               
  173.             //可以显示背景图的区域  
  174.             bgPath.addRect(new RectF(halfCut,0,screenWidth,screenHeight), Direction.CW);  
  175.               
  176.             //对折出右侧画背景  
  177.             drawBgImage(canvas,bgPath);  
  178.               
  179.             //对折处画右侧阴影  
  180.             shadowDrawableLR.setBounds((int)halfCut, 0 ,(int)halfCut + 50, screenHeight);  
  181.             shadowDrawableLR.draw(canvas);  
  182.         }  
  183.     }  
  184.       
  185.     @Override  
  186.     public boolean onTouchEvent(MotionEvent event) {  
  187.         // TODO Auto-generated method stub  
  188.         if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  189.             touchPt.x = event.getX();  
  190.             touchPt.y = event.getY();  
  191.         }  
  192.         else if(event.getAction() == MotionEvent.ACTION_MOVE){  
  193.             lastTouchX = (int)touchPt.x;  
  194.             touchPt.x = event.getX();  
  195.             touchPt.y = event.getY();  
  196.               
  197.             postInvalidate();  
  198.         }  
  199.         else if(event.getAction() == MotionEvent.ACTION_UP){  
  200.             int dx,dy;  
  201.               
  202.             dy = 0;  
  203.               
  204.             //向右滑动  
  205.             if (lastTouchX<touchPt.x) {  
  206.                 dx = foreImage.getWidth() - (int)touchPt.x + 30;  
  207.             }  
  208.             else{   
  209.             //向左滑动  
  210.                 dx = -(int)touchPt.x - foreImage.getWidth();  
  211.             }  
  212.               
  213.             mScroller.startScroll((int)touchPt.x,(int)touchPt.y,dx,dy,1000);  
  214.             postInvalidate();  
  215.         }  
  216.           
  217.         //必须为true,否则无法获取ACTION_MOVE及ACTION_UP事件  
  218.         return true;  
  219.     }  
  220. }  
  221.   
  222. public class PageActivity extends Activity {  
  223.     protected void onCreate(android.os.Bundle savedInstanceState) {  
  224.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  225.           
  226.         PageWidget pageWidget = new PageWidget(this);  
  227.   
  228.         Display display = getWindowManager().getDefaultDisplay();  
  229.         int width  = display.getWidth();  
  230.         int height = display.getHeight();  
  231.   
  232.         pageWidget.SetScreen(width, height);  
  233.   
  234.         Bitmap bm1 = BitmapFactory.decodeResource(getResources(), R.drawable.pre7);  
  235.         Bitmap bm2 = BitmapFactory.decodeResource(getResources(), R.drawable.after7);  
  236.   
  237.         Bitmap foreImage = Bitmap.createScaledBitmap(bm1, width, height,false);  
  238.         Bitmap bgImage = Bitmap.createScaledBitmap(bm2, width, height,false);  
  239.   
  240.         pageWidget.setBgImage(bgImage);  
  241.         pageWidget.setForeImage(foreImage);  
  242.   
  243.         setContentView(pageWidget);  
  244.           
  245.         super.onCreate(savedInstanceState);  
  246.     };  
  247. }  

效果图如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值