美文网首页
自定义控件相关

自定义控件相关

作者: 霁逸lei | 来源:发表于2020-09-22 16:42 被阅读0次
    • 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:内部加粗,外部模糊
    image.png
            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;
    image.png
            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);
    

    相关文章

      网友评论

          本文标题:自定义控件相关

          本文链接:https://www.haomeiwen.com/subject/ejhxsktx.html