实例介绍
【实例截图】
【核心代码】
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;
}
}
标签: 翻页
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论