糖果派对官方网站_可以赌钱的糖果游戏_手机版
自定义View1-1:绘制基本功

自定义View1-1:绘制基本功

作者:操作系统    来源:未知    发布时间:2019-12-24 20:38    浏览量:

bb电子糖果派对 1

Bitmap

材质来源于:扔物线的本领分享 http://hencoder.com/

学习http://hencoder.com/ui-1-1/笔记

线上箭头表示画线的趋势。WINDING方式和ALTELX570NATE格局都会填充多个密封的L型区域,号码从1到3。五个更加小的里边区域,号码为4和5,在ALTE兰德哈弗NATE格局下不被填充。不过在WINDING情势下,号码5的区域会被填充,那是因为区域的中间达到图形的外表必得通过两条相通方向的线。号码为4的区域不会被填充,因为射线必须通过两条边框线,然则这两条边框线的绘图方向相反。

UI-1 Drawing

黄金时代、通过draw帕特h(卡塔尔绘制自定义图形

帕特h能够描述直线、叁回曲线、叁次曲线、圆、椭圆、弧形、矩形、圆角矩形。Path有两类措施,风流潇洒类是一贯描述路线的,另后生可畏类是帮助的安装或计算。

bb电子糖果派对 2bb电子糖果派对 3

自定义绘制技能点总计:

方式:重写绘制方法,当中最常用的是 onDraw(卡塔尔(英语:State of Qatar)

关键: Canvas 的使用

  1, Canvas 的绘图类措施: drawXXX(卡塔尔 (关键参数:Paint)

  2,Canvas 的扶助类方法:范围裁切(clipXXX(卡塔尔(قطر‎)和几何转换

增补:使用不一样的绘图方法来调控蒙蔽关系

二、Path方法第风流洒脱类:间接描述路线

那类方法能够划分为两组:增多子图形和画线(直线或曲线)

  1 /*-------------------------------------------
  2 ALTWIND.C -- Alternate and Winding Fill Modes
  3              (c) Charles Petzold, 1998
  4 -------------------------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  9 
 10 int WINAPI WinMain( __in HINSTANCE hInstance
 11                     , __in_opt HINSTANCE hPrevInstance
 12                     , __in LPSTR lpCmdLine
 13                     , __in int nShowCmd )
 14 {
 15     static TCHAR szAppName[] = TEXT("AltWind");
 16     HWND hwnd;
 17     MSG msg;
 18     WNDCLASS wndclass;
 19 
 20     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 21     wndclass.lpfnWndProc = WndProc;
 22     wndclass.cbClsExtra = 0;
 23     wndclass.cbWndExtra = 0;
 24     wndclass.hInstance = hInstance;
 25     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 26     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 27     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 28     wndclass.lpszMenuName = NULL;
 29     wndclass.lpszClassName = szAppName;
 30 
 31     if (!RegisterClass(&wndclass))
 32     {
 33         MessageBox(NULL, TEXT("Program requires Windows NT!")
 34             , szAppName, MB_ICONERROR);
 35         return 0;
 36     }
 37 
 38     hwnd= CreateWindow(szAppName, TEXT("Alternate and Winding Fill Modes")
 39         , WS_OVERLAPPEDWINDOW
 40         , CW_USEDEFAULT, CW_USEDEFAULT
 41         , CW_USEDEFAULT, CW_USEDEFAULT
 42         , NULL, NULL, hInstance, NULL);
 43 
 44     ShowWindow(hwnd, nShowCmd);
 45     UpdateWindow(hwnd);
 46 
 47     while (GetMessage(&msg, NULL, 0, 0))
 48     {
 49         TranslateMessage(&msg);
 50         DispatchMessage(&msg);
 51     }
 52 
 53     return msg.wParam;
 54 }
 55 
 56 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 57 {
 58     static POINT aptFigure[10] = {10, 70
 59                                 , 50, 70
 60                                 , 50, 10
 61                                 , 90, 10
 62                                 , 90, 50
 63                                 , 30, 50
 64                                 , 30, 90
 65                                 , 70, 90
 66                                 , 70, 30
 67                                 , 10, 30};
 68     static int cxClient, cyClient;
 69     HDC hdc;
 70     int i;
 71     PAINTSTRUCT ps;
 72     POINT apt[10];
 73 
 74     switch (message)
 75     {
 76     case WM_SIZE:
 77         cxClient = LOWORD(lParam);
 78         cyClient = HIWORD(lParam);
 79         return 0;
 80 
 81     case WM_PAINT:
 82         hdc = BeginPaint(hwnd, &ps);
 83         SelectObject(hdc, GetStockObject(GRAY_BRUSH));
 84 
 85         for (i = 0; i !=10; ++i)
 86         {
 87             apt[i].x = cxClient * aptFigure[i].x / 200;
 88             apt[i].y = cyClient * aptFigure[i].y / 100;
 89         }
 90         SetPolyFillMode(hdc, ALTERNATE);
 91         Polygon(hdc, apt, 10);
 92 
 93         for (i = 0; i != 10; ++i)
 94         {
 95             apt[i].x += cxClient / 2;
 96         }
 97         SetPolyFillMode(hdc, WINDING);
 98         Polygon(hdc, apt, 10);
 99 
100         EndPaint(hwnd, &ps);
101         return 0;
102 
103     case WM_DESTROY:
104         PostQuitMessage(0);
105         return 0;
106     }
107 
108     return DefWindowProc(hwnd, message, wParam, lParam);
109 }

学习进度:

1,Canvas 的 drawXXX() 种类措施及Paint最数以万计的选择;

2,Paint的晋级战术;

3,Canvas对绘制的协理——范围裁切和几何调换;

4,使用不相同的绘图方法来调节绘制顺序;


1、addXXX(卡塔尔(قطر‎:增添子图形

自定义View1-1:绘制基本功。addCircle(float x, float y, float radius, Direction dir) 添加圆

 /**
     * 
     * @param x
     * @param y
     * @param radius
     * @param dir  画圆的路径的方向
     */
addCircle(float x, float y, float radius, Direction dir) 添加圆

注:路线方向有二种:顺时针 (CW clockwise) 和逆时针 (CCW counter-clockwise卡塔尔(قطر‎。 对于普通意况,这些参数填 CW 还是填 CCW 未有影响。它只是在急需填充图形 (Paint.Style 为 FILL 或 FILL_AND_STROKE) ,并且图表现身自相交时,用于判定填充范围的。

事例:加多八个圆

path.addCircle(300, 300, 200, Path.Direction.CW);
......
canvas.drawPath(path, paint);  

Path.add-(卡塔尔其他办法

  • addOval(float left, float top, float right, float bottom, Direction dir) / addOval(RectF oval, Direction dir)加上椭圆
  • addRect(float left, float top, float right, float bottom, Direction dir) / addRect(RectF rect, Direction dir) 增多矩形
  • addRoundRect(RectF rect, float rx, float ry, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir) / addRoundRect(RectF rect, float[] radii, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir) 增多圆角矩形
  • addPath(Path path) 累计另贰个 Path

ALTWIND.C

丨一切的起首:onDraw(卡塔尔(英语:State of Qatar)

    别漏写了super.onDraw(卡塔尔(英语:State of Qatar)。

2、xxxTo(卡塔尔(قطر‎ ——画线(直线或曲线)

(1)lineTo(float x, float y) / rLineTo(float x, float y) 画直线

 /**
     * 
     * @param x  目标位置X
     * @param y  目标位置y
     */
     lineTo(float x, float y) 

日前岗位向目之处画一条直线, x 和 y 是指标地点的坐标。那多个艺术的分歧是,lineTo(x, y卡塔尔国 的参数是相对坐标,而 rLineTo(x, y卡塔尔 的参数是周旋当前地点的相对坐标 (前缀 r 指的正是relatively 「相对地」卡塔尔国。
当失业位:所谓当前岗位,即最终一回调用画 Path 的诀窍的顶峰地点。开头值为原点 (0, 0卡塔尔(英语:State of Qatar)。

paint.setStyle(Paint.Style.STROKE);
        path.lineTo(100, 100); // 由当前位置 (0, 0) 向 (100, 100) 画一条直线  
        path.rLineTo(100, 0); // 由当前位置 (100, 100) 向正右方 100 像素的位置画一条直线  
        canvas.drawPath(path, paint); 

bb电子糖果派对 4

连线

(2)quadTo(float x1, float y1, float x2, float y2卡塔尔(قطر‎ / rQuadTo(float dx1, float dy1, float dx2, float dy2卡塔尔国 画一遍贝塞尔曲线
参数:那条三回贝塞尔曲线的源点正是近年来地方,而参数中的 x1, y1 和 x2, y2 则分别是调整点和尖峰的坐标。和 rLineTo(x, y卡塔尔(قطر‎ 同理,rQuadTo(dx1, dy1, dx2, dy2卡塔尔 的参数也是相对坐标

(3)cubicTo(float x1, float y1, float x2, float y2, float x3, float y3卡塔尔(英语:State of Qatar) / rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3卡塔尔国 画二次贝塞尔曲线

(4)moveTo(float x, float y卡塔尔 / rMoveTo(float x, float y卡塔尔国移动到对象地方

paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10);
        path.lineTo(100, 100); // 画斜线  
        path.moveTo(200, 200); // 我移~~  
        path.lineTo(200, 0); // 画竖线 
        canvas.drawPath(path, paint); 

bb电子糖果派对 5

移动地方

(5)arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 画弧形
参数 forceMoveTo :绘制是要「抬一下笔移动过去」,照旧「直接拖着笔过去」,分歧在于是或不是留下移动的划痕。
addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)

(6)close(卡塔尔(英语:State of Qatar) 密闭当前子图形
效果与利益是把当前的子图形密闭,即由如今岗位向当前子图形的起源绘制一条直线。

paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10);
        path.moveTo(100, 100);
        path.lineTo(200, 100);
        path.lineTo(150, 150);
        path.close();
        canvas.drawPath(path, paint);

bb电子糖果派对 6

1.png

bb电子糖果派对 7

2.png

当必要填写,无需close(卡塔尔 。Paint.Style 为 FILL 或 FILL_AND_STROKE,Path 会自动密闭子图形。

 paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(10);
        path.moveTo(100, 100);
        path.lineTo(200, 100);
        path.lineTo(150, 150);
        canvas.drawPath(path, paint); 

bb电子糖果派对 8

填充

图片的坐标(按二个100*100单位的区域设定)存款和储蓄在aptFigure数组中。这么些坐标会依照顾客去的增长幅度和冲天按百分比缩放。程序突显五个图形,二个接纳ALTE劲客NATE填充形式,另一个用到WINDING填充情势。结果如图:

丨Canvas.drawXXX() 和 Paint 基础

    Paint.setStyle(Style style卡塔尔(قطر‎设置绘制情势(卡塔尔(英语:State of Qatar):Paint.style.FILL、STROKE、FILL_AND_STROKE

    Paint.setColor(int color卡塔尔设置颜色

    Paint.setStrokeWidth(float width卡塔尔(قطر‎设置线条宽度

    Paint.setTextSize(float textSize卡塔尔(قطر‎设置文字大小

    Paint.setAntiAlias(boolean aa卡塔尔国设置抗锯齿按键        能够在创建时Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);


三、Path方法第二类:协助的设置或总计

1.Path.setFillType(Path.FillType ft卡塔尔国 设置填充格局
在二.1画圆中,参数 Direction dir提到, Path.setFillType(fillType卡塔尔国是用来设置图形自相交时的填充算法的,分化的FillType值,有例外的填写效果。FillType的七种取值:

  • EVEN_ODD
  • WINDING (默认值)
  • INVERSE_bb电子糖果派对,EVEN_ODD
  • INVERSE_WINDING

(1)EVEN_ODD
即 even-odd rule (奇偶原则):对于平面中的放肆一点,向自由方向射出一条射线,这条射线和图表相交的次数(相交才算,相切不算哦)假使是奇数,则这么些点被以为在图纸内部,是要被涂色的区域;要是是偶数,则那一个点被认为在图纸外部,是不被涂色的区域。射线每穿过图形中的一条线,内外状态就时有发生二次切换,那正是怎么 EVEN_ODD 是一个「交叉填充」的方式。
(2)WINDING
non-zero winding rule (非零环绕数原则),首先,它供给您图形中的所有线条都以有绘制方向的:以 0 为早先值,顺时针+1,逆时针-1。结果不为0,则在图纸内部,涂色;结果为0,则在图片外界,不被涂色。
(3)INVERSE_EVEN_ODD和 INVERSE_WINDING
与前八个相反

bb电子糖果派对 9

Canvas.drawColor()、Canvas.drawRGB()、Canvas.drawARGB():

效能整个绘制区域,用于绘制先前时代设置背景底色或绘制早先时期设置蒙板;


drawCircle(float centerX, float centerY, float radius, Paint paint):

xy设置圆心,以view的左极点为坐标系原点,radius设置半径;

在乎:Paint能做的开始的一段时期交给Paint去做,drawXXX方法参数尽量只含有特有的性情如圆心半径;


友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有