97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | package com.novelbook.android.view.animation; | ||
|  | 
 | ||
|  | import android.graphics.Bitmap; | ||
|  | import android.graphics.Canvas; | ||
|  | import android.graphics.Rect; | ||
|  | import android.graphics.drawable.GradientDrawable; | ||
|  | import android.util.Log; | ||
|  | import android.widget.Scroller; | ||
|  | 
 | ||
|  | 
 | ||
|  | public class CoverAnimation extends AnimationProvider { | ||
|  | 
 | ||
|  |     private Rect mSrcRect, mDestRect; | ||
|  |     private GradientDrawable mBackShadowDrawableLR; | ||
|  | 
 | ||
|  |     public CoverAnimation(Bitmap mCurrentBitmap, Bitmap mNextBitmap, int width, int height) { | ||
|  |         super(mCurrentBitmap, mNextBitmap, width, height); | ||
|  |         mSrcRect = new Rect(0, 0, mScreenWidth, mScreenHeight); | ||
|  |         mDestRect = new Rect(0, 0, mScreenWidth, mScreenHeight); | ||
|  |         int[] mBackShadowColors = new int[] { 0x66000000,0x00000000}; | ||
|  |         mBackShadowDrawableLR = new GradientDrawable( | ||
|  |                 GradientDrawable.Orientation.LEFT_RIGHT, mBackShadowColors); | ||
|  |         mBackShadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT); | ||
|  |     } | ||
|  | 
 | ||
|  |     @Override | ||
|  |     public void drawMove(Canvas canvas) { | ||
|  |         if (getDirection().equals(AnimationProvider.Direction.next)){ | ||
|  | //            mSrcRect.left = (int) ( - (mScreenWidth - mTouch.x)); | ||
|  | //            mSrcRect.right =  mSrcRect.left + mScreenWidth; | ||
|  |             int dis = (int) (mScreenWidth - myStartX + mTouch.x); | ||
|  |             if (dis > mScreenWidth){ | ||
|  |                 dis = mScreenWidth; | ||
|  |             } | ||
|  |             //计算bitmap截取的区域 | ||
|  |             mSrcRect.left = mScreenWidth - dis; | ||
|  |             //计算bitmap在canvas显示的区域 | ||
|  |             mDestRect.right = dis; | ||
|  |             canvas.drawBitmap(mNextPageBitmap,0,0,null); | ||
|  |             canvas.drawBitmap(mCurPageBitmap,mSrcRect,mDestRect,null); | ||
|  |             addShadow(dis,canvas); | ||
|  |         }else{ | ||
|  |             mSrcRect.left = (int) (mScreenWidth - mTouch.x); | ||
|  |             mDestRect.right = (int) mTouch.x; | ||
|  |             canvas.drawBitmap(mCurPageBitmap,0,0,null); | ||
|  |             canvas.drawBitmap(mNextPageBitmap,mSrcRect,mDestRect,null); | ||
|  |             addShadow((int) mTouch.x,canvas); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     @Override | ||
|  |     public void drawStatic(Canvas canvas) { | ||
|  |         if (getCancel()){ | ||
|  |             canvas.drawBitmap(mCurPageBitmap, 0, 0, null); | ||
|  |         }else { | ||
|  |             canvas.drawBitmap(mNextPageBitmap, 0, 0, null); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //添加阴影 | ||
|  |     public void addShadow(int left,Canvas canvas) { | ||
|  |         mBackShadowDrawableLR.setBounds(left, 0, left + 30 , mScreenHeight); | ||
|  |         mBackShadowDrawableLR.draw(canvas); | ||
|  |     } | ||
|  | 
 | ||
|  |     @Override | ||
|  |     public void startAnimation(Scroller scroller) { | ||
|  | 
 | ||
|  |         int dx = 0; | ||
|  |         if (getDirection().equals(Direction.next)){ | ||
|  |             if (getCancel()){ | ||
|  |                 int dis = (int) ((mScreenWidth - myStartX) + mTouch.x); | ||
|  |                 if (dis > mScreenWidth){ | ||
|  |                     dis = mScreenWidth; | ||
|  |                 } | ||
|  |                 dx = mScreenWidth - dis; | ||
|  |             }else{ | ||
|  | //                dx = (int) - (mTouch.x + myStartX); | ||
|  |                 dx = (int) - (mTouch.x + (mScreenWidth - myStartX)); | ||
|  |             } | ||
|  |         }else{ | ||
|  |             if (getCancel()){ | ||
|  |                 dx = (int) - mTouch.x; | ||
|  |             }else{ | ||
|  |                 dx = (int) (mScreenWidth - mTouch.x); | ||
|  |             } | ||
|  |         } | ||
|  |         //滑动速度保持一致 | ||
|  |         int duration =  (duation * Math.abs(dx)) / mScreenWidth; | ||
|  |         Log.e("duration",duration + ""); | ||
|  |         scroller.startScroll((int) mTouch.x, 0, dx, 0, duration); | ||
|  | 
 | ||
|  |         Log.d("pageAnimation", "startAnimation: annimaiton is end"); | ||
|  |     } | ||
|  | 
 | ||
|  | } |