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

自定义控件相关

作者: 霁逸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);

相关文章

  • Android自定义控件(一,基本原理)

    自定义控件相关目录: Android自定义控件(一,基本原理) Android自定义控件(二,自定义属性) And...

  • Android自定义控件(二,自定义属性)

    自定义控件相关目录: 前言 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定...

  • AndroidStudio 3.0 New Features

    1.自定义控件在布局文件中使用时,preview 视窗能够根据你对自定义控件中相关代码的修改自动调整 previe...

  • 组合控件2——海贼王选项菜单

    之前的自定义控件——初识自定义控件,我们了解到了自定义控件分为三种,自制控件,组合控件,拓展控件。而我们在自制控件...

  • Flutter 学习记录--虚线控件

    工作中需要用到虚线控件,Flutter官方没有相关的控件,自定义一个支持横向和竖向的虚线控件, direction...

  • 自定义控件相关

    提示框https://www.jianshu.com/p/85edffe95d2a UIAlertView、UIA...

  • 自定义控件相关

    getMeasuredWidth()与getWidth()趁热打铁,就这个例子,我们讲一个很容易出错的问题:get...

  • 自制控件3——仿qq侧滑删除

    在自定义控件——初识自定义控件里面,我们已经对自定义控件进行描述和分类。其分类分别是 自制控件 组合控件 拓展控件...

  • 自制控件2 —— 自制控件 仿qq侧滑菜单

    在自定义控件——初识自定义控件里面,我们已经对自定义控件进行描述和分类。其分类分别是 自制控件 组合控件 拓展控件...

  • 组合控件1—— 设置框

    之前的自定义控件——初识自定义控件,我们了解到了自定义控件分为三种,自制控件,组合控件,拓展控件。 而我们在自制控...

网友评论

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

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