ios开发图形绘制
為什么80%的碼農都做不了架構師?>>> ??
????引入了Core Graphices框架功能,演示如何畫線條,文本,改變線條的額粗細,顏色,以及保存和恢復圖形上下文。
要在一個視圖中進行自定義繪制,我們必須首先獲得當前圖形上下文。圖形上下文(CGContext)是一個繪圖畫布,它存放繪圖信息,如顏色,線條寬度和字體。在調用drawRect:之前,由UIView配置當前圖形上下文。UIGraphicsGetCurrentContext函數返回已經為當前UIView所配置的圖形上下文。
//獲取當前圖形上下文CGContextRef context = UIGraphicsGetCurrentContext();//保存這個上下文,因為我們需要上下翻轉它CGContextSaveGState(context); /*通過調用CGContextRef中的CGContextTranslateCTM函數把坐標原點轉換到左下角,該函數有兩個參數,即水平和垂直方 向的變換數值。然后使用CGContextScaleCTM函數顛倒y軸,該函數有兩個參數,即x軸和y軸的變換比例,第一個參數為1,保 持x軸不變,而第二個參數為-1,表示顛倒y軸*/ //向下移動該上下文坐標原點CGContextTranslateCTM(context, 0, self.view.bounds.size.height);CGContextScaleCTM(context, 1.0, -1.0); //向上翻轉圖像上下文//以剩余時間來創建一個字符串NSString *str = [NSString stringWithFormat:@"Time remaining:%i seconds", timeLeft];//選擇字體為16pt HelveticaCGContextSelectFont(context, "Helvetica", 16, kCGEncodingMacRoman);CGContextSetTextDrawingMode(context, kCGTextFill); //設置繪制模式//設置文本顏色為黑色CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);//轉換str為一個C 字符串并顯示它CGContextShowTextAtPoint(context, 10.0, 10.0, [str cStringUsingEncoding:[NSString defaultCStringEncoding]], str.length);CGContextRestoreGState(context); //恢復上下文//如果炮彈在屏幕上if (cannonballOnScreen) {//創建矩形并在其中繪制炮彈CGRect cannonballRect = CGRectMake(cannonball.x, cannonball.y, CANNON_BASE_RADIUS * 2, CANNON_BASE_RADIUS * 2);UIImage *image = [UIImage imageNamed:@"cannonball80.png"];//繪制圖片到矩形中CGContextDrawImage(context, cannonballRect, image.CGImage);}//繪制加農炮炮管//移動加農炮底座到視圖中間的位置CGContextMoveToPoint(context, 0 , self.view.frame.size.height / 2);//添加一根到加農炮炮管終端的線條CGContextAddLineToPoint(context, barrelEnd.x , barrelEnd.y);CGContextSetLineWidth(context, 20); //設置線條粗細CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0); //黑色CGContextStrokePath(context); //繪制線條//為加農炮底座創建矩形CGRect cannonBase = CGRectMake(0, self.view.frame.size.height / 2 - CANNON_BASE_RADIUS, CANNON_BASE_RADIUS, CANNON_BASE_RADIUS * 2);//加載加農炮底座圖片UIImage *baseImage = [UIImage imageNamed:@"cannon_base.png"];//把加農炮底座圖片繪制到矩形中CGContextDrawImage(context, cannonBase, baseImage.CGImage);//在攔截器兩個端點之間添加一根線CGContextMoveToPoint(context, blocker.start.x, blocker.start.y);CGContextAddLineToPoint(context, blocker.end.x, blocker.end.y);CGContextSetLineWidth(context, LINE_WIDTH);CGContextStrokePath(context); //繪制線條//計算目標每個分段的長度float pieceLength = (TARGET_END - TARGET_BEGINING) / TARGET_PIECES;//移到目標起點CGContextMoveToPoint(context, target.start.x, target.start.y);//繪制每個目標分段for (int i = 1; i <= TARGET_PIECES; i++){//相鄰分段以黃、藍色區分開if(i % 2 == 0){CGContextSetRGBStrokeColor(context, 1, 1, 0, 1);}else {CGContextSetRGBStrokeColor(context, 0, 0, 0.5, 1);}//移到下一個分段的端點CGContextMoveToPoint(context, target.end.x, target.start.y + pieceLength * (i - 1));//如果這個分段還沒有被擊中if(!targetPieceHit[i - 1]){//為該分段添加一條線CGContextAddLineToPoint(context, target.end.x, target.start.y + pieceLength * i);CGContextStrokePath(context); //繪制分段}}
轉載于:https://my.oschina.net/mjRao/blog/71457
總結
- 上一篇: 关于nginx信号控制的“故障”案例
- 下一篇: Qt下的OpenGL 编程(3)绘制平面