加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读