自定义控件相关概念

来源:互联网 发布:最全双色球缩水软件 编辑:程序博客网 时间:2024/06/06 04:05

1.

画笔:Paint   画布: Canvas画笔样式分三种:      * 1.Paint.Style.STROKE:描边      * 2.Paint.Style.FILL_AND_STROKE:描边并填充      * 3.Paint.Style.FILL:填充 mPaint.setStyle(Paint.Style.STROKE);// 实例化画笔并打开抗锯齿  mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  或 setAntiAlias(true)invalidate 和postInvalidate  invalidate作用在主线程  主线程中不能更新UIpostInvalidate作用在其他线程,可以更新UI;所有自定义View中不需要handler去更新UI

2.

ColorFilter三个子类(    ColorMatrixColorFilter,    LightingColorFilter,    PorterDuffColorFilter)ColorMatrixColorFilter:色彩矩阵颜色过滤器    ColorMatrix colorMatrix = new ColorMatrix(new float[]{          1, 0, 0, 0, 0,          0, 1, 0, 0, 0,          0, 0, 1, 0, 0,          0, 0, 0, 1, 0,      });      第一行表示红色的向量  第二行表示绿色的向量 第三行蓝色  第四行 透明度的向量LightingColorFilter:光照颜色过滤    mPaint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0X00FFFF00));  PorterDuffColorFilter:    PorterDuffColorFilter(int color, PorterDuff.Mode mode)      // 设置颜色过滤      mPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.DARKEN));  Xfermode三个子类(    AvoidXfermode,     PixelXorXfermode,    PorterDuffXfermode)AvoidXfermode:首先我要告诉大家的是这个API因为不支持硬件加速在API 16已经过时了,如果想在高于API 16的机子上测试这玩意,              必须现在应用或手机设置中关闭硬件加速,在应用中我们可以通过在AndroidManifest.xml文件中              设置application节点下的android:hardwareAccelerated属性为false来关闭硬件加速:AvoidXfermode只有一个含参的构造方法AvoidXfermode(int opColor, int tolerance, AvoidXfermode.Mode mode)    第一个opColor表示一个16进制的可以带透明通道的颜色值例如0x12345678,第二个参数tolerance表示容差值    最后一个参数表示AvoidXfermode的具体模式,其可选值只有两个:AvoidXfermode.Mode.AVOID或者AvoidXfermode.Mode.TARGETPixelXorXfermode:    构造方法:PixelXorXfermode(int opColor)PorterDuffXfermode:图形混合模式    构造方法:PorterDuffXfermode(PorterDuff.Mode mode)    PorterDuff.Mode.ADD:饱和相加    PorterDuff.Mode.CLEAR:清除    PorterDuff.Mode.DARKEN:变暗    PorterDuff.Mode.DST:只绘制目标图像    PorterDuff.Mode.DST_ATOP:在源图像和目标图像相交的地方绘制目标图像而在不相交的地方绘制源图像    PorterDuff.Mode.DST_IN:只在源图像和目标图像相交的地方绘制目标图像    PorterDuff.Mode.DST_OUT:只在源图像和目标图像不相交的地方绘制目标图像    PorterDuff.Mode.DST_OVER:在源图像的上方绘制目标图像    PorterDuff.Mode.LIGHTEN:变亮    PorterDuff.Mode.MULTIPLY:正片叠底    PorterDuff.Mode.OVERLAY:叠加    PorterDuff.Mode.SCREEN:滤色    PorterDuff.Mode.SRC:显示源图    PorterDuff.Mode.SRC_ATOP:在源图像和目标图像相交的地方绘制源图像,在不相交的地方绘制目标图像    PorterDuff.Mode.SRC_IN:只在源图像和目标图像相交的地方绘制源图像    PorterDuff.Mode.SRC_OUT:只在源图像和目标图像不相交的地方绘制源图像    PorterDuff.Mode.SRC_OVER:在目标图像的顶部绘制源图像    PorterDuff.Mode.XOR:在源图像和目标图像重叠之外的任何地方绘制他们,而在不重叠的地方不绘制任何内容    /*      * 将绘制操作保存到新的图层(更官方的说法应该是离屏缓存)我们将在1/3中学习到Canvas的全部用法这里就先follow me      */      int sc = canvas.saveLayer(0, 0, screenW, screenH, null, Canvas.ALL_SAVE_FLAG);      // 先绘制dis目标图      canvas.drawBitmap(bitmapDis, x, y, mPaint);      // 设置混合模式      mPaint.setXfermode(porterDuffXfermode);      // 再绘制src源图      canvas.drawBitmap(bitmapSrc, x, y, mPaint);      // 还原混合模式      mPaint.setXfermode(null);      // 还原画布      canvas.restoreToCount(sc);  

3.
FontMetrics:字体测量
包含top,ascent,descent,bottom,leading五个参数
首先我们要知道Baseline基线,在Android中,文字的绘制都是从Baseline处开始的,
Baseline往上至字符最高处的距离我们称之为ascent(上坡度),
Baseline往下至字符最底处的距离我们称之为descent(下坡度),
而leading(行间距)则表示上一行字符的descent到该行字符的ascent之间的距离
在TextView中我们可以通过xml设置其属性android:includeFontPadding=”false”去掉一定的边距值但是不能完全去掉

在正常情况下Android绘制文本是不能识别换行符之类的标识符的,这时候如果我们想实现换行绘制就得另辟途径使用StaticLayout结合TextPaint实现换行,StaticLayout是android.text.Layout的一个子类,很明显它也是为文本处理量身定做的,其内部实现了文本绘制换行的处理Font一些常用方法:    breakText():这个方法让我们设置一个最大宽度在不超过这个宽度的范围内返回实际测量值否则停止测量    getFontMetrics (Paint.FontMetrics metrics):getFontMetrics()返回的是FontMetrics对象而                                               getFontMetrics(Paint.FontMetrics metrics)返回的是文本的     getFontMetricsInt():该方法返回了一个FontMetricsInt对象,FontMetricsInt和FontMetrics是一样的,只不过FontMetricsInt返回的是int而FontMetrics返回的是float    getFontSpacing():返回字符行间距    setUnderlineText(boolean underlineText):设置下划线    setTypeface(Typeface typeface):设置字体类型    // 获取字体并设置画笔字体      Typeface typeface = Typeface.createFromAsset(context.getAssets(), "kt.ttf");      textPaint.setTypeface(typeface);    setTextScaleX (float scaleX):将文本沿X轴水平缩放,默认值为1,当值大于1会沿X轴水平放大文本,当值小于1会沿X轴水平缩放文本    setTextAlign (Paint.Align align):设置文本对齐方式    setStrikeThruText (boolean strikeThruText):文本删除线    setFakeBoldText (boolean fakeBoldText):设置文本仿粗体    measureText():测量文本宽度    setMaskFilter(MaskFilter maskfilter)MaskFilter类中没有任何实现方法,而它有两个子类BlurMaskFilter和EmbossMaskFilter,前者为模糊遮罩滤镜(比起称之为过滤器哥更喜欢称之为滤镜)而后者为浮雕遮罩滤镜    // 设置画笔遮罩滤镜      mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.SOLID));  BlurMaskFilter:EmbossMaskFilter:    setRasterizer (Rasterizer rasterizer):设置光栅    setPathEffect(PathEffect effect):    PathEffect:路径效果        六个子类(        CornerPathEffect:将路径的转角变得圆滑        DiscretePathEffect:离散路径效果相对来说则稍微复杂点,其会在路径上绘制很多“杂点”的突出来模拟一种类似生锈铁丝的效果        DashPathEffect:包含了两个参数,但是第一个参数是一个浮点型的数组,第二个参数我称之为偏移值        PathDashPathEffect:可以让我们自己定义路径虚线的样式        ComposePathEffect:ComposePathEffect(PathEffect outerpe, PathEffect innerpe)会先将路径变成innerpe的效果,再去复合outerpe的路径效果        SumPathEffect:则会把两种路径效果加起来再作用于路径        )setShadowLayer(float radius, float dx, float dy, int shadowColor)该方法为我们绘制的图形添加一个阴影层效果:

4.
setShader(Shader shader)
Shader:
BitmapShader:bitmap着色器
BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
Shader.TileMode{CLAMP,REPETA,MIRROR}
LinearGradient:线性渐变
SweepGradient:梯度渐变
RadialGradient:径向渐变
mShaderPaint.setShader(new RadialGradient(screenW / 2, screenH / 2, mBitmap.getHeight() * 7 / 8, Color.TRANSPARENT, Color.BLACK, Shader.TileMode.CLAMP));
ComposeShader:组合Shader

    // 新建图层      int sc = canvas.saveLayer(x, y, x + mBitmap.getWidth(), y + mBitmap.getHeight(), null, Canvas.ALL_SAVE_FLAG);      // 绘制混合颜色      canvas.drawColor(0xcc1c093e);      // 设置混合模式      mBitmapPaint.setXfermode(mXfermode);      // 绘制位图      canvas.drawBitmap(mBitmap, x, y, mBitmapPaint);      // 还原混合模式      mBitmapPaint.setXfermode(null);      // 还原画布      canvas.restoreToCount(sc);  Matrix:矩阵变换

5.
Canvas: 画布
方法:drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)
drawBitmapMesh是个很屌毛的方法,为什么这样说呢?因为它可以对Bitmap做几乎任何改变
Canvas所提供的各种方法根据功能来看大致可以分为几类,第一是以drawXXX为主的绘制方法,第二是以clipXXX为主的裁剪方法,
第三是以scale、skew、translate和rotate组成的Canvas变换方法,最后一类则是以saveXXX和restoreXXX构成的画布锁定和还原,还有一些渣渣方法就不归类了。

clipRect(int left, int top, int right, int bottom)  clipRect(Rect rect)  clipRect(RectF rectF)Rect :      mRect = new Rect(0, 0, 500, 500);       mRect.intersect(250, 250, 750, 750);      其实intersect的作用跟我们之前学到的图形混合模式有点类似,它会取两个区域的相交区域作为最终区域,    上面我们的第一个区域是在实例化Rect时确定的(0, 0, 500, 500),第二个区域是调用intersect方法时指定的(250, 250, 750, 750),    这两个区域对应上图的两个黄色线框,两者相交的地方则为最终的红色区域,而intersect方法的计算方式是相当有趣的,    它不是单纯地计算相交而是去计算相交区域最近的左上端点和最近的右下端点,不知道大家是否明白这个意思,    我们来看Rect中的另一个union方法你就会懂,union方法与intersect相反,取的是相交区域最远的左上端点作为新区域的左上端点,    取最远的右下端点作为新区域的右下端点Path:    lineTo(float x, float y):将路径连接至某个坐标点    当我们没有移动Path的点时,其默认的起点为画布的[0,0]点    moveTo(float x, float y):改变起始点的位置

6.
save()和saveLayer():saveLayerXXX方法会将所有的操作存到一个新的Bitmap中而不影响当前Canvas的Bitmap
而save()方法则是在当前的Bitmap中进行操作,并且只能针对Bitmap的形变和裁剪进行操作,saveLayerXXX方法则无所不能
translate(float dx, float dy)方法平移画布
scale(float sx, float sy)缩放也很好理解,但是它有一个重载方法scale(float sx, float sy, float px, float py),
后两个参数用于指定缩放的中心点,前两个参数用于指定横纵向的缩放比率值在0-1之间为缩小
skew(float sx, float sy)错切方法:两个参数与scale类似表示横纵向的错切比率

requestLayout():方法的意义在于如果你的操作有可能会让控件的尺寸大小或位置发生改变那么就可以调用该方法请求布局,调用该方法后framework会尝试调用measure对控件重新测量
0 0
原创粉丝点击