《Anroid自定义控件开发入门与实战》勘误

Posted 启舰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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)

如果我的文章对你有帮助的话,你可能更喜欢我的公众号

以上是关于《Anroid自定义控件开发入门与实战》勘误的主要内容,如果未能解决你的问题,请参考以下文章

我的新书《Android自定义控件入门与实战》出版啦

我的新书《Android自定义控件入门与实战》出版啦

《Android App开发入门与项目实战》资源下载和内容勘误

《Android App开发入门与项目实战》资源下载和内容勘误

《Android App开发入门与项目实战》资源下载和内容勘误

《Android App开发进阶与项目实战》资源下载和内容勘误