自從之前發布了《Android 實現書籍翻頁效果----完結篇 》之後,收到了很多朋友給我留言,前段時間由於事情較多,部落格寫得太匆忙很多細節地方沒有描述清楚。所以不少人對其中的地方有不少不明白之處,也有不少人對其中出現的Bug進行了反饋。今天終於找出了段時間對這段時間的一些問題做個簡單的總結。
之前給出的例子只是能使書籍進行簡單的拖拽,沒有實現翻頁的動畫效果,很多人希望我能加上這一個,所以首先我們就來說說這個翻頁的動畫。
其實翻頁的動畫很容易實現,只要在Touch抬起後不斷的重新整理mTouch.x , mTouch.y 的值就行了, 你可以使用handler,thread,也可以使用Scroller,我個人比較喜歡Scroller,這個比較簡單。
新添兩個函數:
private void startAnimation(int delayMillis) {<br />int dx, dy;<br />// dx 水平方向滑動的距離,負值會使滾動向左滾動<br />// dy 垂直方向滑動的距離,負值會使滾動向上滾動<br />if (mCornerX > 0) {<br />dx = -(int) (mWidth + mTouch.x);<br />} else {<br />dx = (int) (mWidth - mTouch.x + mWidth);<br />}<br />if (mCornerY > 0) {<br />dy = (int) (mHeight - mTouch.y);<br />} else {<br />dy = (int) (1 - mTouch.y); // 防止mTouch.y最終變為0<br />}<br />mScroller.startScroll((int) mTouch.x, (int) mTouch.y, dx, dy,<br />delayMillis);<br />}</p><p>public void computeScroll() {<br />super.computeScroll();<br />if (mScroller.computeScrollOffset()) {<br />float x = mScroller.getCurrX();<br />float y = mScroller.getCurrY();<br />mTouch.x = x;<br />mTouch.y = y;<br />postInvalidate();<br />}<br />}
接著在按下抬起時調用就行了
if (event.getAction() == MotionEvent.ACTION_UP) {
if (canDragOver()) { //判斷是否可以翻頁
startAnimation(1200);
} else {
mTouch.x = mCornerX - 0.09f; //如果不能翻頁就讓mTouch返回沒有靜止時的狀態
mTouch.y = mCornerY - 0.09f; // - 0.09f是防止mTouch = 800 或mTouch= 0 要不在這些值時會出現BUG
}
還需要修改的地方是calcPoints() 這個函數,之前為了防止一個bug出現,添加了if (mBezierStart1.x < 0 || mBezierStart1.x > mWidth) {這個判斷,但是在翻頁動畫時mTouch.x會小於0(從右向左翻時)或者mTouch.x>mWidth(從左往右)這時並不需要在進入這個函數進行處理,所以要在這個情況時將其屏蔽,改為:
if (mTouch.x > 0 && mTouch.x < mWidth) {
if (mBezierStart1.x < 0 || mBezierStart1.x > mWidth) {
……}
}
經過上邊的修改就可以完成動畫效果了。
還有的童鞋想將這個做成一個電子書閱讀器,但是不知道如何將txt中的內容轉換為翻頁所需的圖片,並在翻頁後進行切換。所以我新添加了一個簡單的類BookPageFactory,用來讀取SD卡中的一個txt,並將讀取的內容轉換為一個bitmap用於顯示。哈哈,這個只是一個功能很小的類,只是給大家做個示範,起到拋磚引玉的作用。大家請根據自己所需的功能酌情修改。
源碼附帶的是一個簡單的帶翻頁動畫的電子書閱讀器,大家測試時請將test.txt放於SD卡根目錄下:
pagefactory.openbook("/sdcard/test.txt");
新的介面:
源碼:
http://download.csdn.net/source/3278901