Android自定义View相关Api

自定义View

对自定义View一直很模糊,刚好最近不太忙,系统性的总结一下。自定义View主要有以下几个知识点:

  • Canvas:可以它为一个画布,用于承载View中的所有元素(基础)
  • Paint:作为画笔的存在,用来加特效的(基础)
  • 裁切和几何变换:通过限定在某些区域绘制以及对view进行变换达到指定效果(进阶)

Canvas

  • 可以通过drawXxx()方法画出下列简单图形:

    • drawCircle():圆
    • drawPoint():点
    • drawLine():线
    • drawLines():多条线
    • drawRect():长方形
    • drawArc():弧
    • drawOwal():椭圆
    • drawRoundRect():圆角矩形
  • 通过drawPath()画出复杂的图形

  • 通过drawBitmap()画图片

  • 通过drawText()画图片

Paint

  • setColor():设置颜色

  • setShader(Shader shader):设置着色器,Shader有以下几种子类:

    • LinearGradient 线性渐变,两个点之间的颜色线性渐变

      Shader.TileMode,着色规则有三种,CLAMP、MIRROR、REPEAT,以下同。
      
    • RadialGradient 辐射渐变,从圆心向四周进行辐射渐变

    • SweepGradient 扫描渐变,从圆的0角度,旋转进行扫描渐变

    • BitmapShader 图片着色器,将图片作为着色器,比如可以用来做圆型头像的裁剪

    • ComposeShader 混合着色器,一个Paint中使用两个着色器,混合用

      PorterDuff.Mode,是用来指定两个着色器公共绘制时的颜色策略,是一个enum,共17个。
      大体分为两类,Alpha 合成 (Alpha Compositing)、混合 (Blending)

  • setColorFilter(ColorFilter colorFilter):为绘制设置颜色的过滤。可用于制作滤镜效果。ColorFilter有三个子类:

    • LightingColorFilter,用来模拟简单的光照效果。
    • PorterDuffColorFilter,使用一个指定的颜色和一种指定的 PorterDuff.Mode 来与绘制对象进行合成。
    • ColorMatrixColorFilter,使用一个 ColorMatrix 来对颜色进行处理,是一个4*5的矩阵(有点厉害,不知道怎么用),StyleImageView
  • setXfermode(Xfermode xfermode),只有一个子类PorterDuffXfermode

  • setAntiAlias (boolean aa) 设置抗锯齿

  • setStyle(Paint.Style style)

  • setStrokeWidth(float width)

  • setStrokeCap(Paint.Cap cap)

  • setStrokeJoin(Paint.Join join)

  • setStrokeMiter(float miter)

  • setDither(boolean dither)

  • setFilterBitmap(boolean filter)设置是否使用双线性过滤来绘制 Bitmap 。

  • setPathEffect(PathEffect effect):PathEffect 分为两类,单一效果的 CornerPathEffect DiscretePathEffect DashPathEffect PathDashPathEffect ,和组合效果的 SumPathEffect ComposePathEffect。

  • setShadowLayer(float radius, float dx, float dy, int shadowColor)

  • setMaskFilter(MaskFilter maskfilter)

  • setTextSize()等

范围裁切和自由变换

  • 范围裁切

    使用canvas的clipRect()和clipPath(),这两个方法进行裁切,注意使用Canvas.save()和Canvas.restore()保存和恢复Canvas的状态

  • 自由变换

    • 使用 Canvas 来做常见的二维变换;

      Canvas.translate(float dx, float dy) 平移
      Canvas.rotate(float degrees, float px, float py) 旋转
      Canvas.scale(float sx, float sy, float px, float py) 放缩
      Canvas.skew(float sx, float sy) 错切

    • 使用 Matrix 来做常见和不常见的二维变换;

      1.创建 Matrix 对象;
      2.调用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法来设置几何变换;
      3.使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 来把几何变换应用到 Canvas。
      4.Matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 用点对点映射的方式设置变换

    • 使用 Camera 来做三维变换。 Camera 的三维变换有三类:旋转、平移、移动相机。注意使用Camera的sava()、restore()、reset()等方法,大致与Canvas的类似

      1.旋转:Camera.rotateX(),Camera.rotateY(),Camera.rotateZ(),Camera.rotate() 三维旋转;注意Camera的旋转中心,一般的需要配合Canvas的translate(),将旋转中心切换为远点进行旋转;然后用camera.applyToCanvas(canvas); // 把旋转投影到 Canvas
      2.平移:Camera.translate(float x, float y, float z)
      3.移动相机:Camera.setLocation(x, y, z) 设置虚拟相机的位置,注意这个方法它的参数的单位不是像素,而是 inch,英寸

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342