对于读者回馈的错误之处,加以正更,感谢大家的支持
如果大家发现哪里有错误,请在留言中反馈,反馈时请标注第几节,哪一页,以方便我定位,非常感谢。
本书资源及第一章、第一章PDF下载地址:https://github.com/harvic/AndroidCustomCtrlRes
整个页面的结论都有问题。
AnimatorSet 真正激活延时 = AnimatorSet.startDelay + 第一个动画.startDelay;
应该改为:
AnimatorSet 真正激活延时 = AnimatorSet.startDelay;
原因:
在Android 6、7、8、9平台上运行,该问题都已经被修复了,AnimatorSet的延时,只跟它自己设置的startDelay有关,不再跟具体的动画有关。
致谢:Renext(QQ)
原文:
4、存在的问题
至此,这个路径动画就讲解完了,但如果多使用几次会发现,这里的动画存在问题:………………(略)
更正:
这里所讲的问题,已经在Android 6及以上API修正了,对于Android 6以上的版本,已经可以直接使用缩小到0的代码。(由于手上没有Android 5的机器,至于Android 5是否修复,只能靠大家自己尝试下,确认以后,辛苦回复我更正哈);
致谢:Renext(QQ)
原文:
删除控件:
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)
原文:
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)
原文:
比如,上一个终点坐标是(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)
原文: 很多读者一旦需要画布,就会创建一个全屏幕大小的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)
原文:
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)