自定义控件其实很简单(笔记二)

原博客地址: 自定义控件其实很简单1/3

Matrix


乘法

Scale

Scale


旋转

根据三角函数的关系我们可以得出p(x,y)的坐标:

同样根据三角函数的关系我们也可以得出p(x0,y0)的坐标:

上述两公式结合我们则可以得出简化后的p(x,y)的坐标:

这是什么公式呢?是不是就是上面矩阵的乘积呢?囧……
绕点p(a,b)顺时针转:
其实绕某个点旋转没有想象中的那么复杂,相对于绕中心点来说就多了两步:先将坐标原点移到我们的p(a,b)处然后执行旋转最后再把坐标圆点移回去:

实践

matrix.preScale(0.5f, 1); 
matrix.setScale(1, 0.6f); 
matrix.postScale(0.7f, 1); 
matrix.preTranslate(15, 0);
  • Matrix的计算过程:translate (15, 0) -> scale (1, 0.6f) -> scale (0.7f, 1)
matrix.preScale(0.5f, 1); 
matrix.preTranslate(10, 0);
matrix.postScale(0.7f, 1);  
matrix.postTranslate(15, 0);
  • 计算过程: translate (10, 0) -> scale (0.5f, 1) -> scale (0.7f, 1) -> translate (15, 0)

Canvas Advance

原文章:[1] 自定义控件其实很简单5/12
[drawBitmapMesh](http://developer.android.com/reference/android/graphics/Canvas.html#drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint))(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)

Sample-1

float multiple = mBitmap.getWidth();
        for (int y = 0; y <= 19; y++) { //1. 把位图分为19顶点值
            float fy = mBitmap.getHeight() * y / 19;
            for (int x = 0; x <= W; x++) {
                                // fx方向的顶点值+偏移
                float fx = mBitmap.getWidth() * x / 19 + ((19 - y) * 1.0F / 19 * multiple);
                setXY(fx, fy, index);
                index += 1;
            }
        }
canvas.drawBitmapMesh(mBitmap, 19, 19, verts, 0, null, 0, null);

Sample-2

int index = 0;
float multipleY = mBitmap.getHeight() / HEIGHT;
float multipleX = mBitmap.getWidth() / WIDTH;
for (int y = 0; y <= HEIGHT; y++) {
    float fy = multipleY * y;
    for (int x = 0; x <= WIDTH; x++) {
        float fx = multipleX * x;
        setXY(fx, fy, index);
        if (5 == y) {
            if (8 == x) {
                setXY(fx - multipleX, fy - multipleY, index);
            }
            if (9 == x) {
                setXY(fx + multipleX, fy - multipleY, index);
            }
        }
        if (6 == y) {
            if (8 == x) {
                setXY(fx - multipleX, fy + multipleY, index);
            }
            if (9 == x) {
                setXY(fx + multipleX, fy + multipleY, index);
            }
        }
        index += 1;
    }
}
  • Canvas对象概略:

在framework中,Activty被创建时(更准确地说是在addView的时候)会同时创建一个叫做ViewRootImpl的对象,ViewRootImpl是个很碉堡的类,它负责很多GUI的东西,包括我们常见的窗口显示、用户的输入输出等等,同时,它也负责Window跟WMS通信(Window你可以想象是一个容器,里面包含着我们的一个Activity,而AMS呢全称为Activity Manager Service,顾名思义很好理解它的作用),当ViewRootImpl跟WMS建立通信注册了Window后就会发出第一次渲染View Hierachy的请求,涉及到的方法均在ViewRootImpl下:setView、requestLayout、scheduleTraversals等,大家有兴趣可以自己去搜罗看看,在performTraversals方法中ViewRootImpl就会去创建Surface,而此后的渲染则可以通过Surface的lockCanvas方法获取Surface的Canvas来进行,然后遍历View Hierachy把需要绘制的View通过Canvas(View.onDraw(Canvas canvas))绘制到Surface上,绘制完成后解锁(Surface.unlockCanvasAndPost)让SurfaceFlinger将Surface绘制到屏幕上。

  • Canvas分类:
  • 第一是以drawXXX为主的绘制方法,
  • 第二是以clipXXX为主的裁剪方法,
  • 第三是以scale、skew、translate和rotate组成的Canvas变换方法,
  • 最后一类则是以saveXXX和restoreXXX构成的画布锁定和还原

Rect

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

推荐阅读更多精彩内容