- getMeasuredWidth()与getWidth()
趁热打铁,就这个例子,我们讲一个很容易出错的问题:getMeasuredWidth()与getWidth()的区别。他们的值大部分时间都是相同的,但意义确是根本不一样的,我们就来简单分析一下。
区别主要体现在下面几点: - 首先getMeasureWidth()方法在measure()过程结束后就可以获取到了,而getWidth()方法要在layout()过程结束后才能获取到。
- getMeasureWidth()方法中的值是通过setMeasuredDimension()方法来进行设置的,而getWidth()方法中的值则是通过layout(left,top,right,bottom)方法设置的。
还记得吗,我们前面讲过,setMeasuredDimension()提供的测量结果只是为布局提供建议,最终的取用与否要看layout()函数。
1.View
构造->onMeasure->onSizeChanged(此处已计算出控件宽高)->onLayout->onDrow
image.png
2.处理边缘发光的圆形(外边缘发光、内边缘发光)
- 2.1BlurMaskFilter(模糊),可用于模拟外发光
- BlurMaskFilter(float radius, Blur style) radius:指定模糊边缘的半径;style:指定模糊的风格:
- BlurMaskFilter.Blur.NORMAL:内外模糊
- BlurMaskFilter.Blur.OUTER:外部模糊
- BlurMaskFilter.Blur.INNER:内部模糊
- BlurMaskFilter.Blur.SOLID:内部加粗,外部模糊
Paint mPaintCirlcle = new Paint();
setLayerType(LAYER_TYPE_SOFTWARE,null);
mPaintCirlcle.setAntiAlias(true);
mPaintCirlcle.setColor(Color.LTGRAY);
BlurMaskFilter maskfilterOuter = new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER);
BlurMaskFilter maskfilterSolid = new BlurMaskFilter(20, BlurMaskFilter.Blur.SOLID);
mPaintCirlcle.setMaskFilter(maskfilterOuter);
//绘制外部模糊,只显示模糊部分中间部分不显示,模拟外发光
canvas.drawCircle(getWidth()/2,getWidth()/2,getWidth()/2-10,mPaintCirlcle);
mPaintCirlcle.setMaskFilter(maskfilterSolid);
//绘制外部模糊,内部正常显示
canvas.drawCircle(getWidth()/2,getHeight()-getWidth()/2,getWidth()/2-10,mPaintCirlcle);
- 2.2RadialGradient
RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)- int[] colors:表示所需要的渐变颜色数组
- float[] stops:表示每个渐变颜色所在的位置百分点,取值0-1,数量必须与colors数组保持一致,不然直接crash,一般第一个数值取0,最后一个数值取1;
Paint mPaintCirlcle = new Paint();
setLayerType(LAYER_TYPE_SOFTWARE,null);
mPaintCirlcle.setAntiAlias(true);
int[] colors = {0x33FFFFFF,0x33FFFFFF,0x88FFFFFF};
float[] stops = {0,24/30f,1};
canvas.drawColor(Color.LTGRAY);
RadialGradient radialGradient = new RadialGradient(getWidth() / 2, getWidth() / 2, getHeight() / 2, colors, stops, Shader.TileMode.CLAMP);
mPaintCirlcle.setShader(radialGradient);
canvas.drawCircle(getWidth()/2,getWidth()/2,getHeight()/2,mPaintCirlcle);
3.处理显示范围PorterDuffXfermode
image.png
canvas.drawColor(Color.LTGRAY);
bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
bitmapCanvas = new Canvas(bitmap);//该画布为bitmap的
Paint mPaintRect = new Paint();
mPaintRect.setAntiAlias(true);
mPaintRect.setColor(Color.GRAY);
PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
mPaintRect.setXfermode(mode);
canvas.drawBitmap(bitmap, 0, 0, mPaint);
bitmapCanvas.drawCircle(getWidth() / 2, getHeight() / 2, getHeight() / 2, mPaintCirlcle);
bitmapCanvas.drawRect(0, 0, getWidth() / 2, getHeight() / 2, mPaintRect);
网友评论