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

Android书籍翻页效果

发布时间:2020-12-14 23:38:38 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 package?com.andorid.shu.love;import?java.io.File;import?java.io.IOException;import?java.util.ArrayList;import?java.util.List;import?android.

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

package?com.andorid.shu.love;

import?java.io.File;
import?java.io.IOException;
import?java.util.ArrayList;
import?java.util.List;

import?android.app.Activity;
import?android.content.Context;
import?android.database.Cursor;
import?android.graphics.Bitmap;
import?android.graphics.BitmapFactory;
import?android.graphics.Canvas;
import?android.os.Bundle;
import?android.os.Environment;
import?android.util.Log;
import?android.view.Display;
import?android.view.MotionEvent;
import?android.view.View;
import?android.view.View.OnTouchListener;
import?android.widget.Toast;

import?com.sqlite.DbHelper;

public?class?BookActivity?extends?Activity?{
	/**?Called?when?the?activity?is?first?created.?*/
	public?final?static?int?OPENMARK?=?0;
	public?final?static?int?SAVEMARK?=?1;
	public?final?static?int?TEXTSET?=?2;
	
	private?PageWidget?mPageWidget;
	private?Bitmap?mCurPageBitmap,?mNextPageBitmap;
	private?Canvas?mCurPageCanvas,?mNextPageCanvas;
	private?BookPageFactory?pagefactory;
	private?static?Boolean?isExit?=?false;//用于判断是否推出
	private?static?Boolean?hasTask?=?false;
	private?int?whichSize=6;//当前的字体大小
	private?int?txtProgress?=?0;//当前阅读的进度
	private?String?txtPath?=?"/sdcard/lovereader/百年孤独.txt";
	private?String?bookPath?=?"/sdcard/lovereader/";
	final?String[]?font?=?new?String[]?{"20","24","26","30","32","36","40","46","50","56","60","66","70"};
	int?curPostion;
	DbHelper?db;?
	Context?mContext;
	Cursor?mCursor;
	BookInfo?book?=?null;?
	SetupInfo?setup?=?null;
	//add?for?2015-03-04
	private?int[]?mPics?=?new?int?[]?{R.drawable.c0,R.drawable.c1,R.drawable.c2,R.drawable.c3};
	private?int?mCurrent?=?0;
	private?int?mNext?=?1;
	//add?for?2015-03-06
	private?List<String>?mFileList?=?new?ArrayList<String>();
	private?static?final?String?TAG?=?"BookActivity";
	@Override
	public?void?onCreate(Bundle?savedInstanceState)?{
		super.onCreate(savedInstanceState);
		/*requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);*/
		Display?display?=?getWindowManager().getDefaultDisplay();
		int?w?=?display.getWidth();
		int?h?=?display.getHeight();?
		System.out.println(w?+?"t"?+?h);
		BitmapFactory.Options?options?=?new?BitmapFactory.Options();??
		options.inSampleSize?=?2;//图片大小,设置越大,图片越不清晰,占用空间越小?
		/*String?SDPath?=?getSDPath();
		Log.d(TAG,?"sdPath:"+SDPath);*/
		///getFile(new?File("/storage/extSdCard/pic/pic_1"));
		//get?FileDirPath
		String?dirPath?=?getIntent().getStringExtra("....");
		dirPath?=?"/storage/extSdCard/pic/pic_1";
		File?mFile?=?new?File(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?(IOException?e2)?{
			//?TODO?Auto-generated?catch?block
			e2.printStackTrace();
		}
		pagefactory?=?new?BookPageFactory(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?=?new?PageWidget(this,?h);
		setContentView(mPageWidget);
		mPageWidget.setBitmaps(mCurPageBitmap,?mNextPageBitmap);
		mPageWidget.setOnTouchListener(new?OnTouchListener()?{
			@Override
			public?boolean?onTouch(View?v,?MotionEvent?e)?{
				boolean?ret?=?false;
				if?(v?==?mPageWidget)?{
					if?(e.getAction()?==?MotionEvent.ACTION_DOWN)?{
						mPageWidget.abortAnimation();
						mPageWidget.calcCornerXY(e.getX(),?e.getY());
						//int?temp?=?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();?
								return?false;
							}
							//获取当前页坐标
							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();
								return?false;
							}
							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);
					return?ret;
				}
				return?false;
			}
		});
	}

	public?String?getSDPath(){?
		File?sdDir?=?null;?
		boolean?sdCardExist?=?Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);???//判断sd卡是否存在?
		if(sdCardExist){???????????????????????????????
			sdDir?=?Environment.getExternalStorageDirectory();//获取跟目录?
		}
		return?sdDir.toString();???????
	}
	/**
	?*?获取文件对象
	?*?@param?file
	?*?@return
	?*?@throws?IOException?
	?*/
	public?List<String>?getFile(File?file)?throws?IOException{
//		Log.d(TAG,?"getFile.fun..start..");
		File[]?fileArray?=file.listFiles();
//		Log.d(TAG,?"getFile.fun..listFiles..");
		for?(File?f?:?fileArray)?{
//			Log.d(TAG,?"getFile.fun..ffff..");
			if(f.isFile()){
//				Log.d(TAG,?"getFile.fun..adddd..22222..");
				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..");
		return?mFileList;
	}
}
package?com.andorid.shu.love;

import?java.io.File;
import?java.io.FileNotFoundException;
import?java.io.IOException;
import?java.io.RandomAccessFile;
import?java.io.UnsupportedEncodingException;
import?java.nio.MappedByteBuffer;
import?java.nio.channels.FileChannel;
import?java.text.DecimalFormat;
import?java.text.SimpleDateFormat;
import?java.util.Date;
import?java.util.List;
import?java.util.Vector;

import?android.content.res.Resources;
import?android.graphics.Bitmap;
import?android.graphics.BitmapFactory;
import?android.graphics.Canvas;
import?android.graphics.Color;
import?android.graphics.Matrix;
import?android.graphics.Paint;
import?android.graphics.Paint.Align;

public?class?BookPageFactory?{

	private?File?book_file?=?null;
	private?MappedByteBuffer?m_mbBuf?=?null;
	private?int?m_mbBufLen?=?0;
	private?int?m_mbBufBegin?=?50;?//50
	private?int?m_mbBufEnd?=?0;
	private?String?m_strCharsetName?=?"GBK";
	private?Bitmap?m_book_bg?=?null;
	private?int?mWidth;
	private?int?mHeight;

	private?Vector<String>?m_lines?=?new?Vector<String>();

	private?int?m_fontSize?=?40;
	private?int?r_fontSize?=?30;
	private?int?m_textColor?=?Color.BLACK;
	private?int?m_backColor?=?0xffff9e85;?//?背景颜色
	private?int?marginWidth?=?15;?//?左右与边缘的距离
	private?int?marginHeight?=?20;?//?上下与边缘的距离
	private?int?youmiHeight?=?0;//广告条的狂度

	private?int?mLineCount;?//?每页可以显示的行数
	private?float?mVisibleHeight;?//?绘制内容的宽
	private?float?mVisibleWidth;?//?绘制内容的宽
	private?boolean?m_isfirstPage,?m_islastPage;
	private?int?b_FontSize?=?16;//底部文字大小
	private?int?e_fontSize?=?5;
	private?int?spaceSize?=?20;//行间距大小
	private?int?curProgress?=?0;//当前的进度
	private?String?fileName?=?"";

	//?private?int?m_nLineSpaceing?=?5;

	private?Paint?mPaint;
	private?Paint?bPaint;//底部文字绘制
	private?Paint?spactPaint;//行间距绘制
	private?Paint?titlePaint;//标题绘制
	//add?for?2015?03?06
	private?List<String>?mFileList;//当前文件列表

	public?BookPageFactory(int?w,?int?h,List<String>?fileList)?{
		//?TODO?Auto-generated?constructor?stub
		mWidth?=?w;
		mHeight?=?h;
		//add?for?2015?03?04
		this.mFileList?=?fileList;
	}
	
	//add?for?2015?03?04
	public?Bitmap?prePage(int?currentNum){
		this.m_islastPage?=?false;
		if(currentNum?==?0){
			//currentNum?=?0;
			this.m_isfirstPage?=?true;
		}else{
			//currentNum--;
			this.m_isfirstPage?=?false;
		}
		BitmapFactory.Options?options?=?new?BitmapFactory.Options();
		options.inSampleSize?=?2;//图片大小,设置越大,图片越不清晰,占用空间越小
		Bitmap?bitmap?=?BitmapFactory.decodeFile(mFileList.get(currentNum),?options);
		//Bitmap?bitmap?=?BitmapFactory.decodeResource(this.mResources,?mPics[currentNum]);
		//图片放大至屏幕大小
		bitmap?=?resizePic(bitmap,?mWidth,?mHeight);
		return?bitmap;
	}
	
	//add?for?2015?03?04
	public?Bitmap?nextPage(int?currentNum){
		this.m_isfirstPage?=?false;
		if(currentNum?>=?mFileList.size()-1){
			//currentNum?=?mPics.length-1;
			this.m_islastPage?=?true;
		}else{
			//currentNum++;
			this.m_islastPage?=?false;
		}
		BitmapFactory.Options?options?=?new?BitmapFactory.Options();
		options.inSampleSize?=?2;//图片大小,设置越大,图片越不清晰,占用空间越小
		Bitmap?bitmap?=?BitmapFactory.decodeFile(mFileList.get(currentNum),?mHeight);
		return?bitmap;
	}
	//add?for?2015?03?06
	public?Bitmap?getPage(int?currnet){
		BitmapFactory.Options?options?=?new?BitmapFactory.Options();
		options.inSampleSize?=?2;//图片大小,设置越大,图片越不清晰,占用空间越小
		Bitmap?bitmap?=?BitmapFactory.decodeFile(mFileList.get(currnet),?mPics[currnet]);
		//图片放大至屏幕大小
		bitmap?=?resizePic(bitmap,?mHeight);
		return?bitmap;
	}
	//add?for?2015?03?06
	public?static?Bitmap?resizePic(Bitmap?bitmap,?int?screenWidth,int?screenHight)?{
	????int?w?=?bitmap.getWidth();
	????int?h?=?bitmap.getHeight();
	????Matrix?matrix?=?new?Matrix();
	????float?scale?=?(float)?screenWidth?/?w;
	????float?scale2?=?(float)?screenHight?/?h;
	????//?scale?=?scale?<?scale2???scale?:?scale2;
	????matrix.postScale(scale,?scale2);
	????Bitmap?bmp?=?Bitmap.createBitmap(bitmap,?0,?matrix,?true);
	????if?(bitmap?!=?null?&&?!bitmap.equals(bmp)?&&?!bitmap.isRecycled())?{
	????????????bitmap.recycle();
	????????????bitmap?=?null;
	????}
	????return?bmp;
	}

	private?static?double?round1(double?v,?int?scale)?{
		if?(scale?<?0)
		return?v;
		String?temp?=?"#####0.";
		for?(int?i?=?0;?i?<?scale;?i++)?{
		temp?+=?"0";
		}
		return?Double.valueOf(new?java.text.DecimalFormat(temp).format(v));
		}

	public?void?setBgBitmap(Bitmap?BG)?{
		if?(BG.getWidth()?!=?mWidth?||?BG.getHeight()?!=?mHeight)
			m_book_bg?=?Bitmap.createScaledBitmap(BG,?mHeight,?true);
		else
			m_book_bg?=?BG;
	}
	?
	public?boolean?isfirstPage()?{
		return?m_isfirstPage;
	}

	public?void?setIslastPage(boolean?islast){
		m_islastPage?=?islast;
	}
	public?boolean?islastPage()?{
		return?m_islastPage;
	}?
	public?int?getCurPostion()?{
		return?m_mbBufEnd;
	}
	
	public?int?getCurPostionBeg(){
		return?m_mbBufBegin;
	}
	public?void?setBeginPos(int?pos)?{
		m_mbBufEnd?=?pos;
		m_mbBufBegin?=?pos;
	}
	
	public?int?getBufLen()?{
		return?m_mbBufLen;
	}
	
	public?int?getCurProgress(){
		return?curProgress;
	}
	public?String?getOneLine()?{
		return?m_lines.toString().substring(0,?10);
	}
	
	public?void?changBackGround(int?color)?{
		mPaint.setColor(color);
	}
	
	public?void?setFontSize(int?size)?{
		m_fontSize?=?size;
		mPaint.setTextSize(size);
		int?totalSize?=?m_fontSize+spaceSize;
		mLineCount?=?(int)?(mVisibleHeight?/?totalSize);?//?可显示的行数
	}
	
	public?void?setFileName(String?fileName){
		fileName?=?fileName.substring(0,fileName.indexOf("."));
		this.fileName?=?fileName;?
	}
	
}
package?com.andorid.shu.love;

import?android.content.Context;
import?android.graphics.Bitmap;
import?android.graphics.Canvas;
import?android.graphics.ColorMatrix;
import?android.graphics.ColorMatrixColorFilter;
import?android.graphics.Matrix;
import?android.graphics.Paint;
import?android.graphics.Path;
import?android.graphics.PointF;
import?android.graphics.Region;
import?android.graphics.drawable.GradientDrawable;
import?android.view.MotionEvent;
import?android.view.View;
import?android.widget.Scroller;

public?class?PageWidget?extends?View?{

	private?static?final?String?TAG?=?"hmg";
	private?int?mWidth?=?480;
	private?int?mHeight?=?800;
	private?int?mCornerX?=?0;?//?拖拽点对应的页脚
	private?int?mCornerY?=?0;
	private?Path?mPath0;
	private?Path?mPath1;
	Bitmap?mCurPageBitmap?=?null;?//?当前页
	Bitmap?mNextPageBitmap?=?null;

	PointF?mTouch?=?new?PointF();?//?拖拽点
	PointF?mBezierStart1?=?new?PointF();?//?贝塞尔曲线起始点
	PointF?mBezierControl1?=?new?PointF();?//?贝塞尔曲线控制点
	PointF?mBeziervertex1?=?new?PointF();?//?贝塞尔曲线顶点
	PointF?mBezierEnd1?=?new?PointF();?//?贝塞尔曲线结束点

	PointF?mBezierStart2?=?new?PointF();?//?另一条贝塞尔曲线
	PointF?mBezierControl2?=?new?PointF();
	PointF?mBeziervertex2?=?new?PointF();
	PointF?mBezierEnd2?=?new?PointF();

	float?mMiddleX;
	float?mMiddleY;
	float?mDegrees;
	float?mTouchToCornerDis;
	ColorMatrixColorFilter?mColorMatrixFilter;
	Matrix?mMatrix;
	float[]?mMatrixArray?=?{?0,?1.0f?};

	boolean?mIsRTandLB;?//?是否属于右上左下
	float?mMaxLength?=?(float)?Math.hypot(mWidth,?mHeight);
	int[]?mBackShadowColors;
	int[]?mFrontShadowColors;
	GradientDrawable?mBackShadowDrawableLR;
	GradientDrawable?mBackShadowDrawableRL;
	GradientDrawable?mFolderShadowDrawableLR;
	GradientDrawable?mFolderShadowDrawableRL;

	GradientDrawable?mFrontShadowDrawableHBT;
	GradientDrawable?mFrontShadowDrawableHTB;
	GradientDrawable?mFrontShadowDrawableVLR;
	GradientDrawable?mFrontShadowDrawableVRL;

	Paint?mPaint;

	Scroller?mScroller;

	public?PageWidget(Context?context,?int?w,?int?h)?{
		super(context);
		//?TODO?Auto-generated?constructor?stub
		mWidth?=?w;
		mHeight?=?h;
		mPath0?=?new?Path();
		mPath1?=?new?Path();
		createDrawable();

		mPaint?=?new?Paint();
		mPaint.setStyle(Paint.Style.FILL);

		ColorMatrix?cm?=?new?ColorMatrix();
		float?array[]?=?{?0.55f,?80.0f,?0.55f,0.55f,?0.2f,?0?};
		cm.set(array);
		mColorMatrixFilter?=?new?ColorMatrixColorFilter(cm);
		mMatrix?=?new?Matrix();
		mScroller?=?new?Scroller(getContext());

		mTouch.x?=?0.01f;?//?不让x,y为0,否则在点计算时会有问题
		mTouch.y?=?0.01f;
	}

	/**
	?*?Author?:?hmg25?Version:?1.0?Description?:?计算拖拽点对应的拖拽脚
	?*/
	public?void?calcCornerXY(float?x,?float?y)?{
		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;
	}

	public?boolean?doTouchEvent(MotionEvent?event)?{
		//?TODO?Auto-generated?method?stub
		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();
		}
		//?return?super.onTouchEvent(event);
		return?true;
	}

	/**
	?*?Author?:?hmg25?Version:?1.0?Description?:?求解直线P1P2和直线P3P4的交点坐标
	?*/
	public?PointF?getCross(PointF?P1,?PointF?P2,?PointF?P3,?PointF?P4)?{
		PointF?CrossP?=?new?PointF();
		//?二元函数通式:?y=ax+b
		float?a1?=?(P2.y?-?P1.y)?/?(P2.x?-?P1.x);
		float?b1?=?((P1.x?*?P2.y)?-?(P2.x?*?P1.y))?/?(P1.x?-?P2.x);

		float?a2?=?(P4.y?-?P3.y)?/?(P4.x?-?P3.x);
		float?b2?=?((P3.x?*?P4.y)?-?(P4.x?*?P3.y))?/?(P3.x?-?P4.x);
		CrossP.x?=?(b2?-?b1)?/?(a1?-?a2);
		CrossP.y?=?a1?*?CrossP.x?+?b1;
		return?CrossP;
	}

	private?void?calcPoints()?{
		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;

				float?f1?=?Math.abs(mCornerX?-?mTouch.x);
				float?f2?=?mWidth?*?f1?/?mBezierStart1.x;
				mTouch.x?=?Math.abs(mCornerX?-?f2);

				float?f3?=?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;
	}

	private?void?drawCurrentPageArea(Canvas?canvas,?Bitmap?bitmap,?Path?path)?{
		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();
	}

	private?void?drawNextPageAreaAndShadow(Canvas?canvas,?Bitmap?bitmap)?{
		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));
		int?leftx;
		int?rightx;
		GradientDrawable?mBackShadowDrawable;
		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();
	}

	public?void?setBitmaps(Bitmap?bm1,?Bitmap?bm2)?{
		mCurPageBitmap?=?bm1;
		mNextPageBitmap?=?bm2;
	}

	public?void?setScreen(int?w,?int?h)?{
		mWidth?=?w;
		mHeight?=?h;
	}

	@Override
	protected?void?onDraw(Canvas?canvas)?{
		canvas.drawColor(0xFFAAAAAA);
		calcPoints();
		drawCurrentPageArea(canvas,?mCurPageBitmap,?mPath0);
		drawNextPageAreaAndShadow(canvas,?mNextPageBitmap);
		drawCurrentPageShadow(canvas);
		drawCurrentBackArea(canvas,?mCurPageBitmap);
	}

	/**
	?*?Author?:?hmg25?Version:?1.0?Description?:?创建阴影的GradientDrawable
	?*/
	private?void?createDrawable()?{
		int[]?color?=?{?0x333333,?0xb0333333?};
		mFolderShadowDrawableRL?=?new?GradientDrawable(
				GradientDrawable.Orientation.RIGHT_LEFT,?color);
		mFolderShadowDrawableRL
				.setGradientType(GradientDrawable.LINEAR_GRADIENT);

		mFolderShadowDrawableLR?=?new?GradientDrawable(
				GradientDrawable.Orientation.LEFT_RIGHT,?color);
		mFolderShadowDrawableLR
				.setGradientType(GradientDrawable.LINEAR_GRADIENT);

		mBackShadowColors?=?new?int[]?{?0xff222221,?0x222221?};
		mBackShadowDrawableRL?=?new?GradientDrawable(
				GradientDrawable.Orientation.RIGHT_LEFT,?mBackShadowColors);
		mBackShadowDrawableRL.setGradientType(GradientDrawable.LINEAR_GRADIENT);

		mBackShadowDrawableLR?=?new?GradientDrawable(
				GradientDrawable.Orientation.LEFT_RIGHT,?mBackShadowColors);
		mBackShadowDrawableLR.setGradientType(GradientDrawable.LINEAR_GRADIENT);

		mFrontShadowColors?=?new?int[]?{?0x80222221,?0x222221?};
		mFrontShadowDrawableVLR?=?new?GradientDrawable(
				GradientDrawable.Orientation.LEFT_RIGHT,?mFrontShadowColors);
		mFrontShadowDrawableVLR
				.setGradientType(GradientDrawable.LINEAR_GRADIENT);
		mFrontShadowDrawableVRL?=?new?GradientDrawable(
				GradientDrawable.Orientation.RIGHT_LEFT,?mFrontShadowColors);
		mFrontShadowDrawableVRL
				.setGradientType(GradientDrawable.LINEAR_GRADIENT);

		mFrontShadowDrawableHTB?=?new?GradientDrawable(
				GradientDrawable.Orientation.TOP_BOTTOM,?mFrontShadowColors);
		mFrontShadowDrawableHTB
				.setGradientType(GradientDrawable.LINEAR_GRADIENT);

		mFrontShadowDrawableHBT?=?new?GradientDrawable(
				GradientDrawable.Orientation.BOTTOM_TOP,?mFrontShadowColors);
		mFrontShadowDrawableHBT
				.setGradientType(GradientDrawable.LINEAR_GRADIENT);
	}

	/**
	?*?Author?:?hmg25?Version:?1.0?Description?:?绘制翻起页的阴影
	?*/
	public?void?drawCurrentPageShadow(Canvas?canvas)?{
		double?degree;
		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点的距离
		double?d1?=?(float)?25?*?1.414?*?Math.cos(degree);
		double?d2?=?(float)?25?*?1.414?*?Math.sin(degree);
		float?x?=?(float)?(mTouch.x?+?d1);
		float?y;
		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();
		float?rotateDegrees;
		canvas.save();

		canvas.clipPath(mPath0,?Region.Op.XOR);
		canvas.clipPath(mPath1,?Region.Op.INTERSECT);
		int?leftx;
		int?rightx;
		GradientDrawable?mCurrentPageShadow;
		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);
		float?temp;
		if?(mBezierControl2.y?<?0)
			temp?=?mBezierControl2.y?-?mHeight;
		else
			temp?=?mBezierControl2.y;

		int?hmg?=?(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?:?hmg25?Version:?1.0?Description?:?绘制翻起页背面
	?*/
	private?void?drawCurrentBackArea(Canvas?canvas,?Bitmap?bitmap)?{
		int?i?=?(int)?(mBezierStart1.x?+?mBezierControl1.x)?/?2;
		float?f1?=?Math.abs(i?-?mBezierControl1.x);
		int?i1?=?(int)?(mBezierStart2.y?+?mBezierControl2.y)?/?2;
		float?f2?=?Math.abs(i1?-?mBezierControl2.y);
		float?f3?=?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();
		GradientDrawable?mFolderShadowDrawable;
		int?left;
		int?right;
		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);

		float?dis?=?(float)?Math.hypot(mCornerX?-?mBezierControl1.x,mBezierControl2.y?-?mCornerY);
		float?f8?=?(mCornerX?-?mBezierControl1.x)?/?dis;
		float?f9?=?(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();
	}

	public?void?computeScroll()?{
		super.computeScroll();
		if?(mScroller.computeScrollOffset())?{
			float?x?=?mScroller.getCurrX();
			float?y?=?mScroller.getCurrY();
			mTouch.x?=?x;
			mTouch.y?=?y;
			postInvalidate();
		}
	}

	private?void?startAnimation(int?delayMillis)?{
		int?dx,?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);
	}

	public?void?abortAnimation()?{
		if?(!mScroller.isFinished())?{
			mScroller.abortAnimation();
		}
	}

	public?boolean?canDragOver()?{
		if?(mTouchToCornerDis?>?mWidth?/?10)
			return?true;
		return?false;
	}

	/**
	?*?Author?:?hmg25?Version:?1.0?Description?:?是否从左边翻向右边
	?*/
	public?boolean?DragToRight()?{
		if?(mCornerX?>?0)
			return?false;
		return?true;
	}

}

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

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

    推荐文章
      热点阅读