在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android 实现文本翻页代码

android 实现文本翻页代码

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.02M
  • 下载次数:34
  • 浏览次数:251
  • 发布时间:2015-07-14
  • 实例类别:Android平台开发
  • 发 布 人:Martin-wz
  • 文件格式:.java
  • 所需积分:0
 相关标签: 翻页

实例介绍

【实例简介】
【实例截图】

【核心代码】

package com.xf.widget;

import android.content.Context;
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.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.Scroller;

public class PageWidget extends FrameLayout {

	private int mWidth = 0;
	private int mHeight = 0;
	private int mCornerX = 0; // 拖拽点对应的页脚
	private int mCornerY = 0;
	private Path mPath0;
	private Path mPath1;
	

	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();
	
	PointF mLT = new PointF();
	PointF mRT = new PointF();
	PointF mLB = new PointF();
	PointF mRB = new PointF();
	PointF mBztemp;
	PointF mBztempStart = new PointF();

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

	boolean mIsRTandLB; // 是否属于右上左下
	float mMaxLength;
	int[] mBackShadowColors;
	int[] mFrontShadowColors;
	GradientDrawable mBackShadowDrawableLR;
	GradientDrawable mBackShadowDrawableRL;
	GradientDrawable mFolderShadowDrawableLR;
	GradientDrawable mFolderShadowDrawableRL;

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

	Paint mPaint;

	Scroller mScroller;
	private boolean isAnimated = false;
	private View currentView = null;
	private View nextView = null;
	private View nextViewTranscript = null;
	private Context mContext;
	
	private BaseAdapter mAdapter = null;
	private int currentPosition = -1;
	private int itemCount = 0;
	private OnPageTurnListener turnListener;
	
	public PageWidget(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mContext = context;
		viewInit();
	}

	
	public PageWidget(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		mContext = context;
		viewInit();
	}
	
	private void viewInit() {
		mPath0 = new Path();
		mPath1 = new Path();
		createDrawable();

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

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

		setOnTouchListener(new FingerTouchListener());
		
	}
	
	private class FingerTouchListener implements OnTouchListener {

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			if (v == PageWidget.this && mAdapter != null) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					if(itemCount == 0) { return false; }
					abortAnimation();
					calcCornerXY(event.getX(), event.getY());
					if (DragToRight()) {
						if(currentPosition == 0) { mCornerX = 0; mCornerY = 0; return false; }
//						Log.d("PageWidget->DragToRight", ""   (currentPosition-1));
						nextView = mAdapter.getView(currentPosition-1, nextView, null);
						nextViewTranscript = mAdapter.getView(currentPosition-1, nextViewTranscript, null);
					} else {
						if(currentPosition == itemCount-1) { mCornerX = 0; mCornerY = 0; return false; }
						if(currentPosition < 0) {currentPosition = 0;}
//						Log.d("PageWidget->", ""   (currentPosition 1));
						nextView = mAdapter.getView(currentPosition 1, nextView, null);
						nextViewTranscript = mAdapter.getView(currentPosition 1, nextViewTranscript, null);
					}
					isAnimated = false;
					mTouch.x = event.getX();
					mTouch.y = event.getY();
					nextView.setVisibility(View.VISIBLE);
					nextViewTranscript.setVisibility(View.VISIBLE);
					PageWidget.this.postInvalidate();
					
				} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
					float x = event.getX();
					float y = event.getY();
					if (x > mWidth) {
						mTouch.x = mWidth-0.01f;
					} else if (x < 0){
						mTouch.x = 0.01f;
					} else {
						mTouch.x = x;
					}
					
					if (y > mHeight) {
						mTouch.y = mHeight-0.01f;
					} else if (y < 0){
						mTouch.y = 0.01f;
					} else {
						mTouch.y = y;
					}
					PageWidget.this.postInvalidate();
					
				} else if (event.getAction() == MotionEvent.ACTION_UP) {
					if (canDragOver()) {
						isAnimated = true;
						startAnimation(500);
					} else {
						mTouch.x = 0.01f;
						mTouch.y = 0.01f;
						mCornerX = 0;
						mCornerY = 0;
						nextView.setVisibility(View.INVISIBLE);
						nextViewTranscript.setVisibility(View.INVISIBLE);
					}
					PageWidget.this.postInvalidate();
				}
				return true;
             
			} else {
				return false;
			}
			
		}
		
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		
		if(mWidth == 0) {
			mWidth = getWidth();
			mHeight = getHeight();
			
			mTouch.x = 0.01f; // 不让x,y为0,否则在点计算时会有问题
			mTouch.y = 0.01f;
			mLT.x = 0;
			mLT.y = 0;
			mLB.x = 0;
			mLB.y = mHeight;
			mRT.x = mWidth;
			mRT.y = 0;
			mRB.x = mWidth;
			mRB.y = mHeight;
			mMaxLength = (float) Math.hypot(mWidth, mHeight);
		}
		
	}


	@Override
	protected void dispatchDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		calcPoints();
		super.dispatchDraw(canvas);
		if(itemCount > 1){
			drawCurrentPageShadow(canvas);
			drawCurrentBackArea(canvas, nextViewTranscript);
		}
		
	}

	
	@Override
	protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
		// TODO Auto-generated method stub
		if(child.equals(currentView)) {
			drawCurrentPageArea(canvas, child, mPath0);
		} else {
			drawNextPageAreaAndShadow(canvas, child);
		}
			
		return true;
	}
	
	/**
	 * 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;
	}

	/**
	 * 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);

		

		mBezierStart1.x = mBezierControl1.x - (mCornerX - mBezierControl1.x)
				/ 3;
		mBezierStart1.y = mCornerY;

		// 当mBezierStart1.x < 0或者mBezierStart1.x > 480时
		// 如果继续翻页,会出现BUG故在此限制
		if(!isAnimated)	{
			if(mCornerX == 0 && mBezierStart1.x > mWidth/2) {
				float f1 = Math.abs(mCornerX - mTouch.x);
				float f2 = mWidth/2 * 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);
				
				mBezierStart1.x = mBezierControl1.x
						- (mCornerX - mBezierControl1.x) / 3;
			}
			if(mCornerX == mWidth && mBezierStart1.x < mWidth/2) {
				mBezierStart1.x = mWidth - mBezierStart1.x;
				float f1 = Math.abs(mCornerX - mTouch.x);
				float f2 = mWidth/2 * 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);
				mBezierStart1.x = mBezierControl1.x
						- (mCornerX - mBezierControl1.x) / 3;
			}
		}
		
		mBezierStart2.x = mCornerX;
		mBezierStart2.y = mBezierControl2.y - (mCornerY - mBezierControl2.y)
				/ 3;

		mTouchToCornerDis = (float) Math.hypot((mTouch.x - mCornerX),
				(mTouch.y - mCornerY));

		mBezierEnd1 = getCross(mTouch, mBezierControl1, mBezierStart1,
				mBezierStart2);
		mBezierEnd2 = getCross(mTouch, mBezierControl2, mBezierStart1,
				mBezierStart2);

		/*
		 * 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, View child, 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);
		child.draw(canvas);
		canvas.restore();
	}

	private void drawNextPageAreaAndShadow(Canvas canvas, View child) {
		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);
		child.draw(canvas);
		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 setScreen(int w, int h) {
		mWidth = w;
		mHeight = h;
	}


	/**
	 * 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[] { 0xff111111, 0x111111 };
		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[] { 0x80111111, 0x111111 };
		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 : 绘制翻起页的阴影
	 */
	private 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);
		}
		
		if(Math.toDegrees(degree) > 220) {
			return;
		}
		
		// 翻起页阴影顶点与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), rightx,
				(int) (mBezierControl1.y));
		mCurrentPageShadow.draw(canvas);
		canvas.restore();

		int offset = mCornerX > 0 ? 30 : -30;
		
		if(mBezierControl2.y < 0) {
			mBztemp = getCross(mLT, mRT, mTouch, mBezierControl2);
			mBztempStart.x = mBztemp.x - offset;
			mBztempStart.y = mBztemp.y;
		} else if(mBezierControl2.y > mHeight){
			mBztemp = getCross(mLB, mRB, mTouch, mBezierControl2);
			mBztempStart.x = mBztemp.x - offset;
			mBztempStart.y = mBztemp.y;
		} else {
			mBztemp = mBezierControl2;
			mBztempStart = mBezierStart2;
		}
		mPath1.reset();
		mPath1.moveTo(x, y);
		mPath1.lineTo(mTouch.x, mTouch.y);
		mPath1.lineTo(mBztemp.x, mBztemp.y);
		mPath1.lineTo(mBztempStart.x, mBztempStart.y);
		mPath1.close();
		canvas.save();
		canvas.clipPath(mPath0, Region.Op.XOR);
		canvas.clipPath(mPath1, Region.Op.INTERSECT);
		if (mIsRTandLB) {
			leftx = (int) (mBztemp.y);
			rightx = (int) (mBztemp.y   25);
			mCurrentPageShadow = mFrontShadowDrawableHTB;
		} else {
			leftx = (int) (mBztemp.y - 25);
			rightx = (int) (mBztemp.y );
			mCurrentPageShadow = mFrontShadowDrawableHBT;
		}
		rotateDegrees = (float) Math.toDegrees(Math.atan2(mBztemp.y
				- mTouch.y, mBztemp.x - mTouch.x));
		canvas.rotate(rotateDegrees, mBztemp.x, mBztemp.y);
		mCurrentPageShadow.setBounds(
				(int) (mBztemp.x - mMaxLength), leftx,
				(int) (mBztemp.x), rightx);
		mCurrentPageShadow.draw(canvas);
		canvas.restore();
		
	}

	/**
	 * Author : hmg25 Version: 1.0 Description : 绘制翻起页背面
	 */
	private void drawCurrentBackArea(Canvas canvas, View view) {
		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 = f1;
		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 rotateDegrees = (float) Math.toDegrees(Math.PI/2   Math.atan2(mBezierControl2.y
				- mTouch.y, mBezierControl2.x - mTouch.x));
		
		if(mCornerY == 0) {
			rotateDegrees -= 180;
		}
		mMatrix.reset();
		mMatrix.setPolyToPoly(new float[] {Math.abs(mWidth-mCornerX), mCornerY}, 0, new float[] {mTouch.x, mTouch.y}, 0, 1);
		mMatrix.postRotate(rotateDegrees, mTouch.x, mTouch.y);
		canvas.save();
		canvas.concat(mMatrix);
		view.draw(canvas);
		canvas.restore();
		canvas.rotate(mDegrees, mBezierStart1.x, mBezierStart1.y);
		mFolderShadowDrawable.setBounds(left, (int) mBezierStart1.y, right 2,
				(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();
		}
		if(isAnimated && mScroller.isFinished()) {
			isAnimated = false;
			if(DragToRight()) {
				currentPosition -= 1;
			} else {
				currentPosition  = 1;
			}
			currentView = mAdapter.getView(currentPosition, currentView, null);
			
			mTouch.x = 0.01f;
			mTouch.y = 0.01f;
			mCornerX = 0;
			mCornerY = 0;
			nextView.setVisibility(View.INVISIBLE);
			nextViewTranscript.setVisibility(View.INVISIBLE);
			postInvalidate();
			if(turnListener != null) {
				turnListener.onTurn(itemCount, currentPosition);
			}
		}
	}


	private void startAnimation(int delayMillis) {
		int dx, dy;
		// dx 水平方向滑动的距离,负值会使滚动向左滚动
		// dy 垂直方向滑动的距离,负值会使滚动向上滚动
		
		if (mCornerX > 0) {
			dx = (int) (- mTouch.x   1);
		} else {
			dx = (int) (mWidth - mTouch.x - 1);
		}
		if (mCornerY > 0) {
			dy = (int) (mHeight - mTouch.y - 1);
		} 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();
			computeScroll();
		}
	}

	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;
	}
	
	public void setAdapter(BaseAdapter adapter) {
		mAdapter = adapter;
		itemCount = mAdapter.getCount();
		currentView = null;
		nextView = null;
		nextViewTranscript = null;
		removeAllViews();
		if(itemCount != 0) {
			currentPosition = 0;
			currentView = mAdapter.getView(currentPosition, null, null);
			addView(currentView);
			if(itemCount > 1) {
				nextView = mAdapter.getView(currentPosition, null, null);
				nextViewTranscript = mAdapter.getView(currentPosition, null, null);
				nextView.setVisibility(View.INVISIBLE);
				nextViewTranscript.setVisibility(View.INVISIBLE);
				addView(nextView);
				addView(nextViewTranscript);
			}
			
		} else {
			currentPosition = -1;
		}
		mTouch.x = 0.01f;
		mTouch.y = 0.01f;
		mCornerX = 0;
		mCornerY = 0;
		postInvalidate();
		if(turnListener != null) {
			turnListener.onTurn(itemCount, currentPosition);
		}
		
	}

	/**用于翻页结束后的页码通知
	 * @author xf
	 *
	 */
	public interface OnPageTurnListener {
		public void onTurn(int count, int currentPosition);
	}

	public void setOnPageTurnListener(OnPageTurnListener listener) {
		turnListener = listener;
	}
}

标签: 翻页

实例下载地址

android 实现文本翻页代码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警