package org.carelife.creader.bookfile; 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.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Scroller; public class PageWidget_pager extends View { private static final String TAG = "lx"; private int mWidth = 480;//Ĭ��ֵ���������setScreen���� private int mHeight = 800;//Ĭ��ֵ���������setScreen���� public boolean ToNext = true; private boolean movelock = true; private int mCornerX = 0; //ȷ��������� private int mCornerY = 0; Bitmap mCurPageBitmap = null; Bitmap mNextPageBitmap = null; Bitmap mPrePageBitmap = null; PointF mTouch_down = new PointF(); PointF mTouch = new PointF(); // PointF mTouch_lastmove = new PointF(); float mMiddleX; float mMiddleY; float mDegrees; public int mTouchToCornerDis,lastdis; ColorMatrixColorFilter mColorMatrixFilter; Matrix mMatrix; float[] mMatrixArray = { 0, 0, 0, 0, 0, 0, 0, 0, 1.0f }; float mMaxLength; int[] mFrontShadowColors = new int[] { 0x80111111, 0x111111 }; public Scroller mScroller; public PageWidget_pager(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub // createDrawable(); 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()); mTouch.x = 0; mTouch.y = 0; } public PageWidget_pager(Context context) { super(context); // TODO Auto-generated constructor stub // createDrawable(); 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()); mTouch.x = 0; mTouch.y = 0; } public void calcCornerXY(float x, float y) { if (x <= mWidth / 2) ToNext = false; else ToNext = true; } public void protect_touch(float x, float y){ mTouch.x = x; mTouch.y = y; calcCornerXY(x,y); mTouchToCornerDis = 0; startAnimation(800); this.postInvalidate(); } public void fist_move(float x, float y){ mTouch_down.x = x; mTouch_down.y = y; } public void setCornerX_forfixbug(){ mCornerX = 0; mCornerY = 0; mTouch = new PointF(); mTouch.x = 0; mTouch.y = 0; mTouch_down.x = 0; mTouch_down.y = 0; // mTouch_lastmove.x = 0; // mTouch_lastmove.y = 0; mTouchToCornerDis = 0; lastdis = 0; } public boolean doTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_MOVE) { lastdis = (int) (event.getX() - mTouch.x); mTouch.x = event.getX(); mTouch.y = event.getY(); // lastdis = (int) (mTouch.x - mTouch_lastmove.x); // mTouch_lastmove.x = event.getX(); // mTouch_lastmove.y = event.getY(); // if(movelock){ // movelock = false; // if(calcPoints() < 0){ // ToNext = true; // }else if(calcPoints() > 0){ // ToNext = false; // }else{ // movelock = true; // } // } // System.out.println("ACTION_MOVE mTouch.x is = "+mTouch.x+" , mTouch.y is = "+mTouch.y); calcPoints(); this.postInvalidate(); } if (event.getAction() == MotionEvent.ACTION_DOWN) { mTouch_down.x = event.getX(); mTouch_down.y = event.getY(); // mTouch_lastmove.x = event.getX(); // mTouch_lastmove.y = event.getY(); mTouch.x = event.getX(); mTouch.y = event.getY(); mTouchToCornerDis = 0; lastdis = 0; // System.out.println(" ACTION_DOWN mTouch.x is = "+mTouch_down.x+" , mTouch_down.y is = "+mTouch.y); calcCornerXY(mTouch_down.x, mTouch_down.y); // this.postInvalidate(); } if (event.getAction() == MotionEvent.ACTION_UP) { // System.out.println("ACTION_UP mTouch.x is = "+mTouch.x+" , mTouch.y is = "+mTouch.y); // movelock = true; System.out.println(lastdis); if (canDragOver()) { startAnimation(600); // startAnimation(6000); } else { startAnimation_bak(400); } this.postInvalidate(); } // return super.onTouchEvent(event); return true; } /** * Author : hmg25 Version: 1.0 Description : ���ֱ��P1P2��ֱ��P3P4�Ľ������? */ private float calcPoints() { mTouchToCornerDis = (int) (mTouch.x - mTouch_down.x); return mTouchToCornerDis; } private void drawCurrentPageArea(Canvas canvas, Bitmap bitmap) { // if(ToNext){ // if(mTouchToCornerDis > 0){ // mTouchToCornerDis = 0; // } // }else{ // if(mTouchToCornerDis < 0){ // mTouchToCornerDis = 0; // } // } canvas.save(); canvas.drawBitmap(bitmap, mTouchToCornerDis, 0, null); canvas.restore(); } private void drawNextPageArea(Canvas canvas, Bitmap bitmap) { canvas.save(); canvas.drawBitmap(bitmap, mTouchToCornerDis+mWidth, 0, null); canvas.restore(); } private void drawPrePageArea(Canvas canvas, Bitmap bitmap) { canvas.save(); canvas.drawBitmap(bitmap, mTouchToCornerDis-mWidth, 0, null); canvas.restore(); } public void setBitmaps(Bitmap bm1, Bitmap bm2,Bitmap bm3) { mCurPageBitmap = bm1; mNextPageBitmap = bm2; mPrePageBitmap = bm3; } public void setScreen(int w, int h) { mWidth = w; mHeight = h; mMaxLength = (float) Math.hypot(mWidth, mHeight); } @Override protected void onDraw(Canvas canvas) { calcPoints(); drawCurrentPageArea(canvas, mCurPageBitmap); if(mTouchToCornerDis != 0){ if(mTouchToCornerDis > 0){ drawPrePageArea(canvas, mPrePageBitmap); }else{ drawNextPageArea(canvas, mNextPageBitmap); } } // drawShadow(canvas); } public void drawShadow(Canvas canvas) { canvas.save(); GradientDrawable mCurrentPageShadow; //test mCurrentPageShadow = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, mFrontShadowColors); mCurrentPageShadow.setBounds(0,0,100,100); mCurrentPageShadow.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; if(mTouchToCornerDis == 0){ if(ToNext){ dx = - mWidth - mTouchToCornerDis; }else{ dx = mWidth - mTouchToCornerDis; } }else if (mTouchToCornerDis > 0) { dx = mWidth - mTouchToCornerDis; }else { dx = - mWidth - mTouchToCornerDis; } dy = 0; mScroller.startScroll((int) mTouch.x, (int) mTouch.y, dx, dy, delayMillis); } private void startAnimation_bak(int delayMillis) { int dx, dy; dx = - mTouchToCornerDis; dy = 0; mScroller.startScroll((int) mTouch.x, (int) mTouch.y, dx, dy, delayMillis); } public void abortAnimation() { if (!mScroller.isFinished()) { mScroller.abortAnimation(); } } public boolean same(int a , int b){ if(a > 0){ if(b > 0){ return true; }else{ return false; } }else{ if(b < 0){ return true; }else{ return false; } } } //�޸��������ҳ������ public boolean canDragOver() { if(mTouchToCornerDis == 0 ||(Math.abs(lastdis) > 0 && same(mTouchToCornerDis,lastdis))){ return true; } return false; } public boolean DragToRight() { if (ToNext) return false; return true; } public boolean DragToNext(){ if((mTouchToCornerDis == 0 && ToNext)|| mTouchToCornerDis < 0){ return true; }else { return false; } } }