導航:首頁 > 操作系統 > android繪制多邊形

android繪制多邊形

發布時間:2023-01-12 00:06:29

⑴ 如何繪制放手多邊形的谷歌地圖V2在android

我覺著可以讓那個按鈕在滑鼠或是手指碰觸的時候,顯示相應的信息或是功能,不適用的時候(也就是不碰觸的時候)讓他變成透明的按鈕,在成尋中用代碼控制就可以了.... 查看原帖>>

⑵ 如何用android 畫出三角形

1、設置View,重寫protected void onDraw(Canvas canvas)方法
2、使用onDraw中的canvas,通過Path設置三角形的三個頂點,通過drawPath方式繪制三角形
示例:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("畫三角形:", 10, 200, p);
// 繪制這個三角形,你可以繪制任意多邊形
Path path = new Path();
path.moveTo(80, 200);// 此點為多邊形的起點
path.lineTo(120, 250);
path.lineTo(80, 250);
path.close(); // 使這些點構成封閉的多邊形
canvas.drawPath(path, p);
}

⑶ 怎麼給android 設置邊框

Android是一種基於Linux的自由及開放源代碼的操作系統,主要使用於移動設備,如智能手機和平板電腦。Android在開發過程中,很多情況下需要我們在TextView上面添加一個邊框,但是TextView本身不支持邊框,這里介紹幾種設置邊框的方法,可以供大家參考:

⑷ android怎麼移動canvas

我們可以把這個Canvas理解成系統提供給我們的一塊內存區域(但實際上它只是一套畫圖的API,真正的內存是下面的Bitmap),而且它還提供了一整套對這個內存區域進行操作的方法,所有的這些操作都是畫圖API。也就是說在這種方式下我們已經能一筆一劃或者使用

Graphic來畫我們所需要的東西了,要畫什麼要顯示什麼都由我們自己控制。
這種方式根據環境還分為兩種:一種就是使用普通View的canvas畫圖,還有一種就是使用專門的SurfaceView的canvas來畫圖。兩種的主要是區別就是可以在SurfaceView中定義一個專門的線程來完成畫圖工作,應用程序不需要等待View的刷圖,提高性能。前面一種適合處理量比較小,幀率比較小的動畫,比如說象棋游戲之類的;而後一種主要用在游戲,高品質動畫方面的畫圖。

Paint 代表了Canvas上的畫筆、畫刷、顏料等等;
Paint類常用方法:
setARGB(int a, int r, int g, int b) // 設置 Paint對象顏色,參數一為alpha透明值
setAlpha(int a) // 設置alpha不透明度,范圍為0~255
setAntiAlias(boolean aa) // 是否抗鋸齒
setColor(int color) // 設置顏色,這里Android內部定義的有Color類包含了一些常見顏色定義
setTextScaleX(float scaleX) // 設置文本縮放倍數,1.0f為原始
setTextSize(float textSize) // 設置字體大小
setUnderlineText(booleanunderlineText) // 設置下劃線

// 1、將會以顏色ARBG填充整個控制項的Canvas背景
//mCanvas.drawARGB(122, 10, 159, 163) ;
// 2、將會以顏色ARBG填充整個控制項的Canvas背景
//mCanvas.drawColor(Color.BLUE) ;
// 3、繪制顏色,但是要制定一個mode
//mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ;
// 4、畫背景,跟2等效
//mCanvas.drawPaint(mPaint) ;
// 5、畫一個點
//mCanvas.drawPoint(23, 23, mPaint) ;
// 6、畫很多點這里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....}
//mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ;
// 7、畫線
//mCanvas.drawLine(...) ;
// 8、畫長方形 Rect 和RectF的區別?
//精度不一樣,Rect是使用int類型作為數值,RectF是使用float類型作為數值
//Rect r = new Rect(10,10,50,50) ;
//mCanvas.drawRect(r, mPaint) ;
//RectF rf = new RectF(10,10,50,50) ;
//mCanvas.drawRect(rf, mPaint) ;
//mCanvas.drawRect(10, 10, 50, 50, mPaint) ;
// 9、畫橢圓 初始化RectF的參數是(left,top,right,bottom)
//RectF rf = new RectF(100,100 ,200 ,250) ;
//mCanvas.drawOval(rf, mPaint) ;
// 10、畫圓 (圓心x0,圓心y0,半徑,paint)
//mCanvas.drawCircle(100, 100, 50, mPaint) ;
// 11、畫圓弧 RectF對象表明內切矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 參數(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否顯示圓弧三角形 angle畫多少度
//mCanvas.drawArc(rf, 60, 30, true, mPaint) ;
// 12、繪制圓角矩形 RectF是矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 50表明x方向的半徑,20表示y方向的半徑
//mCanvas.drawRoundRect(rf, 50, 20, mPaint) ;
// 13、畫任意多邊形
//Path path = new Path() ;
//path.moveTo(100, 100) ;
//path.lineTo(200, 200) ;
//path.lineTo(300, 200) ;
//mCanvas.drawPath(path, mPaint) ;
// 14、通過Path對象,也可以畫其他的圖形
//Path path = new Path() ;
//path.addCircle(100, 100, 20, Path.Direction.CCW) ;
//mCanvas.drawPath(path ,mPaint);

/*drawBitmap
drawText
drawPicture*/

/*Rect r = new Rect(100,100,200,200) ;
ByteArrayOutputStream out = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ;
InputStream in = new ByteArrayInputStream(out.toByteArray()) ;
*/
/*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ;
mCanvas.drawPicture(picture) ;*/

// 15、畫bitmap對象
//mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ;

// 16、Matrix中包含了對Bitmap的處理操作
/*Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/

// 17、畫帶Matrix參數的bitmap,經過Matrix對象可以對bitmap做相關的處理,比如旋轉,縮放,移動等《關於Matrix的使用另行總結》
/*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
m.postTranslate(300, 300) ;
mCanvas.drawBitmap(bitmap, m, mPaint) ;*/
//mCanvas.drawBitmap(....) ; 暫不總結
// 18、畫文字
//mCanvas.drawText(123, 10, 10, mPaint) ;

//mCanvas.drawText(....)

⑸ android繪圖之Paint(1)

Paint 講解開篇

android中繪制特定圖案類似顯示中的繪畫需要畫筆和畫紙,為此android提供了Paint和Canvas。
Paint和Canvas分別代表畫筆和畫布。
The Paint class holds the style and color information about how to draw geometries, text and bitmaps.
Paint類似畫筆,保存著繪制文本,圖形,圖片的樣式和顏色信息。(顏色,寬度,粗細,透明度,字體樣式,字體大小)。

提供了三種初始化方法:
Paint(),
Paint(int flags),
Paint(Paint paint)。

第二種構造函數傳入了flag,相當於無參構造之後調用了setFlags(int),有很多種flag,這里舉個例子UNDERLINE_TEXT_FLAG(其他的flag見developers文檔),繪制文字時會有下劃線,多個flag或可以達到設置多個flag的目的。

Paint常用的設置函數:
setAlpha()透明度
setAntiAlias()抗鋸齒
setColor(),setARGB()設置顏色
setStyle(Paint.Style style) 設置填充樣式
setStrokeCap(Paint.Cap cap) 畫筆的樣式(落筆,收筆時)
setStrokeJoin(Paint.Join join)連接點的樣式
setStrokeWidth(float width)設置畫筆寬度
setShadowLayer(float radius, float dx, float dy, int shadowColor) 設置陰影
setTextSize(float textSize) 字體大小
setTextAlign(Paint.Align.RIGHT)設置字體對齊方式

後期講解:
setColorFilter(ColorFilter filter) 設置顏色過濾
setUnderlineText(true) 下劃線
setPathEffect() 設置路徑效果
setTypeface() 設置字體風格
setFilterBitmap() 設置圖片過濾
setXfermode(Xfermode xfermode) xfermode設置圖像混合模式
setShader(Shader shader) 設置shader包括漸變shader,圖片shader
。。。。。。。。

setAlpha(int a) 設置透明度,a 值得范圍 [0..255],僅僅改變setColor()的顏色的透明度,不改變顏色值,0是完全透明,255完全不透明。
注意:需要先調用setColor(),再調用setAlpha才會生效,否則將會被覆蓋,因為setColor中包含了alpha。

setStyle設置填充樣式,所謂填充的樣式指只繪制線或者繪制同時填充:
Paint.Style.FILL 填充內部,會把閉合區域填充顏色
Paint.Style.FILL_AND_STROKE 填充內部和描邊
Paint.Style.STROKE 僅描邊,僅僅繪制邊界
默認FILL 填充內部,

STROKE樣式

FILL_AND_STROKE樣式和FILL 類似但當畫筆寬度很寬時會產生不同

setColor,setARGB設置顏色,設置畫筆的顏色,setARGB()參數范圍0-255。
setAntiAlias(boolean) 抗鋸齒,使邊界更順滑(有些屏幕解析度不高,導致像素點比較大,繪制邊界可能會有顆粒感,打開抗鋸齒邊界顆粒感會減少)。

setTextSize(float textSize) 字體大小,單位是px,如果是dp要注意轉換。
setTextAlign(Paint.Align.RIGHT)設置字體對齊方式,根據下面的實例可以,對齊方式基於開始繪制的點。
一起講解:

mPaint.setTextSize(50);
mPaint.setTextAlign(Paint.Align.LEFT);
canvas.drawText("android Paint 學習 LEFT",300,300,mPaint);
mPaint.setTextAlign(Paint.Align.CENTER);
canvas.drawText("android Paint 學習 CENTER",300,400,mPaint);
mPaint.setTextAlign(Paint.Align.RIGHT);
canvas.drawText("android Paint 學習 RIGHT",300,500,mPaint);

setTextAlign對齊是相對於開始繪制的坐標點。

setShadowLayer(float radius, float dx, float dy, int shadowColor) 設置陰影

mPaint.setShadowLayer(10,-20,30,Color.GRAY);
canvas.drawText("android Paint 學習 CENTER",getWidth()/2,450,mPaint);

setShadowLayer(float radius, float dx, float dy, int shadowColor)
Radius設置角度,dx,dy控制字體的上下左右出現,有正負之分,dx的正負代表右左,dy的正負代表下上。

setStrokeCap(Paint.Cap.ROUND)
設置繪制起始點和結尾點的樣式,
三種樣式ROUND,BUTT,SQUARE
Cap.ROUND(圓形)、Cap.SQUARE(方形)、Paint.Cap.BUTT(無)
ROUND:

BUTT和SQUARE差別不大:

setStrokeJoin(Paint.Join join),設置繪制path連接點的樣式
mPaint.setStrokeJoin(Paint.Join.ROUND);
// mPaint.setStrokeJoin(Paint.Join.MITER);
// mPaint.setStrokeJoin(Paint.Join.BEVEL);

Join.MITER(結合處為銳角)、
Join.Round(結合處為圓弧)、
Join.BEVEL(結合處為直線)

ROUND樣式:

MITER樣式:

BEVEL樣式:

setXfermode(Xfermode xfermode) xfermode設置圖像混合模式
setShader(Shader shader) 設置shader包括漸變shader,圖片shader
還有很多其他屬性會後續講解。

android繪圖之Paint(1)
android繪圖之Canvas基礎(2)
Android繪圖之Path(3)
Android繪圖之drawText繪制文本相關(4)
Android繪圖之Canvas概念理解(5)
Android繪圖之Canvas變換(6)
Android繪圖之Canvas狀態保存和恢復(7)
Android繪圖之PathEffect (8)
Android繪圖之LinearGradient線性漸變(9)
Android繪圖之SweepGradient(10)
Android繪圖之RadialGradient 放射漸變(11)
Android繪制之BitmapShader(12)
Android繪圖之ComposeShader,PorterDuff.mode及Xfermode(13)
Android繪圖之drawText,getTextBounds,measureText,FontMetrics,基線(14)
Android繪圖之貝塞爾曲線簡介(15)
Android繪圖之PathMeasure(16)
Android 動態修改漸變 GradientDrawable

⑹ android 多邊形怎麼定義

shqpe屬性的設置說明:
1.rect 定義一個矩形區域,coords屬性設置值為矩形的左上角,右下角的坐標,各個坐標值之間用逗號分開;
2.poly 定義一個多邊形區域, coords屬性設置值為多邊形各項頂點的坐標值;
3.circle 定義一格圓形區域,
coords屬性設置值為圓心坐標及半徑,前兩個參數分別為圓心的橫,縱坐標,第三個參數為半徑.

⑺ Android 繪制與 16ms 不得不說的故事

刷新率:每秒屏幕刷新次數。
幀率:GPU 在一秒內繪制的幀數。
雖然現在有的廠商推出了高刷新率的手機,但是主流的還是 60Hz,即1秒顯示60幀,1000ms / 60 frames ≈ 16.67 ms/frames,為了保證 App 的流暢度,我們應該盡量讓每幀的繪制時間不超過 16ms。

Android 的顯示過程可以簡單概括為:應用程序把經過 measure(測量)、layout(布局)、draw(繪制)後的 surface 緩存數據,通過 SurfaceFlinger 把數據渲染到顯示屏幕上,通過 Android 的刷新機制來刷新數據。換言之,應用層負責繪制,系統層負責渲染,通過進程間通信把應用層需要繪制的數據傳遞到系統層服務,系統層通過刷新機制把數據更新到屏幕上。

以下是有關概念的解釋:

在 Android 中每個 view 都會經過 measure 和 layout 來確定其所在的大小和位置,然後繪制到 surface (緩沖區上),繪制是由 ViewRootImpl 類中 performTraversals() 方法發起的。

Android支持兩種繪制方式: 和 。硬體極速從 Android 3.0 開始支持,它在 UI 顯示和繪制效率方面遠高於軟體繪制,但是它的也有缺點:

經過多次繪制後,要顯示的 view 相關的數據存儲(如大小和位置)在 Surface 的緩沖區中,接下來渲染操作交由系統進程中的 SurfaceFlinger 服務來完成,這是一個 IPC(進程間通信)過程。SurfaceFlinger 的主要工作流程如下:

當 Android 應用層在圖形緩沖區中繪制好 View 層次結後,應用層通過 Binder 機制與 SurfaceFlinger 通信並藉助一塊匿名共享內存把圖形緩沖區交給 SurfaceFlinger 服務。由於單純的匿名共享服務在傳遞多個窗口數據時缺乏有效的管理,所以匿名共享內存就被抽象為一個更上層的數據結構——SharedClient,在 SharedClient 中,最多有 31 個 SharedBufferStack,每個 SharedBufferStack 都對應一個 Surface 即一個 Window。 這表明一個 Android 應用程序最多可以包含 31 個 window

繪制的過程首先是 CPU 准備數據(measure、layout等),GPU 負責柵格化、渲染。因為圖像 API 不允許 CPU 直接與 GPU 通信,所以要通過一個圖形驅動的中間層來進行連接。圖形驅動裡面維護了一個隊列,CPU 把 display list(待顯示的數據列表)添加到隊列中,GPU 從這個隊列中取出數據進行繪制,最終在屏幕上顯示出來,如下圖所示:

Android 系統每隔 16ms 會發出 VSYNC 信號,觸發對 UI 進行渲染,如果每次都渲染成功,就能夠達到流暢畫面所需的 60PS。

雙緩沖顧名思義是有兩個緩沖區(上文提到的 SharedBufferStack),分別是 FontBuffer(又叫作 FrameBuffer) 和 BackBuffer。UI 總是先在 Back Buffer 中繪制,然後再和 Font Buffer 交換,渲染到顯示設備中,即只有當另一個 buffer 的數據准備好後,才會通過系統調用來通知顯示設備切換 Buffer。

雙緩沖機制在大部分情況下是適用的,但是如果某個環節出現了問題,CPU 資源就有可能存在浪費,如下圖所示:

VSYNC 類似與時鍾中斷。豎線分割的部分代表 16ms 的時間段。正常情況下,在每一時間段內,Display 顯示一幀數據(即每秒60幀)。

上圖中在第二個 16ms 時間段內,Display 本應顯示 B 幀,但是因為 GPU 還在處理 B 幀,導致 A 幀被重復顯示。與此同時,在第二個時間段內,處於 CPU 處於空閑狀態,造成了浪費。因為 A Buffer 被 Diaplay 在使用(SufaceFlinger 用完後不會釋放當前的 Buffer,只會釋放舊的 Buffer),B Buffer 被 GPU 在使用,這就是 雙緩沖機制的局限性。

Android 4.1 版本中對 Android Display 系統進行了重構,引入了三個核心元素:

在第二個 16ms 時間內,CPU 使用 C Buffer 繪圖,雖然還是會多顯示 A 幀一次,但是後續的顯示相對雙緩沖機制就順滑多了。但是 Buffer 並不是越多越好,從上圖可知,在第二個時間內,CPU 繪制的第 C 幀數據要到第四個 16ms 才能顯示,這比雙 Buffer 多了 16ms 的延遲。由此可見,雙緩沖保證低時延,三緩沖保證穩定性。

整個流程簡單來說就是 CPU/GPU 會接收到 VSYNC 信號,觸發對 UI 進行渲染(每 16ms 顯示一幀)。 在 16ms 內需要完成兩項任務:將 UI 對象轉換為一系列多邊形和紋理(柵格化)和 CPU 傳遞處理數據到 GPU ,更詳細的內容可以看這篇文章 Android的16ms和垂直同步以及三重緩存 。

了解 Android 繪制流程後,我們不難反推 Android 應用程序卡頓的原因:

⑻ android 怎麼手動繪制幾何圖形源碼

可以參考下面的代碼
package cn.m15.xys;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class Geometry extends Activity {
public int mScreenWidth = 0;
public int mScreenHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(new GeometryView(this));
super.onCreate(savedInstanceState);
}
class GeometryView extends View {
Paint mPaint = null;
public GeometryView(Context context) {
super(context);
mPaint = new Paint();
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//設置畫布顏色 也就是背景顏色
canvas.drawColor(Color.WHITE);
mPaint.setColor(Color.BLACK);
canvas.drawText("繪制無規則幾何圖形喔!!!", 150, 30, mPaint);
//繪制一條線
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(4);
canvas.drawLine(0, 0, 100, 100, mPaint);
//繪制一個矩形
mPaint.setColor(Color.YELLOW);
canvas.drawRect(0, 120, 100, 200, mPaint);
//繪制一個圓形
mPaint.setColor(Color.BLUE);
canvas.drawCircle(80, 300, 50, mPaint);
//繪制一個橢圓
mPaint.setColor(Color.CYAN);
canvas.drawOval(new RectF(300,370,120,100), mPaint);
//繪制多邊形
mPaint.setColor(Color.BLACK);
Path path = new Path();
path.moveTo(150+5 , 400 -50);
path.lineTo(150+45, 400 - 50);
path.lineTo(150+30, 460 - 50);
path.lineTo(150+20, 460 - 50);
path.close();
canvas.drawPath(path, mPaint);
}
}
}

⑼ Android中使用SVG矢量圖打造多邊形圖形框架

int size = Math.min(fg.getWidth(),fg.getHeight());

閱讀全文

與android繪制多邊形相關的資料

熱點內容
伺服器顯示error1什麼意思 瀏覽:708
python代碼精簡 瀏覽:457
文件加密了怎麼找到了 瀏覽:193
jellyfin插件怎麼選擇主伺服器 瀏覽:836
asp用戶注冊源碼 瀏覽:48
什麼是照片壓縮文件 瀏覽:392
java調用js代碼 瀏覽:979
崑山市民app怎麼修改身份信息 瀏覽:779
php登陸次數 瀏覽:744
python字元轉成數字 瀏覽:822
海川用的是什麼伺服器 瀏覽:376
口才是練出來的pdf 瀏覽:458
雲伺服器哪個公司性價比高 瀏覽:517
源碼論壇打包 瀏覽:558
php怎麼做成word 瀏覽:692
python批量生成密鑰 瀏覽:492
程序員要不要考社區人員 瀏覽:150
app的錢怎麼充q幣 瀏覽:814
android銀行卡識別 瀏覽:756
怎麼在app投放廣告 瀏覽:11