Android书籍翻页效果
发布时间:2020-05-24 19:22:35 所属栏目:Java 来源:互联网
导读:Android书籍翻页效果
|
下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。 脚本之家小编现在分享给大家,也给大家做个参考。 packagecom.andorid.shu.love;
importjava.io.File;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.util.Log;
importandroid.view.Display;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.View.OnTouchListener;
importandroid.widget.Toast;
importcom.sqlite.DbHelper;
publicclassBookActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
publicfinalstaticintOPENMARK=0;
publicfinalstaticintSAVEMARK=1;
publicfinalstaticintTEXTSET=2;
privatePageWidgetmPageWidget;
privateBitmapmCurPageBitmap,mNextPageBitmap;
privateCanvasmCurPageCanvas,mNextPageCanvas;
privateBookPageFactorypagefactory;
privatestaticBooleanisExit=false;//用于判断是否推出
privatestaticBooleanhasTask=false;
privateintwhichSize=6;//当前的字体大小
privateinttxtProgress=0;//当前阅读的进度
privateStringtxtPath="/sdcard/lovereader/百年孤独.txt";
privateStringbookPath="/sdcard/lovereader/";
finalString[]font=newString[]{"20","24","26","30","32","36","40","46","50","56","60","66","70"};
intcurPostion;
DbHelperdb;
ContextmContext;
CursormCursor;
BookInfobook=null;
SetupInfosetup=null;
//addfor2015-03-04
privateint[]mPics=newint[]{R.drawable.c0,R.drawable.c1,R.drawable.c2,R.drawable.c3};
privateintmCurrent=0;
privateintmNext=1;
//addfor2015-03-06
privateList<String>mFileList=newArrayList<String>();
privatestaticfinalStringTAG="BookActivity";
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
/*requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);*/
Displaydisplay=getWindowManager().getDefaultDisplay();
intw=display.getWidth();
inth=display.getHeight();
System.out.println(w+"t"+h);
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inSampleSize=2;//图片大小,设置越大,图片越不清晰,占用空间越小
/*StringSDPath=getSDPath();
Log.d(TAG,"sdPath:"+SDPath);*/
///getFile(newFile("/storage/extSdCard/pic/pic_1"));
//getFileDirPath
StringdirPath=getIntent().getStringExtra("....");
dirPath="/storage/extSdCard/pic/pic_1";
FilemFile=newFile(dirPath);
if(mFile.exists()){
if(mFile.isDirectory()){
if(mFile.listFiles().length==0){
Toast.makeText(this,"文件不存在!",Toast.LENGTH_SHORT).show();
return;
}
}
}
try{
//获取文件夹下的所有图片路径填充mFileList集合
getFile(mFile);
}catch(IOExceptione2){
//TODOAuto-generatedcatchblock
e2.printStackTrace();
}
pagefactory=newBookPageFactory(w,h,mFileList);
mCurPageBitmap=BitmapFactory.decodeFile(mFileList.get(mCurrent),options);
mNextPageBitmap=BitmapFactory.decodeFile(mFileList.get(mNext),options);
mCurPageBitmap=pagefactory.resizePic(mCurPageBitmap,w,h);
mNextPageBitmap=pagefactory.resizePic(mNextPageBitmap,h);
mContext=this;
mPageWidget=newPageWidget(this,h);
setContentView(mPageWidget);
mPageWidget.setBitmaps(mCurPageBitmap,mNextPageBitmap);
mPageWidget.setOnTouchListener(newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEvente){
booleanret=false;
if(v==mPageWidget){
if(e.getAction()==MotionEvent.ACTION_DOWN){
mPageWidget.abortAnimation();
mPageWidget.calcCornerXY(e.getX(),e.getY());
//inttemp=mCurrent!=0?mCurrent-1:0;
//获取当前页
mCurPageBitmap=pagefactory.getPage(mCurrent);
Log.d(TAG,"---当前页:mCurrentPic:"+mCurrent);
Log.d(TAG,"---当前页:路径:"+mFileList.get(mCurrent));
if(mPageWidget.DragToRight()){
if(pagefactory.isfirstPage()){
Toast.makeText(mContext,"已经是第一页",Toast.LENGTH_SHORT).show();
returnfalse;
}
//获取当前页坐标
mCurrent=mCurrent>0?--mCurrent:0;
Log.d(TAG,"mCurrentPic:"+mCurrent);
mNextPageBitmap=pagefactory.prePage(mCurrent);
Log.d(TAG,"---下一页:路径:"+mFileList.get(mCurrent));
}else{
if(pagefactory.islastPage()){
Toast.makeText(mContext,"已经是最后一页",Toast.LENGTH_SHORT).show();
returnfalse;
}
mCurrent=mCurrent<mFileList.size()-1?++mCurrent:mFileList.size()-1;
Log.d(TAG,"mCurrentPic:"+mCurrent);
Log.d(TAG,"---下一页:路径:"+mFileList.get(mCurrent));
mNextPageBitmap=pagefactory.nextPage(mCurrent);
}
mPageWidget.setBitmaps(mCurPageBitmap,mNextPageBitmap);
}
ret=mPageWidget.doTouchEvent(e);
returnret;
}
returnfalse;
}
});
}
publicStringgetSDPath(){
FilesdDir=null;
booleansdCardExist=Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);//判断sd卡是否存在
if(sdCardExist){
sdDir=Environment.getExternalStorageDirectory();//获取跟目录
}
returnsdDir.toString();
}
/**
*获取文件对象
*@paramfile
*@return
*@throwsIOException
*/
publicList<String>getFile(Filefile)throwsIOException{
// Log.d(TAG,"getFile.fun..start..");
File[]fileArray=file.listFiles();
// Log.d(TAG,"getFile.fun..listFiles..");
for(Filef:fileArray){
// Log.d(TAG,"getFile.fun..ffff..");
if(f.isFile()){
// Log.d(TAG,"getFile.fun..adddd..11111..");
mFileList.add(f.getCanonicalPath());
// Log.d(TAG,"getFile.fun..adddd..");
}else{
getFile(f);
// Log.d(TAG,"getFile.run..again..");
}
}
// Log.d(TAG,"getFile.fun..finsh..");
returnmFileList;
}
}
packagecom.andorid.shu.love;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.io.RandomAccessFile;
importjava.io.UnsupportedEncodingException;
importjava.nio.MappedByteBuffer;
importjava.nio.channels.FileChannel;
importjava.text.DecimalFormat;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.List;
importjava.util.Vector;
importandroid.content.res.Resources;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Matrix;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Align;
publicclassBookPageFactory{
privateFilebook_file=null;
privateMappedByteBufferm_mbBuf=null;
privateintm_mbBufLen=0;
privateintm_mbBufBegin=50;//50
privateintm_mbBufEnd=0;
privateStringm_strCharsetName="GBK";
privateBitmapm_book_bg=null;
privateintmWidth;
privateintmHeight;
privateVector<String>m_lines=newVector<String>();
privateintm_fontSize=40;
privateintr_fontSize=30;
privateintm_textColor=Color.BLACK;
privateintm_backColor=0xffff9e85;//背景颜色
privateintmarginWidth=15;//左右与边缘的距离
privateintmarginHeight=20;//上下与边缘的距离
privateintyoumiHeight=0;//广告条的狂度
privateintmLineCount;//每页可以显示的行数
privatefloatmVisibleHeight;//绘制内容的宽
privatefloatmVisibleWidth;//绘制内容的宽
privatebooleanm_isfirstPage,m_islastPage;
privateintb_FontSize=16;//底部文字大小
privateinte_fontSize=5;
privateintspaceSize=20;//行间距大小
privateintcurProgress=0;//当前的进度
privateStringfileName="";
//privateintm_nLineSpaceing=5;
privatePaintmPaint;
privatePaintbPaint;//底部文字绘制
privatePaintspactPaint;//行间距绘制
privatePainttitlePaint;//标题绘制
//addfor20150306
privateList<String>mFileList;//当前文件列表
publicBookPageFactory(intw,inth,List<String>fileList){
//TODOAuto-generatedconstructorstub
mWidth=w;
mHeight=h;
//addfor20150304
this.mFileList=fileList;
}
//addfor20150304
publicBitmapprePage(intcurrentNum){
this.m_islastPage=false;
if(currentNum==0){
//currentNum=0;
this.m_isfirstPage=true;
}else{
//currentNum--;
this.m_isfirstPage=false;
}
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inSampleSize=2;//图片大小,设置越大,图片越不清晰,占用空间越小
Bitmapbitmap=BitmapFactory.decodeFile(mFileList.get(currentNum),options);
//Bitmapbitmap=BitmapFactory.decodeResource(this.mResources,mPics[currentNum]);
//图片放大至屏幕大小
bitmap=resizePic(bitmap,mWidth,mHeight);
returnbitmap;
}
//addfor20150304
publicBitmapnextPage(intcurrentNum){
this.m_isfirstPage=false;
if(currentNum>=mFileList.size()-1){
//currentNum=mPics.length-1;
this.m_islastPage=true;
}else{
//currentNum++;
this.m_islastPage=false;
}
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inSampleSize=2;//图片大小,设置越大,图片越不清晰,占用空间越小
Bitmapbitmap=BitmapFactory.decodeFile(mFileList.get(currentNum),mHeight);
returnbitmap;
}
//addfor20150306
publicBitmapgetPage(intcurrnet){
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inSampleSize=2;//图片大小,设置越大,图片越不清晰,占用空间越小
Bitmapbitmap=BitmapFactory.decodeFile(mFileList.get(currnet),mPics[currnet]);
//图片放大至屏幕大小
bitmap=resizePic(bitmap,mHeight);
returnbitmap;
}
//addfor20150306
publicstaticBitmapresizePic(Bitmapbitmap,intscreenWidth,intscreenHight){
intw=bitmap.getWidth();
inth=bitmap.getHeight();
Matrixmatrix=newMatrix();
floatscale=(float)screenWidth/w;
floatscale2=(float)screenHight/h;
//scale=scale<scale2?scale:scale2;
matrix.postScale(scale,scale2);
Bitmapbmp=Bitmap.createBitmap(bitmap,0,matrix,true);
if(bitmap!=null&&!bitmap.equals(bmp)&&!bitmap.isRecycled()){
bitmap.recycle();
bitmap=null;
}
returnbmp;
}
privatestaticdoubleround1(doublev,intscale){
if(scale<0)
returnv;
Stringtemp="#####0.";
for(inti=0;i<scale;i++){
temp+="0";
}
returnDouble.valueOf(newjava.text.DecimalFormat(temp).format(v));
}
publicvoidsetBgBitmap(BitmapBG){
if(BG.getWidth()!=mWidth||BG.getHeight()!=mHeight)
m_book_bg=Bitmap.createScaledBitmap(BG,mHeight,true);
else
m_book_bg=BG;
}
publicbooleanisfirstPage(){
returnm_isfirstPage;
}
publicvoidsetIslastPage(booleanislast){
m_islastPage=islast;
}
publicbooleanislastPage(){
returnm_islastPage;
}
publicintgetCurPostion(){
returnm_mbBufEnd;
}
publicintgetCurPostionBeg(){
returnm_mbBufBegin;
}
publicvoidsetBeginPos(intpos){
m_mbBufEnd=pos;
m_mbBufBegin=pos;
}
publicintgetBufLen(){
returnm_mbBufLen;
}
publicintgetCurProgress(){
returncurProgress;
}
publicStringgetOneLine(){
returnm_lines.toString().substring(0,10);
}
publicvoidchangBackGround(intcolor){
mPaint.setColor(color);
}
publicvoidsetFontSize(intsize){
m_fontSize=size;
mPaint.setTextSize(size);
inttotalSize=m_fontSize+spaceSize;
mLineCount=(int)(mVisibleHeight/totalSize);//可显示的行数
}
publicvoidsetFileName(StringfileName){
fileName=fileName.substring(0,fileName.indexOf("."));
this.fileName=fileName;
}
}
packagecom.andorid.shu.love;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.Canvas;
importandroid.graphics.ColorMatrix;
importandroid.graphics.ColorMatrixColorFilter;
importandroid.graphics.Matrix;
importandroid.graphics.Paint;
importandroid.graphics.Path;
importandroid.graphics.PointF;
importandroid.graphics.Region;
importandroid.graphics.drawable.GradientDrawable;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.widget.Scroller;
publicclassPageWidgetextendsView{
privatestaticfinalStringTAG="hmg";
privateintmWidth=480;
privateintmHeight=800;
privateintmCornerX=0;//拖拽点对应的页脚
privateintmCornerY=0;
privatePathmPath0;
privatePathmPath1;
BitmapmCurPageBitmap=null;//当前页
BitmapmNextPageBitmap=null;
PointFmTouch=newPointF();//拖拽点
PointFmBezierStart1=newPointF();//贝塞尔曲线起始点
PointFmBezierControl1=newPointF();//贝塞尔曲线控制点
PointFmBeziervertex1=newPointF();//贝塞尔曲线顶点
PointFmBezierEnd1=newPointF();//贝塞尔曲线结束点
PointFmBezierStart2=newPointF();//另一条贝塞尔曲线
PointFmBezierControl2=newPointF();
PointFmBeziervertex2=newPointF();
PointFmBezierEnd2=newPointF();
floatmMiddleX;
floatmMiddleY;
floatmDegrees;
floatmTouchToCornerDis;
ColorMatrixColorFiltermColorMatrixFilter;
MatrixmMatrix;
float[]mMatrixArray={0,1.0f};
booleanmIsRTandLB;//是否属于右上左下
floatmMaxLength=(float)Math.hypot(mWidth,mHeight);
int[]mBackShadowColors;
int[]mFrontShadowColors;
GradientDrawablemBackShadowDrawableLR;
GradientDrawablemBackShadowDrawableRL;
GradientDrawablemFolderShadowDrawableLR;
GradientDrawablemFolderShadowDrawableRL;
GradientDrawablemFrontShadowDrawableHBT;
GradientDrawablemFrontShadowDrawableHTB;
GradientDrawablemFrontShadowDrawableVLR;
GradientDrawablemFrontShadowDrawableVRL;
PaintmPaint;
ScrollermScroller;
publicPageWidget(Contextcontext,intw,inth){
super(context);
//TODOAuto-generatedconstructorstub
mWidth=w;
mHeight=h;
mPath0=newPath();
mPath1=newPath();
createDrawable();
mPaint=newPaint();
mPaint.setStyle(Paint.Style.FILL);
ColorMatrixcm=newColorMatrix();
floatarray[]={0.55f,80.0f,0.55f,0.55f,0.2f,0};
cm.set(array);
mColorMatrixFilter=newColorMatrixColorFilter(cm);
mMatrix=newMatrix();
mScroller=newScroller(getContext());
mTouch.x=0.01f;//不让x,y为0,否则在点计算时会有问题
mTouch.y=0.01f;
}
/**
*Author:hmg25Version:1.0Description:计算拖拽点对应的拖拽脚
*/
publicvoidcalcCornerXY(floatx,floaty){
if(x<=mWidth/2)
mCornerX=0;
else
mCornerX=mWidth;
if(y<=mHeight/2)
mCornerY=0;
else
mCornerY=mHeight;
if((mCornerX==0&&mCornerY==mHeight)
||(mCornerX==mWidth&&mCornerY==0))
mIsRTandLB=true;
else
mIsRTandLB=false;
}
publicbooleandoTouchEvent(MotionEventevent){
//TODOAuto-generatedmethodstub
if(event.getAction()==MotionEvent.ACTION_MOVE){
mTouch.x=event.getX();
mTouch.y=event.getY();
this.postInvalidate();
}
if(event.getAction()==MotionEvent.ACTION_DOWN){
mTouch.x=event.getX();
mTouch.y=event.getY();
//calcCornerXY(mTouch.x,mTouch.y);
//this.postInvalidate();
}
if(event.getAction()==MotionEvent.ACTION_UP){
if(canDragOver()){
startAnimation(1200);
}else{
mTouch.x=mCornerX-0.09f;
mTouch.y=mCornerY-0.09f;
}
this.postInvalidate();
}
//returnsuper.onTouchEvent(event);
returntrue;
}
/**
*Author:hmg25Version:1.0Description:求解直线P1P2和直线P3P4的交点坐标
*/
publicPointFgetCross(PointFP1,PointFP2,PointFP3,PointFP4){
PointFCrossP=newPointF();
//二元函数通式:y=ax+b
floata1=(P2.y-P1.y)/(P2.x-P1.x);
floatb1=((P1.x*P2.y)-(P2.x*P1.y))/(P1.x-P2.x);
floata2=(P4.y-P3.y)/(P4.x-P3.x);
floatb2=((P3.x*P4.y)-(P4.x*P3.y))/(P3.x-P4.x);
CrossP.x=(b2-b1)/(a1-a2);
CrossP.y=a1*CrossP.x+b1;
returnCrossP;
}
privatevoidcalcPoints(){
mMiddleX=(mTouch.x+mCornerX)/2;
mMiddleY=(mTouch.y+mCornerY)/2;
mBezierControl1.x=mMiddleX-(mCornerY-mMiddleY)
*(mCornerY-mMiddleY)/(mCornerX-mMiddleX);
mBezierControl1.y=mCornerY;
mBezierControl2.x=mCornerX;
mBezierControl2.y=mMiddleY-(mCornerX-mMiddleX)
*(mCornerX-mMiddleX)/(mCornerY-mMiddleY);
//Log.i("hmg","mTouchX"+mTouch.x+"mTouchY"+mTouch.y);
//Log.i("hmg","mBezierControl1.x"+mBezierControl1.x
//+"mBezierControl1.y"+mBezierControl1.y);
//Log.i("hmg","mBezierControl2.x"+mBezierControl2.x
//+"mBezierControl2.y"+mBezierControl2.y);
mBezierStart1.x=mBezierControl1.x-(mCornerX-mBezierControl1.x)
/2;
mBezierStart1.y=mCornerY;
//当mBezierStart1.x<0或者mBezierStart1.x>480时
//如果继续翻页,会出现BUG故在此限制
if(mTouch.x>0&&mTouch.x<mWidth){
if(mBezierStart1.x<0||mBezierStart1.x>mWidth){
if(mBezierStart1.x<0)
mBezierStart1.x=mWidth-mBezierStart1.x;
floatf1=Math.abs(mCornerX-mTouch.x);
floatf2=mWidth*f1/mBezierStart1.x;
mTouch.x=Math.abs(mCornerX-f2);
floatf3=Math.abs(mCornerX-mTouch.x)
*Math.abs(mCornerY-mTouch.y)/f1;
mTouch.y=Math.abs(mCornerY-f3);
mMiddleX=(mTouch.x+mCornerX)/2;
mMiddleY=(mTouch.y+mCornerY)/2;
mBezierControl1.x=mMiddleX-(mCornerY-mMiddleY)
*(mCornerY-mMiddleY)/(mCornerX-mMiddleX);
mBezierControl1.y=mCornerY;
mBezierControl2.x=mCornerX;
mBezierControl2.y=mMiddleY-(mCornerX-mMiddleX)
*(mCornerX-mMiddleX)/(mCornerY-mMiddleY);
//Log.i("hmg","mTouchX-->"+mTouch.x+"mTouchY-->"
//+mTouch.y);
//Log.i("hmg","mBezierControl1.x--"+mBezierControl1.x
//+"mBezierControl1.y--"+mBezierControl1.y);
//Log.i("hmg","mBezierControl2.x--"+mBezierControl2.x
//+"mBezierControl2.y--"+mBezierControl2.y);
mBezierStart1.x=mBezierControl1.x
-(mCornerX-mBezierControl1.x)/2;
}
}
mBezierStart2.x=mCornerX;
mBezierStart2.y=mBezierControl2.y-(mCornerY-mBezierControl2.y)
/2;
mTouchToCornerDis=(float)Math.hypot((mTouch.x-mCornerX),(mTouch.y-mCornerY));
mBezierEnd1=getCross(mTouch,mBezierControl1,mBezierStart1,mBezierStart2);
mBezierEnd2=getCross(mTouch,mBezierControl2,mBezierStart2);
//Log.i("hmg","mBezierEnd1.x"+mBezierEnd1.x+"mBezierEnd1.y"
//+mBezierEnd1.y);
//Log.i("hmg","mBezierEnd2.x"+mBezierEnd2.x+"mBezierEnd2.y"
//+mBezierEnd2.y);
/*
*mBeziervertex1.x推导
*((mBezierStart1.x+mBezierEnd1.x)/2+mBezierControl1.x)/2化简等价于
*(mBezierStart1.x+2*mBezierControl1.x+mBezierEnd1.x)/4
*/
mBeziervertex1.x=(mBezierStart1.x+2*mBezierControl1.x+mBezierEnd1.x)/4;
mBeziervertex1.y=(2*mBezierControl1.y+mBezierStart1.y+mBezierEnd1.y)/4;
mBeziervertex2.x=(mBezierStart2.x+2*mBezierControl2.x+mBezierEnd2.x)/4;
mBeziervertex2.y=(2*mBezierControl2.y+mBezierStart2.y+mBezierEnd2.y)/4;
}
privatevoiddrawCurrentPageArea(Canvascanvas,Bitmapbitmap,Pathpath){
mPath0.reset();
mPath0.moveTo(mBezierStart1.x,mBezierStart1.y);
mPath0.quadTo(mBezierControl1.x,mBezierControl1.y,mBezierEnd1.x,mBezierEnd1.y);
mPath0.lineTo(mTouch.x,mTouch.y);
mPath0.lineTo(mBezierEnd2.x,mBezierEnd2.y);
mPath0.quadTo(mBezierControl2.x,mBezierControl2.y,mBezierStart2.x,mBezierStart2.y);
mPath0.lineTo(mCornerX,mCornerY);
mPath0.close();
canvas.save();
canvas.clipPath(path,Region.Op.XOR);
canvas.drawBitmap(bitmap,null);
canvas.restore();
}
privatevoiddrawNextPageAreaAndShadow(Canvascanvas,Bitmapbitmap){
mPath1.reset();
mPath1.moveTo(mBezierStart1.x,mBezierStart1.y);
mPath1.lineTo(mBeziervertex1.x,mBeziervertex1.y);
mPath1.lineTo(mBeziervertex2.x,mBeziervertex2.y);
mPath1.lineTo(mBezierStart2.x,mBezierStart2.y);
mPath1.lineTo(mCornerX,mCornerY);
mPath1.close();
mDegrees=(float)Math.toDegrees(Math.atan2(mBezierControl1.x
-mCornerX,mBezierControl2.y-mCornerY));
intleftx;
intrightx;
GradientDrawablemBackShadowDrawable;
if(mIsRTandLB){
leftx=(int)(mBezierStart1.x);
rightx=(int)(mBezierStart1.x+mTouchToCornerDis/4);
mBackShadowDrawable=mBackShadowDrawableLR;
}else{
leftx=(int)(mBezierStart1.x-mTouchToCornerDis/4);
rightx=(int)mBezierStart1.x;
mBackShadowDrawable=mBackShadowDrawableRL;
}
canvas.save();
canvas.clipPath(mPath0);
canvas.clipPath(mPath1,Region.Op.INTERSECT);
canvas.drawBitmap(bitmap,null);
canvas.rotate(mDegrees,mBezierStart1.x,mBezierStart1.y);
mBackShadowDrawable.setBounds(leftx,(int)mBezierStart1.y,rightx,(int)(mMaxLength+mBezierStart1.y));
mBackShadowDrawable.draw(canvas);
canvas.restore();
}
publicvoidsetBitmaps(Bitmapbm1,Bitmapbm2){
mCurPageBitmap=bm1;
mNextPageBitmap=bm2;
}
publicvoidsetScreen(intw,inth){
mWidth=w;
mHeight=h;
}
@Override
protectedvoidonDraw(Canvascanvas){
canvas.drawColor(0xFFAAAAAA);
calcPoints();
drawCurrentPageArea(canvas,mCurPageBitmap,mPath0);
drawNextPageAreaAndShadow(canvas,mNextPageBitmap);
drawCurrentPageShadow(canvas);
drawCurrentBackArea(canvas,mCurPageBitmap);
}
/**
*Author:hmg25Version:1.0Description:创建阴影的GradientDrawable
*/
privatevoidcreateDrawable(){
int[]color={0x333333,0xb0333333};
mFolderShadowDrawableRL=newGradientDrawable(
GradientDrawable.Orientation.RIGHT_LEFT,color);
mFolderShadowDrawableRL
.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mFolderShadowDrawableLR=newGradientDrawable(
GradientDrawable.Orientation.LEFT_RIGHT,color);
mFolderShadowDrawableLR
.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mBackShadowColors=newint[]{0xff111111,0x111111};
mBackShadowDrawableRL=newGradientDrawable(
GradientDrawable.Orientation.RIGHT_LEFT,mBackShadowColors);
mBackShadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mBackShadowDrawableLR=newGradientDrawable(
GradientDrawable.Orientation.LEFT_RIGHT,mBackShadowColors);
mBackShadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mFrontShadowColors=newint[]{0x80111111,0x111111};
mFrontShadowDrawableVLR=newGradientDrawable(
GradientDrawable.Orientation.LEFT_RIGHT,mFrontShadowColors);
mFrontShadowDrawableVLR
.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mFrontShadowDrawableVRL=newGradientDrawable(
GradientDrawable.Orientation.RIGHT_LEFT,mFrontShadowColors);
mFrontShadowDrawableVRL
.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mFrontShadowDrawableHTB=newGradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM,mFrontShadowColors);
mFrontShadowDrawableHTB
.setGradientType(GradientDrawable.LINEAR_GRADIENT);
mFrontShadowDrawableHBT=newGradientDrawable(
GradientDrawable.Orientation.BOTTOM_TOP,mFrontShadowColors);
mFrontShadowDrawableHBT
.setGradientType(GradientDrawable.LINEAR_GRADIENT);
}
/**
*Author:hmg25Version:1.0Description:绘制翻起页的阴影
*/
publicvoiddrawCurrentPageShadow(Canvascanvas){
doubledegree;
if(mIsRTandLB){
degree=Math.PI
/4
-Math.atan2(mBezierControl1.y-mTouch.y,mTouch.x
-mBezierControl1.x);
}else{
degree=Math.PI
/4
-Math.atan2(mTouch.y-mBezierControl1.y,mTouch.x
-mBezierControl1.x);
}
//翻起页阴影顶点与touch点的距离
doubled1=(float)25*1.414*Math.cos(degree);
doubled2=(float)25*1.414*Math.sin(degree);
floatx=(float)(mTouch.x+d1);
floaty;
if(mIsRTandLB){
y=(float)(mTouch.y+d2);
}else{
y=(float)(mTouch.y-d2);
}
mPath1.reset();
mPath1.moveTo(x,y);
mPath1.lineTo(mTouch.x,mTouch.y);
mPath1.lineTo(mBezierControl1.x,mBezierControl1.y);
mPath1.lineTo(mBezierStart1.x,mBezierStart1.y);
mPath1.close();
floatrotateDegrees;
canvas.save();
canvas.clipPath(mPath0,Region.Op.XOR);
canvas.clipPath(mPath1,Region.Op.INTERSECT);
intleftx;
intrightx;
GradientDrawablemCurrentPageShadow;
if(mIsRTandLB){
leftx=(int)(mBezierControl1.x);
rightx=(int)mBezierControl1.x+25;
mCurrentPageShadow=mFrontShadowDrawableVLR;
}else{
leftx=(int)(mBezierControl1.x-25);
rightx=(int)mBezierControl1.x+1;
mCurrentPageShadow=mFrontShadowDrawableVRL;
}
rotateDegrees=(float)Math.toDegrees(Math.atan2(mTouch.x
-mBezierControl1.x,mBezierControl1.y-mTouch.y));
canvas.rotate(rotateDegrees,mBezierControl1.x,mBezierControl1.y);
mCurrentPageShadow.setBounds(leftx,(int)(mBezierControl1.y-mMaxLength),(int)(mBezierControl1.y));
mCurrentPageShadow.draw(canvas);
canvas.restore();
mPath1.reset();
mPath1.moveTo(x,mTouch.y);
mPath1.lineTo(mBezierControl2.x,mBezierControl2.y);
mPath1.lineTo(mBezierStart2.x,mBezierStart2.y);
mPath1.close();
canvas.save();
canvas.clipPath(mPath0,Region.Op.INTERSECT);
if(mIsRTandLB){
leftx=(int)(mBezierControl2.y);
rightx=(int)(mBezierControl2.y+25);
mCurrentPageShadow=mFrontShadowDrawableHTB;
}else{
leftx=(int)(mBezierControl2.y-25);
rightx=(int)(mBezierControl2.y+1);
mCurrentPageShadow=mFrontShadowDrawableHBT;
}
rotateDegrees=(float)Math.toDegrees(Math.atan2(mBezierControl2.y
-mTouch.y,mBezierControl2.x-mTouch.x));
canvas.rotate(rotateDegrees,mBezierControl2.x,mBezierControl2.y);
floattemp;
if(mBezierControl2.y<0)
temp=mBezierControl2.y-mHeight;
else
temp=mBezierControl2.y;
inthmg=(int)Math.hypot(mBezierControl2.x,temp);
if(hmg>mMaxLength)
mCurrentPageShadow
.setBounds((int)(mBezierControl2.x-25)-hmg,leftx,(int)(mBezierControl2.x+mMaxLength)-hmg,rightx);
else
mCurrentPageShadow.setBounds(
(int)(mBezierControl2.x-mMaxLength),(int)(mBezierControl2.x),rightx);
//Log.i("hmg","mBezierControl2.x"+mBezierControl2.x
//+"mBezierControl2.y"+mBezierControl2.y);
mCurrentPageShadow.draw(canvas);
canvas.restore();
}
/**
*Author:hmg25Version:1.0Description:绘制翻起页背面
*/
privatevoiddrawCurrentBackArea(Canvascanvas,Bitmapbitmap){
inti=(int)(mBezierStart1.x+mBezierControl1.x)/2;
floatf1=Math.abs(i-mBezierControl1.x);
inti1=(int)(mBezierStart2.y+mBezierControl2.y)/2;
floatf2=Math.abs(i1-mBezierControl2.y);
floatf3=Math.min(f1,f2);
mPath1.reset();
mPath1.moveTo(mBeziervertex2.x,mBeziervertex2.y);
mPath1.lineTo(mBeziervertex1.x,mBeziervertex1.y);
mPath1.lineTo(mBezierEnd1.x,mBezierEnd1.y);
mPath1.lineTo(mTouch.x,mTouch.y);
mPath1.lineTo(mBezierEnd2.x,mBezierEnd2.y);
mPath1.close();
GradientDrawablemFolderShadowDrawable;
intleft;
intright;
if(mIsRTandLB){
left=(int)(mBezierStart1.x-1);
right=(int)(mBezierStart1.x+f3+1);
mFolderShadowDrawable=mFolderShadowDrawableLR;
}else{
left=(int)(mBezierStart1.x-f3-1);
right=(int)(mBezierStart1.x+1);
mFolderShadowDrawable=mFolderShadowDrawableRL;
}
canvas.save();
canvas.clipPath(mPath0);
canvas.clipPath(mPath1,Region.Op.INTERSECT);
mPaint.setColorFilter(mColorMatrixFilter);
floatdis=(float)Math.hypot(mCornerX-mBezierControl1.x,mBezierControl2.y-mCornerY);
floatf8=(mCornerX-mBezierControl1.x)/dis;
floatf9=(mBezierControl2.y-mCornerY)/dis;
mMatrixArray[0]=1-2*f9*f9;
mMatrixArray[1]=2*f8*f9;
mMatrixArray[3]=mMatrixArray[1];
mMatrixArray[4]=1-2*f8*f8;
mMatrix.reset();
mMatrix.setValues(mMatrixArray);
mMatrix.preTranslate(-mBezierControl1.x,-mBezierControl1.y);
mMatrix.postTranslate(mBezierControl1.x,mBezierControl1.y);
canvas.drawBitmap(bitmap,mMatrix,mPaint);
//canvas.drawBitmap(bitmap,null);
mPaint.setColorFilter(null);
canvas.rotate(mDegrees,mBezierStart1.y);
mFolderShadowDrawable.setBounds(left,right,(int)(mBezierStart1.y+mMaxLength));
mFolderShadowDrawable.draw(canvas);
canvas.restore();
}
publicvoidcomputeScroll(){
super.computeScroll();
if(mScroller.computeScrollOffset()){
floatx=mScroller.getCurrX();
floaty=mScroller.getCurrY();
mTouch.x=x;
mTouch.y=y;
postInvalidate();
}
}
privatevoidstartAnimation(intdelayMillis){
intdx,dy;
//dx水平方向滑动的距离,负值会使滚动向左滚动
//dy垂直方向滑动的距离,负值会使滚动向上滚动
if(mCornerX>0){
dx=-(int)(mWidth+mTouch.x);
}else{
dx=(int)(mWidth-mTouch.x+mWidth);
}
if(mCornerY>0){
dy=(int)(mHeight-mTouch.y);
}else{
dy=(int)(1-mTouch.y);//防止mTouch.y最终变为0
}
mScroller.startScroll((int)mTouch.x,(int)mTouch.y,dx,dy,delayMillis);
}
publicvoidabortAnimation(){
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
}
publicbooleancanDragOver(){
if(mTouchToCornerDis>mWidth/10)
returntrue;
returnfalse;
}
/**
*Author:hmg25Version:1.0Description:是否从左边翻向右边
*/
publicbooleanDragToRight(){
if(mCornerX>0)
returnfalse;
returntrue;
}
}
以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。 如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
