對於讀者回饋的錯誤之處,加以正更,感謝大家的支持
如果大家發現哪裏有錯誤,請在留言中反饋,反饋時請標註第幾節,哪一頁,以方便我定位,非常感謝。
本書資源及第一章、第一章PDF下載地址:https://github.com/harvic/AndroidCustomCtrlRes
第三章
3.5.4 常用函數
P125
整個頁面的結論都有問題。
AnimatorSet 真正激活延時 = AnimatorSet.startDelay + 第一個動畫.startDelay;
應該改爲:
AnimatorSet 真正激活延時 = AnimatorSet.startDelay;
原因:
在Android 6、7、8、9平臺上運行,該問題都已經被修復了,AnimatorSet的延時,只跟它自己設置的startDelay有關,不再跟具體的動畫有關。
致謝:Renext(QQ)
3.5.5 示例:路徑動畫
P131
原文:
4、存在的問題
至此,這個路徑動畫就講解完了,但如果多使用幾次會發現,這裏的動畫存在問題:………………(略)
更正:
這裏所講的問題,已經在Android 6及以上API修正了,對於Android 6以上的版本,已經可以直接使用縮小到0的代碼。(由於手上沒有Android 5的機器,至於Android 5是否修復,只能靠大家自己嘗試下,確認以後,辛苦回覆我更正哈);
致謝:Renext(QQ)
第四章
4.3.1 animateLayoutChanges屬性
P156:
原文:
刪除控件:
private void removeButtonView() {
if ( i > 0) {
linearLayoutContainer.removeViewAt(0);
}
i -- ;
}
更正:
刪除控件:
private void removeButtonView() {
if ( i > 0) {
linearLayoutContainer.removeViewAt(0);
i -- ;
}
}
原因:當i–,放在if語句中。因爲只有在移除控件的時候纔會減一,而且 i 表示的是當前控件的個數,最小也只能是0,不能是負數。
致謝:Messi小澤兒(CSDN)
4.4.2 NineOldAndroids中的ViewHelper
P165:
原文:
Needs_Proxy是一個靜態常量,在程序初始化的時候被賦值,噹噹前手機API等級大於等於11時被賦值爲true,否則被賦值爲false。賦值語句如下:
public static final boolean NEEDS_PROXY = Interger.valueOf(Build.VERSION.SDK).intValue() < Build.VERSION_CODES.HONEYCOMB;
這條語句用於判斷當前SDK版本是否在API 11以下。如果當前API版本小於11,則NEEDS_PROXY爲false;否則爲true。
更正:
Needs_Proxy是一個靜態常量,在程序初始化的時候被賦值,噹噹前手機API等級小於11時被賦值爲true,否則被賦值爲false。
賦值語句如下:
public static final boolean NEEDS_PROXY = Interger.valueOf(Build.VERSION.SDK).intValue() < Build.VERSION_CODES.HONEYCOMB;
這條語句用於判斷當前SDK版本是否在API 11以下。如果當前API版本小於11,則NEEDS_PROXY爲true;否則爲false。
原因:筆誤,根據NEEDS_PROXY的賦值代碼,可以得知,在小於11時,NEEDS_PROXY爲true。
感謝:Renext(QQ)
第七章
7.1.3 貝濟埃曲線之rQuadTo
P234:
原文:
比如,上一個終點座標是(300,400),那麼利用rQuadTo(100,-100,200,100);得到的控制點座標是(300+100,400-100),即(500,300);同樣,得到的終點座標是(300+200,400+100),即(500,500)
比如,利用quadTo()函數定義一個絕對座標:
path.moveTo(300,400)
path.quadTo(500,300,500,500)
與下面利用rQuadTo()函數定義相對座標是等價的:
path.moveTo(300,400)
path.rQuadTo(100,-100,200,100)
修正:
比如,上一個終點座標是(300,400),那麼利用rQuadTo(100,-100,200,100);得到的控制點座標是(300+100,400-100),即(400,300)
;同樣,得到的終點座標是(300+200,400+100),即(500,500)
比如,利用quadTo()函數定義一個絕對座標:
path.moveTo(300,400)
path.quadTo(500,300,500,500)
與下面利用rQuadTo()函數定義相對座標是等價的:
path.moveTo(300,400)
path.rQuadTo(200,-100,200,100)
原因:筆誤,在計算時,計算錯了……
感謝:柚子(QQ)
第十章:
10.2.1 (P362)
原文: 很多讀者一旦需要畫布,就會創建一個全屏幕大小的Bitmap作爲畫布。我們現在就來算一下在一個分辨率是1024像素*768像素的屏幕上,創建一個與屏幕同樣大小的Bitmap,到底需要多少內存?也就是說,這個屏幕長度上有1024個像素,寬度上768個像素。我們假設每個像素使用ARGB_8888格式來存儲,也就是一個像素佔32位,那麼要全屏顯示這張圖片所佔的內存大小=1024*768*32B=24MB
更正:我們假設每個像素使用ARGB_8888格式來存儲,也就是一個像素佔32位,即4字節(4B),那麼要全屏顯示這張圖片所佔的內存大小=1024*768*4B=3MB
原因:在P361頁有寫,對於ARGB_8888格式而言,一個像素點佔32位,即4字節(4B),所以1024768個像素點的大小應該是1024768*4B=3MB
致謝:冷`雅熙(QQ)、小王子(VIVO)
10.2.3
P372:
原文:
public static int calSampleSize(BitmapFactory.Options options,int dstWidth,int dstHeight){
int rawWidth = options.outWidth;
int rawHeight = options.outHeight;
int inSampleSize = 1;
if(rawWidth > dstWidth || rawHeight > dstHeight){
float ratioHeight = (float)rawHeight/dstHeight;
float ratioWidth = (float)rawWidth/dstHeight;
inSampleSize = (int)Math.min(ratioWidth,ratioHeight);
}
return inSampleSize;
}
修正:
public static int calSampleSize(BitmapFactory.Options options,int dstWidth,int dstHeight){
int rawWidth = options.outWidth;
int rawHeight = options.outHeight;
int inSampleSize = 1;
if(rawWidth > dstWidth || rawHeight > dstHeight){
float ratioHeight = (float)rawHeight/dstHeight;
float ratioWidth = (float)rawWidth/dstWidth
;
inSampleSize = (int)Math.min(ratioWidth,ratioHeight);
}
return inSampleSize;
}
原因:筆誤,計算寬度的縮放係數,應當是兩個寬度相比。
致謝:柚子(QQ)
如果我的文章對你有幫助的話,你可能更喜歡我的公衆號