自定義視圖:圖形與圖像的處理(二):繪圖

????????除了使用已有的圖片之外,Android應用還常常需要在運行時動態地生成圖片,比如一個手機游戲,游戲界面看上去豐富多彩,而且可以隨著用戶動作而動態改變,這就需要借助于Android的繪圖支持了。

1. Android繪圖基礎:Canvas、Paint等

????????Android的繪圖應該繼承View組件,并重寫它的onDraw (Canvas canvas)方法即可。

????????重寫onDraw (Canvas canvas)方法時涉及一個繪圖APl:Canvas,Canvas代表“依附"于指定View的畫布,它提供了如表所示的方法來繪制各種圖形。

方法簽名簡要說明
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)繪制弧
drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)在指定點繪制從源位圖中“挖取”的一塊
drawBitmap(Bitmap bitmap, float left, float top, Paint paint)在指定點繪制位圖
drawCircle(float cx, float cy, float radius, Paint paint)在指定點繪制一個圓
drawLine(float startX, float startY, float stopX, float stopY, Paint paint)繪制一條直線
drawLines(float[pts,int offset, int count,Paint paint)繪制多條直線
drawOval(RectF oval, Paint paint)繪制橢圓
drawPath(Path path,Paint paint)沿著指定Path 繪制任意形狀
drawPoint(float x, float y, Paint paint)繪制一個點
drawPoints(float[] pts, int offset, int count,Paint paint)繪制多個點
drawRect(float left, float top, float right, float bottom, Paint paint)繪制矩形
drawRoundRect(RectF rect, float rx, float ry, Paint paint)繪制圓角矩形
draw Text(String text, int start, int end,Paint paint)繪制字符串
drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)沿著路徑繪制字符串
clipRect(float left, float top, float right, float bottom)剪切一個矩形區域
clipRegion(Region region)剪切指定區域

Canvas還提供了如下方法進行坐標變換

  • rotate (float degrees, float px,float py) :對Canvas執行旋轉變換。
  • scale (float sx,float sy,float px,float py) :對Canvas執行縮放變換。
  • skew (float sx, float sy) :對Canvas執行傾斜變換。
  • translate (float dx,float dy):移動Canvas。向右移動dx距離(dx為負數即向左移動);向下移動dy距離(dy為負數即向上移動)。

????????Canvas提供的方法還涉及一個API: PaintPaint代表Canvas上的畫筆,因此Paint類主要用于設置繪制風格,包括畫筆顏色、畫筆筆觸粗細、填充風格等。Paint提供了如表所示的方法。

方法簽名簡要說明
setARGB(int a, int r, int g, int b)/setColor(int color)設置顏色
setAlpha(int a)設置透明度
setAntiAlias(boolean aa)設置是否抗鋸齒
setColor(int color)設置顏色
setPathEffect(PathEffect effect)設置繪制路徑時的路徑效果
setShader(Shader shader)設置畫筆的填充效果
setShadowLayer(float radius, float dx, float dy, int color)設置陰影
setStrokeWidth(float width)設置畫筆的筆觸寬度
setStrokeJoin(Paint.Join join)設置畫筆轉彎處的連接風格
setStyle(Paint.Style style)設置 Paint的填充風格
setTextAlign(Paint.Align align)設置繪制文本時的文字對齊方式
setTextSize(float textSize)設置繪制文本時的文字大小

????????在Canvas提供的繪制方法中還用到了一個API: Path,Path代表任意多條直線連接而成的任意圖形,當Canvas根據Path繪制時,它可以繪制出任意的形狀

1.1 例子

public class MyView extends View {private Path path1 = new Path();private Path path2 = new Path();private Path path3 = new Path();private Path path4 = new Path();private Path path5 = new Path();private Path path6 = new Path();public MyView(Context context, AttributeSet set){super(context,set);}private LinearGradient mShader = new LinearGradient(0f,0f,40f,60f,new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null, Shader.TileMode.REPEAT);private RectF rect = new RectF();//定義畫筆private Paint paint = new Paint();//重寫方法,進行繪圖@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//把整張畫布繪制成白色canvas.drawColor(Color.WHITE);//去鋸齒paint.setAntiAlias(true);paint.setColor(Color.BLUE);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(4f);int viewWidth = this.getWidth();//繪制圓形canvas.drawCircle(viewWidth/10 + 10,viewWidth/10 + 10, viewWidth / 10, paint);//繪制正方形canvas.drawRect (10 , viewWidth / 5 + 20 , viewWidth / 5 + 10, viewWidth *2/ 5 + 20 , paint) ;//繪制矩形canvas.drawRect (10,viewWidth * 2/ 5 + 30,viewWidth / 5 + 10, viewWidth / 2 + 30, paint);@SuppressLint("DrawAllocation")RectF re1 = new RectF (10,viewWidth / 2 +40, 10 + viewWidth / 5 , viewWidth * 3 / 5 +40) ;//繪制圓角矩形canvas.drawRoundRect (re1, 15,15, paint) ;@SuppressLint("DrawAllocation")RectF re11 = new RectF(10,viewWidth * 3 / 5 + 50,10 + viewWidth / 5 ,viewWidth * 7 / 10 + 50);//繪制橢圓canvas.drawOval(re11, paint) ;//定義一個Path對象,封閉成一個三角形path1.moveTo (10,viewWidth * 9 / 10 + 60);path1.lineTo(viewWidth / 5 + 10,viewWidth * 9 /10 + 60);path1.lineTo (viewWidth / 10 + 10,viewWidth * 7 /10 + 60 );path1.close () ;//根據Path進行繪制,繪制三角形canvas.drawPath (path1, paint);//定義一個 Path對象,封閉成一個五角形path2.moveTo(10 + viewWidth / 15,viewWidth * 9 / 10 + 70);path2.lineTo(10 + viewWidth * 2/ 15,viewWidth * 9 / 10 +70);path2.lineTo(10 + viewWidth / 5, viewWidth + 70);path2.lineTo(10 + viewWidth / 10,viewWidth * 11/10 +70);path2.lineTo (10 , viewWidth + 70);path2.close();//根據Path進行繪制,繪制五角形canvas .drawPath (path2 , paint) ;//----------設置填充風格后繪制-—--------paint.setStyle(Paint.Style.FILL);paint.setColor(Color.RED);//繪制圓形canvas.drawCircle(viewWidth * 3 / 10 + 20,viewWidth / 10 + 10, viewWidth / 10, paint) ;//繪制正方形canvas.drawRect (viewWidth / 5 +20 , viewWidth / 5 +20, viewWidth * 2/ 5 + 20 , viewWidth * 2/ 5 + 20 , paint) ;//繪制矩形canvas.drawRect (viewWidth / 5 + 20,viewWidth * 2/ 5 + 30, viewWidth * 2 / 5 + 20 , viewWidth / 2 + 30,paint);@SuppressLint("DrawAllocation") RectF re2 = new RectF (viewWidth / 5 + 20,viewWidth / 2 + 40,20 + viewWidth * 2 / 5 ,viewWidth * 3 / 5 + 40);//繪制圓角矩形canvas.drawRoundRect (re2,15,15, paint) ;@SuppressLint("DrawAllocation") RectF re21 = new RectF(20 + viewWidth / 5, viewWidth * 3 / 5 + 50,20 + viewWidth * 2/ 5 ,viewWidth * 7 / 10 + 50);//繪制橢圓canvas.drawOval(re21, paint) ;//定義一個Path對象,封閉成一個三角形path3.moveTo(20 + viewWidth / 5,viewWidth * 9 / 10 + 60);path3.lineTo(viewWidth * 2/ 5 + 20,viewWidth * 9 / 10 + 60);path3.lineTo(viewWidth * 3 / 10 + 20,viewWidth * 7 / 10 + 60);path3.close ( ) ;//根據Path進行繪制,繪制三角形canvas.drawPath (path3, paint) ;//定義一個Path對象,封閉成一個五角形path4.moveTo(20 + viewWidth *4 / 15,viewWidth * 9 / 10 + 70);path4.lineTo(20 + viewWidth / 3, viewWidth * 9 / 10 +70);path4.lineTo(20 + viewWidth * 2/ 5, viewWidth + 70);path4.lineTo(20 + viewWidth * 3 / 10,viewWidth * 11/10 + 70);path4.lineTo(20 + viewWidth / 5 , viewWidth + 70);path4.close ( ) ;//根據Path進行繪制,繪制五角形canvas.drawPath (path4, paint) ;//----------設置漸變器后繪制-—------// 為Paint設置漸變器@SuppressLint("DrawAllocation")Shader mShader = new LinearGradient(0,0,40,60,new int[] {Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW }, null , Shader.TileMode.REPEAT);paint.setShader(mShader) ;//設置陰影paint.setShadowLayer (25 , 20 , 20 , Color.GRAY);//繪制圓形canvas.drawCircle (viewWidth / 2 + 30, viewWidth / 10 + 10, viewWidth / 10,paint) ;//繪制正方形canvas.drawRect (viewWidth * 2 / 5 + 30 , viewWidth / 5 + 20, viewWidth * 3 / 5 + 30 , viewWidth * 2/ 5 + 20 , paint);//繪制矩形canvas.drawRect (viewWidth * 2 / 5+ 30,viewWidth * 2/ 5 + 30, viewWidth * 3 / 5 + 30 , viewWidth / 2 + 30,paint);@SuppressLint("DrawAllocation")RectF re3 = new RectF(viewWidth * 2 / 5 + 30,viewWidth / 2 + 40,30 + viewWidth * 3 / 5 , viewWidth * 3 / 5 + 40);//繪制圓角矩形canvas.drawRoundRect (re3, 15,15, paint) ;@SuppressLint("DrawAllocation")RectF re31 = new RectF(30 + viewWidth *2/ 5,viewWidth * 3 / 5 + 50,30 + viewWidth * 3 / 5 , viewWidth * 7 / 10 + 50 ) ;//繪制彬圓canvas.drawOval (re31, paint) ;//定義一個Path對象,封閉成一個三角形path5.moveTo(30 + viewWidth * 2/ 5,viewWidth * 9 / 10 + 60 ) ;path5.lineTo(viewWidth * 3 / 5 + 30,viewWidth * 9 / 10 + 60);path5.lineTo (viewWidth / 2 + 30,viewWidth * 7 / 10 + 60);path5.close();//根據Path進行繪制,繪制三角形canvas .drawPath (path5, paint) ;//定義一個Path對象,封閉成一個五角形path6.moveTo (30 + viewWidth * 7 / 15,viewWidth * 9 / 10 + 70);path6.lineTo(30 + viewWidth * 8 / 15,viewWidth * 9 / 10 + 70);path6.lineTo (30 + viewWidth* 3/ 5,viewWidth + 70);path6.lineTo (30 + viewWidth / 2,viewWidth * 11/10 + 70);path6.lineTo (30 + viewWidth * 2/ 5 , viewWidth + 70 );path6.close ( ) ;//根據Path進行繪制,繪制五角形canvas.drawPath (path6, paint);//----------設置字符大小后繪制paint.setTextSize(48);paint.setShader(null);//繪制7個字符串canvas.drawText(getResources().getString(R.string.circle),60 + viewWidth * 3 / 5, viewWidth / 10 + 10,paint);canvas.drawText(getResources ( ).getString(R.string.square),60 + viewWidth * 3 / 5,viewWidth * 3 / 10 + 20,paint);canvas.drawText (getResources ( ).getString (R.string.rect),60 + viewWidth * 3 / 5, viewWidth * 1 / 2 + 20,paint);canvas.drawText(getResources ( ).getString (R.string.round_rect),60 + viewWidth * 3 / 5,viewWidth * 3 / 5 + 30,paint) ;canvas.drawText (getResources ().getString (R.string.oval),60 + viewWidth * 3 / 5,viewWidth * 7 / 10 + 30,paint);canvas.drawText (getResources ( ).getString (R.string.triangle),60 + viewWidth * 3 / 5, viewWidth * 9 / 10 + 30,paint);canvas.drawText (getResources ( ).getString (R.string.pentagon),60 + viewWidth * 3 / 5,viewWidth * 11 / 10 + 30,paint);}}

????????Android的Canvas不僅可以繪制這種簡單的幾何圖形,還可以直接將一個Bitmap繪制到畫布上,這樣就給了開發者巨大的靈活性,只要前期美工把應用程序所需的圖片制作出來,后期開發時把這些圖片繪制到Canvas上即可。

1.2 額外知識點

(1).?LinearGradient類

????????此類實現線性漸變效果,目前只在實現卡拉ok字幕上使用過,就是讓歌詞隨著歌聲逐漸變色的效果。

LinearGradient lg = new LinearGradient(0,0,100,100,     new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},     null, Shader.TileMode.REPEAT);   

參數說明:?

第一個?起始的x坐標?

第二個?起始的y坐標??

第三個?結束的x坐標???

第四個?結束的y坐標???

?——以上4個坐標參數除了設置漸變區域,還決定漸變的方向?

第五個?顏色數組,如{#000000,#ffffff}??

第六個?這個也是一個數組,如{0.5f,0.51f},?

用來指定顏色數組的相對位置,?

取值從0.0f到1.0f按第五個參數的顏色組切分漸變區域??

如果為null?就沿坡度線均勻分布???

——以上2個參數配對出現,第六個如果不設置null,則需對應第五個參數的數組元素個數?

第七個?渲染模式

(2).RectF類

????????Rect和RextF都是用來創建一個矩形的,Rect的參數是int型,RectF的參數是float型,由此可以看出RectF比Rect的精確度更高。他們都是通過四個坐標參數來確定矩形的區域。

  • RectF.left 矩形左上角的x坐標。
  • RectF.top 矩形左上角的y坐標。
  • RectF.right 矩形右下角的y坐標。
  • RectF.right 矩形右下角的y坐標。

在這里插入圖片描述

2. Path類

????????調用Canvas的drawPath (path,paint)方法可沿著路徑繪制圖形。Android還為路徑繪制提供了PathEffect來定義繪制效果,PathEffect包含了如下子類(每個子類代表一種繪制效果)。

  • ComposePathEffect
  • CornerPathEffect
  • DashPathEffect
  • DiscretePathEffect
  • PathDashPathEffect
  • sumPathEffect

????????這些繪制效果使用語言來表述總顯得有點空洞,下面通過一個程序來讓讀者理解這些繪制效果。該程序繪制7條路徑,分別示范了不使用效果和使用上面6種效果的效果。

2.1 例子

public class Test7Activity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new Test7View(this));}class Test7View extends View{private float phase;private PathEffect[] effects = new PathEffect[7];private int[] colors;private Paint paint = new Paint();//定義創建并初始化Pathprivate Path path = new Path();public Test7View(Context context){super(context);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(4f);path.moveTo(0f,0f);for (int i = 1; i <=40 ; i++) {//生成40個點,隨機生成他們的坐標,并將它們連接成一條Pathpath.lineTo(i*25f,(float)(Math.random()*90));}//初始化7種顏色colors = new int[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.GREEN,Color.MAGENTA,Color.RED,Color.YELLOW};//--------下面開始初始化 7 條路徑的效果----------//不使用路徑效果effects[0]=null;// 使用CornerPathEffecteffects[1]= new CornerPathEffect(10f);// 初始化DiscretePathEffecteffects[2]= new DiscretePathEffect(3.0f,5.0f);}@SuppressLint("DrawAllocation")@Overrideprotected void onDraw(Canvas canvas) {//將背景填充成白色canvas.drawColor(Color.WHITE);//將畫布移到(8,8)處開始繪制canvas.translate(8f,8f);//依次使用7種不同的路徑效果,7種不同的顏色來繪制路徑for (int i = 0; i <effects.length ; i++) {paint.setPathEffect(effects[i]);paint.setColor(colors[i]);canvas.drawPath(path,paint);canvas.translate(0f,90f);}// 初始化DashPathEffecteffects[3] = new DashPathEffect(new float[]{20f,10f,5f,10f},phase);// 初始化PathDashPathEffectPath p = new Path();p.addRect(0f,0f,8f,8f,Path.Direction.CCW);effects[4] = new PathDashPathEffect(p,12f,phase,PathDashPathEffect.Style.ROTATE);// 初始化ComposePathEffecteffects[5] = new ComposePathEffect(effects[2],effects[4]);// 初始化sumPathEffecteffects[6] = new SumPathEffect(effects[4],effects[3]);//改變phase值 ,形成動畫效果phase +=1f;invalidate();}}
}

????????正如上面的程序中所看到的,當定義DashPathEffect、PathDashPathEffect時可指定一個phase參數該參數用于指定路徑效果的相位,當該phase參數改變時,繪制效果也略有變化。上面的程序不停地改變phase參數,并不停地重繪該View組件,這將產生動畫效果。

2.2 六條路徑效果詳解

  • CornerPathEffect:使路徑變得圓潤

通過將線段之間的任何銳角替換為指定半徑的圓角,轉換繪制的幾何圖形(描邊或填充式)。 ?? ? ? ??

參數:radius ?相當于線段之間的圓角。

  • DiscretePathEffect:類似毛刺一樣的效果

官方的解釋: ? ? ? ? ? ?

DiscretePathEffect :切斷線段

segmentLength:是指定切斷的長度

deviation:為切斷之后線段的偏移量隨機的,小于等于deviation。

  • DashPathEffect:實線與虛線之間交替

第一個,float intervals[],它是一個數組,這里用來存放,顯示的實線與虛線的長度。? ? ? ? ? ? 其中20和5屬于實線 ;兩個10屬于虛線 ? ? ? ? ? ?

第二個,phase,它是一個偏移的數值,就是左右偏移量,正數向左,負數向右。

  • PathDashPathEffect

// 通過用指定的形狀沖壓繪制的路徑來劃線。這僅適用于繪畫樣式為“描邊”或“描邊和填充”時的繪圖。 ? ? ? ? ? ?

// 如果繪畫的樣式是填充,那么這個效果會被忽略。繪畫的筆劃寬度不會影響結果。 ? ? ? ? ? ?

//shape?? ? ? ?Path:要踩踏的路徑 ? ? ? ? ? ?

//advance?? ?float:形狀的每個印章之間的間距 ? ? ? ? ? ?

//phase?? ? ? ?float:沖壓第一個形狀前的偏移量? ? ?

//style? ? ? ? ? PathDashPathEffect.Style:如何在沖壓時變換每個位置的形狀 ? ? ? ? ? ?

//? ? ? ? ? ? ? ? ? MORPH ?ROTATE ?TRANSLATE ?變形 旋轉 平移

  • ComposePathEffect

構建一個PathEffect,其效果是首先應用內部效果和外部pathEffect(例如outer(inner(path))。

// 第一個參數:outerpe 第二個參數:innerpe

  • sumPathEffect

構建一個PathEffect,其效果是依次應用兩個效果。(例如第一個(路徑)+第二個(路徑))

????????Canvas還提供了一個drawTextOnPath (String text,Pathpath,float hOffset,float vOffset,Paint paint)方法,該方法可以沿著Path繪制文本。其中hOffset參數指定水平偏移,vOffset參數指定垂直偏移。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92370.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務、服務網格、Nacos架構與原理

Nacos架構與原理 -服務網格生態-阿里云開發者社區 ------ 該文章用于學習參考,如有侵權,請直接聯系下架 服務網格的核心職責:治理“服務通信” 包括但不限于: 功能 舉例說明 負載均衡 動態選擇服務實例 熔斷、重試 某個服務失敗時自動切換、重試 流量路由 灰度發布、藍綠…

STM32——啟動過程淺析

總&#xff1a;STM32——學習總綱 參考文件&#xff1a; STM32 MAP文件淺析-V1.1 STM32 啟動文件淺析_V1.2 Cortex-M3權威指南(中文)、ARM Cotrex-M3權威指南(英文).zip 一、Map文件解析 1.1 MDK編譯過程文件 在編譯中&#xff0c;會生成11種編譯過程文件&#xff0c;可…

區塊鏈簡介

一、區塊鏈簡介 狹義上的定義&#xff1a; 區塊鏈是一種鏈式數據結構&#xff0c;通過按時間順序將數據塊逐一連接形成。這種結構通過密碼學確保了數據的不可篡改性和不可偽造性&#xff0c;形成了一種分布式賬本技術。 廣義上的定義&#xff1a; 區塊鏈技術不僅僅是一種數據…

NestJS中@Injectable裝飾器

一、基礎定義與核心作用 1.1 什么是Injectable&#xff1f; Injectable() 是 NestJS 依賴注入&#xff08;Dependency Injection, DI&#xff09;系統的核心裝飾器&#xff0c;用于將類標記為可注入的提供者&#xff08;Provider&#xff09;。它告知 NestJS 的 IoC&#xff08…

【機器學習深度學習】大模型應用落地:微調與RAG的角色與實踐

目錄 前言 一、微調與RAG&#xff1a;大模型應用落地的兩大支柱 1. 微調&#xff08;Fine-tuning&#xff09; 2. RAG&#xff08;Retrieval-Augmented Generation&#xff09; 二、微調可以做什么&#xff1f; 1. 模型自我認知調整 2. 對話風格優化 3. 提升問題理解能…

List、ArrayList 與順序表

目錄 一、List 介紹 二、線性表 三、自己實現 ArrayList 3.1 顯示元素 3.2 增 3.2.1 默認在數組后面新增元素 3.2.2 在指定位置中新增元素 3.3 查 3.4 取值 3.5 改 3.5.1 把 pos 位置的元素修改成 value 3.5.2 刪除某個元素 3.5.3 清空 四、認識 ArrayList 4.0 說…

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現各類垃圾的分類檢測識別(C#代碼UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現各類垃圾的分類檢測識別&#xff08;C#代碼UI界面版&#xff09;工業相機使用YoloV8模型實現各類垃圾的分類檢測識別工業相機通過YoloV8模型實現各類垃圾的分類檢測識別的技術背景在相機SDK中獲取圖像轉換圖像的代碼分…

EasyExcel高效工具類:簡化Excel導入導出,支持多Sheet與枚舉轉換

文章目錄前言一、依賴坐標二、工具類&#xff1a;ExcelUtil三、測試1.實體類2.前置操作3.單Sheet導出4.單Sheet導入5.多Sheet導出6.多Sheet導入7.完整代碼四、擴展&#xff1a;自定義注解實現枚舉類型轉換1.枚舉接口2.枚舉類3.注解4.轉換類5.使用示例6.測試總結前言 在現代應用…

技術速遞|GitHub Copilot for Eclipse 邁出重要一步

我們非常高興地宣布&#xff1a;2025 年 7 月 22 日&#xff0c;GitHub Copilot for Eclipse 又邁出了重要一步&#xff0c;Eclipse 變得更智能、更快捷&#xff0c;而且與 Eclipse 的集成也更無縫了&#xff01;這是繼新功能上線以來&#xff0c;又一次質的提升。 &#x1f…

Coze Loop:開源智能體自動化流程編排平臺原理與實踐

項目簡介 Coze Loop 是 Coze 團隊開源的智能體自動化流程編排平臺。它以“Loop”為核心概念,支持開發者通過低代碼/可視化方式,將多種 AI Agent、插件、API、數據流等靈活編排為自動化工作流,實現復雜的智能體協作、任務自動化和多模態數據處理。Coze Loop 適用于企業自動化…

[GESP202309 四級] 2023年9月GESP C++四級上機題題解,附帶講解視頻!

本文為2023年9月GESP C四級的上機題目的詳細題解&#xff01;覺得寫的不錯或者有幫助可以點個贊啦。 目錄 題目一講解視頻: 題目二講解視頻: 題目一:進制轉換 解題思路: 代碼(C): 題目二:變長編碼 解題思路: 代碼(C): 題目一講解視頻: 2023年9月GESP C四級上機題一題目…

【AI編程工具IDE/CLI/插件專欄】-國外IDE與Cursor能力對比

AI編程專欄(二) - Cursor 深度使用指南 Cursor 深度使用指南(二) - 新能力使用教程 從Trae 2.0與CodeBuddy IDE發布&#xff0c;談大廠布局IDE 如何選擇AI IDE&#xff1f;對比Cursor分析功能差異 AI編程工具IDE/CLI/插件專欄-熱門AI編程CLI初識與IDE對 前面文章介紹過了國…

word2vector細致分解(CBOW, SKIP_GRAM, 層次soft Max, 負采樣)

1 前世今生&#xff1a;NGRAM NGRAM&#xff1a;將詞當成一個離散的單元&#xff08;因此存在一定的局限性&#xff0c;沒有考慮到詞與詞之間的關系&#xff09; neural network language model&#xff1a;只能處理定長序列&#xff0c;訓練慢。使用RNN之后有所改善 2 兩種訓…

Elasticsearch向量庫

在Elasticsearch&#xff08;ES&#xff09;最新版本&#xff08;目前8.x系列&#xff09;中&#xff0c;無需額外的“embedding插件”&#xff0c;因為ES從7.14版本開始就原生支持向量數據類型&#xff08;dense_vector&#xff09; 和向量搜索能力&#xff0c;可直接作為向量…

嵌入式學習的第四十四天-ARM

一、ARM內核基礎知識1.ALU算術邏輯單元&#xff1b;完成運算的電路2.通用寄存器&#xff1a;R0~R15R13&#xff08;SP&#xff09;&#xff1a;棧指針寄存器&#xff1a;指向棧的指針&#xff08;指向正確的位置&#xff09;&#xff0c;為了保護現場 R14&#xff08;LR…

QML開發:QML中的基本元素

文章目錄一、概述二、常用基本元素2.1 基礎視覺元素&#xff08;常用于布局和顯示&#xff09;2.1.1 元素 Item 的介紹和使用2.1.2 元素 Rectangle 的介紹和使用2.1.3 元素 Image 的介紹和使用2.1.4 元素 Text 的介紹和使用2.2 交互元素&#xff08;用于接收用戶操作&#xff0…

Spring AI 項目實戰(二十二):Spring Boot + AI +DeepSeek實現智能合同數據問答助手?(附完整源碼)

系列文章 序號 文章名稱 1 Spring AI 項目實戰(一):Spring AI 核心模塊入門 2 Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼) 3 Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼) 4

從 0 到 1 創建 InfluxDB 3 表:標簽、字段、命名規范一篇講透

前言 在使用 InfluxDB 3 存儲時序數據時,表的設計堪比蓋房子打地基,地基打歪,數據“塌方”指日可待。InfluxDB 雖然不是傳統意義上的關系型數據庫,但它有自己的一套“審美”:標簽(Tags)和字段(Fields)是它的雙核心,誰先誰后,關系重大,順序寫錯,查詢性能立馬打折。…

[sqlserver] 分析SQL Server中執行效率較低的SQL語句

查詢性能分析較低的SQL語句 -- 查詢性能分析 SELECT TOP 50qs.creation_time AS [編譯時間],qs.last_execution_time AS [最后執行時間],qs.execution_count AS [執行次數],qs.total_worker_time/1000 AS [CPU總時間(ms)],qs.total_elapsed_time/1000 AS [總耗時(ms)],(qs.tota…

SmartX 用戶建云實踐|寶信軟件:搭建“雙架構”私有云平臺,靈活滿足多種業務需求

上海寶信軟件股份有限公司&#xff08;以下簡稱寶信軟件&#xff09;系中國寶武實際控制、寶鋼股份控股的上市軟件企業&#xff0c;是中國領先的工業軟件行業應用解決方案和服務提供商&#xff0c;為寶武集團提供整體 IT 基礎架構解決方案與服務。為統一管理寶武集團旗下分散在…