《Anroid自定義控件開發入門與實戰》勘誤

對於讀者回饋的錯誤之處,加以正更,感謝大家的支持

如果大家發現哪裏有錯誤,請在留言中反饋,反饋時請標註第幾節,哪一頁,以方便我定位,非常感謝。

本書資源及第一章、第一章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)

如果我的文章對你有幫助的話,你可能更喜歡我的公衆號
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章