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】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |