當前位置:首頁 » 安卓系統 » android不規則圖形

android不規則圖形

發布時間: 2022-09-08 21:07:05

Ⅰ android canvas畫的圖怎麼實現點擊跳轉

重寫onTuchEvent,在case down 中判斷點擊的坐標是否在 你畫的圖上面

如果圖片是矩形,可以把矩形new 出來,然後判斷這個矩形是否包含這個點
如果輸不規則圖形,可以用path來構建
Rect rect = new Rect();
if (rect.contains((int) event_x, (int) event_y)) {

//點擊了
}

Ⅱ android圖片特定位置點擊

如果你顯示的這張圖片是一個單獨的activity那就比較好辦了,你把圖片設置為整個activity的背景圖片通過布局去一塊一塊的分割,把需要響應事件的區域設置監聽,這也是一個很笨的方法,就看合適不合適你的現狀了

Ⅲ 怎麼用Android畫一個正方形

先來介紹一下畫幾何圖形要用到的,畫布(Canvas)、畫筆(Paint)。
1. 畫一個圓使用的是drawCircle:canvas.drawCircle(cx, cy, radius, paint);x、y代表坐標、radius是半徑、paint是畫筆,就是畫圖的顏色;
2. 在畫圖的時候還要有注意,你所畫的矩形是實心(paint.setStyle(Paint.Style.FILL))還是空心(paint.setStyle(Paint.Style.STROKE);
畫圖的時候還有一點,那就是消除鋸齒:paint.setAntiAlias(true);
3. 還有就是設置一種漸變顏色的矩形:
Shader mShader = new LinearGradient(0,0,100,100, new int[]{Color.RED,Color.GREEn,Color.BLUE,Color.YELLO},null,Shader.TileMode.REPEAT);
ShapeDrawable sd;
//畫一個實心正方形
sd = new ShapeDrawable(new RectShape());
sd.setBounds(20,20,100,100);
sd.draw(canvas);
//一個漸變色的正方形就完成了

4. 正方形:drawRect:canvas.drawRect(left, top, right, bottom, paint)
這里的left、top、right、bottom的值是:
left:是矩形距離左邊的X軸
top:是矩形距離上邊的Y軸
right:是矩形距離右邊的X軸
bottom:是矩形距離下邊的Y軸
5. 長方形:他和正方形是一個原理,這個就不用說了
6. 橢圓形:記住,這里的Rectf是float類型的
RectF re = new Rect(left, top, right, bottom);
canvas.drawOval(re,paint);

好了,說了這么多的的東西,那就讓我們來看一下真正的實例吧!!!
package com.hades.game;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class CanvasActivity extends Activity {
/**
* 畫一個幾何圖形
* hades
* 藍色著衣
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView myView = new MyView(this);
setContentView(myView);
}
public class MyView extends View {
public MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 設置畫布的背景顏色
canvas.drawColor(Color.WHITE);
/**
* 定義矩形為空心
*/
// 定義畫筆1
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
// 消除鋸齒
paint.setAntiAlias(true);
// 設置畫筆的顏色
paint.setColor(Color.RED);
// 設置paint的外框寬度
paint.setStrokeWidth(2);
// 畫一個圓
canvas.drawCircle(40, 30, 20, paint);
// 畫一個正放形
canvas.drawRect(20, 70, 70, 120, paint);
// 畫一個長方形
canvas.drawRect(20, 170, 90, 130, paint);
// 畫一個橢圓
RectF re = new RectF(20, 230, 100, 190);
canvas.drawOval(re, paint);
/**
* 定義矩形為實心
*/
paint.setStyle(Paint.Style.FILL);
// 定義畫筆2
Paint paint2 = new Paint();
// 消除鋸齒
paint2.setAntiAlias(true);
// 設置畫筆的顏色
paint2.setColor(Color.BLUE);
// 畫一個空心圓
canvas.drawCircle(150, 30, 20, paint2);
// 畫一個正方形
canvas.drawRect(185, 70, 130, 120, paint2);
// 畫一個長方形
canvas.drawRect(200, 130, 130, 180, paint2);
// 畫一個橢圓形
RectF re2 = new RectF(200, 230, 130, 190);
canvas.drawOval(re2, paint2);
}
}
}

Ⅳ android中.9png怎麼用

在Android的設計過程中,為了適配不同的手機解析度,圖片大多需要拉伸或者壓縮,這樣就出現了可以任意調整大小的一種圖片格式「.9.png」。這種圖片是用於Android開發的一種特殊的圖片格式,它的好處在於可以用簡單的方式把一張圖片中哪些區域可以拉伸,哪些區域不可以拉伸設定好,同時可以把顯示內容區域的位置標示清楚。


本文結合一些具體的例子來看下.9.png的具體用法。

大家可以看到拉伸區域的黑點是可以不連續的。


說了半天.9.png的用法,那.9.png如何輸出呢?有很多種方式可以輸出.9.png,比如說用draw9patch.bat這個工具,或者簡單一點,用photoshop直接輸出。輸出的方式是先輸出普通的png資源,然後擴大畫布大小,上下左右各空出一個像素,再用一個像素的鉛筆工具(顏色選擇純黑色),上下左右分別畫點就可以了,保存的時候注意把後綴修改為.9.png。有兩點需要特別注意下: 1.最外圍的一圈像素必須要麼是純黑色,要麼是透明,一點點的半透明的像素都不可以有,比如 說99%的黑色或者是1%的投影都不可以有; 2.文件的後綴名必須是.9.png,不能是.png或者是.9.png.png,這樣的命名都會導致編譯失敗。

轉載

Ⅳ android能實現不規則圖形的圖案填充么

可以。
圖像的填充有2種經典演算法
一種是種子填充法。種子填充法理論上能夠填充任意區域和圖形,但是這種演算法存在大量的反復入棧和大規模的遞歸,降低了填充效率。
另一種是掃描線填充法。

Ⅵ 對比iOS 系統 Android 的字體渲染有何區別

一、渲染層級

從渲染流程上分,Skia可分為如下三個層級:

1、指令層:SkPicture、SkDeferredCanvas->SkCanvas

這一層決定需要執行哪些繪圖操作,繪圖操作的預變換矩陣,當前裁剪區域,繪圖操作產生在哪些layer上,Layer的生成與合並。

2、解析層:SkBitmapDevice->SkDraw->SkScan、SkDraw1Glyph::Proc

這一層決定繪制方式,完成坐標變換,解析出需要繪制的形體(點/線/規整矩形)並做好抗鋸齒處理,進行相關資源解析並設置好Shader。

3、渲染層:SkBlitter->SkBlitRow::Proc、SkShader::shadeSpan等

這一層進行采樣(如果需要),產生實際的繪制效果,完成顏色格式適配,進行透明度混合和抖動處理(如果需要)。 二、主要類介紹

1、SkCanvas

這是復雜度超出想像的一個類。

(1)API設計

a、創建:

在Android中,主要的創建方法是由SkBitmap創建SkCanvas:

explicit SkCanvas(const SkBitmap& bitmap);

這個方法是由bitmap創建一個SkBitmapDevice,再將這個SkBitmapDevice設定為SkCanvas的渲染目標。

5.0之後提供了一個快捷方法創建SkCanvas:

static SkCanvas* NewRasterDirect(const SkImageInfo&, void*,
size_t);

這樣Android的GraphicBuffer就不需要建一個SkBitmap和它關聯了,可以解除SkBitmap類和android
runtime的關系(雖然如此,目前Android5.0上,還是按建SkBitmap的方法去關聯GraphicBuffer)。

5.0之後引入的離屏渲染:

static SkCanvas* NewRaster(const SkImageInfo&);

創建一個SkCanvas,繪制的內容需要通過readPixels去讀取,仍然是CPU繪圖的方式。(個人覺得這個是轉入GPU硬體加速的一個比較方便的介面,不知道出於什麼考慮還是用CPU繪圖。)

b、狀態:

矩陣狀態:

矩陣決定當前繪制的幾何變換

rotate、skew、scale、translate、concat

裁剪狀態:

裁剪決定當前繪制的生效范圍

clipRect、clipRRect、clipPath、clipRegion

保存與恢復:

save、saveLayer、saveLayerAlpha、restore

c、渲染:

大部分渲染的API都可由這三個組合而成:

drawRect(矩形/圖像繪制)、drawPath(不規則圖形圖像繪制)和drawText(文本繪制)

d、像素的讀取與寫入

readPixels、writePixels

這兩個API主要由device實現,考慮到不同繪圖設備的異質性。

(2)MCRec狀態棧

fMCStack是存儲的全部狀態集,fMCRec則是當前的狀態。

在 save saveLayer saveLayerAlpha 時,會新建一個MCRec,在restore時,銷毀棧頂的MCRec。

(代碼見:SkCanvas.cpp internalSave函數,通過這段代碼可以了解一下new的各種用法~。)

每個狀態包括如下信息:

class SkCanvas::MCRec {

public:

int fFlags;//保存的狀態標識(是否保存矩陣/裁剪/圖層)

SkMatrix*
fMatrix;//矩陣指針,若這個狀態有獨立矩陣,則指向內存(fMatrixStorage),否則用上一個MCRec的fMatrix

SkRasterClip*
fRasterClip;//裁剪區域,若這個狀態有獨立裁剪區域,則指向內存(fRasterClip),否則繼承上一個的。

SkDrawFilter* fFilter;

DeviceCM* fLayer;//這個狀態所擁有的layer(需要在此MCRec銷毀時回收)

DeviceCM* fTopLayer;//這個狀態下,所需要繪制的Layer鏈表。(這些Layer不一定屬於此狀態)

......

};

DeviceCM:圖層鏈表,包裝一個SkBaseDevice,附加一個位置偏移變化的矩陣(在saveLayer時指定的坐標)。

(3)兩重循環繪制

研究Skia的人,一般來說都會被一開始的兩重循環弄暈一會,比如drawRect的代碼:

LOOPER_BEGIN(paint, SkDrawFilter::kRect_Type, bounds)

while (iter.next()) {

iter.fDevice->drawRect(iter, r, looper.paint());

}

LOOPER_END

先完全展開上面的代碼:

AutoDrawLooper looper(this, paint, false, bounds);

while (looper.next(type)) {

SkDrawIter iter(this);

while (iter.next()) {

iter.fDevice->drawRect(iter, r, looper.paint());

}

}

第一重循環即 AutoDrawLooper,這個next實際上是做一個後處理,在存在 SkImageFilter
的情況下,先渲染到臨時Layer上,再將這個Layer做Filter處理後畫到當前device上。

第二重循環是SkDrawIter,這個是繪制當前狀態所依附的所有Layer。

一般情況下,這兩重循環都可以忽略,單純當它是走下流程就好了。

個人認為Skia在繪制入口SkCanvas的設計並不是很好,圖層、矩陣與裁剪存在一起,導致渲染任務難以剝離,後面GPU渲染和延遲渲染的引入都讓人感到有些生硬。

2、SkDraw、SkBlitter

這兩個類在後續章節還會提到,這里只簡單介紹:

SkDraw是CPU繪圖的實現入口,主要任務是做渲染准備(形狀確定、幾何變換、字體解析、構建圖像Shader等)。

SkBlitter 不是單獨的一個類,指代了一系列根據圖像格式、是否包含Shader等區分出來的一系列子類。

這一族類執行大塊頭的渲染任務,把像素繪制上去。

三、渲染框架設計思想分析

1、指令層與實現層分離

SkCanvas不直接執行渲染,由SkBaseDevice根據設備類型,選擇渲染方法。這樣雖然是同一套API,但可以用作GPU繪圖、pdf繪制、存儲顯示列表等各種功能。在API集上做優化,避免冗餘繪制,也因此成為可能(註:這個google雖然在嘗試,但目前看來沒有明顯效果,實現起來確實也很困難)。

2、圖=形+色的設計思想

由SkDraw和SkScan類中控制繪制的形,由SkBlitter和SkShader控制繪制的色,將繪圖操作分解為形狀與色彩兩部分,這一點和OpenGL的頂點變換——光柵——片斷著色管線相似,非常有利於擴展,各種2D圖元的繪制基本上就完全支持了。

3、性能調優集中化

將耗時的函數抽象都抽象為proc,由一個工廠製造,便於集中對這一系列函數做優化。

下面三章分別講bitmap、path和text的繪制方法

著重點分別如下:

bitmap:shader及采樣原理,混合計算原理,多格式支持方法

path:不規則圖形的繪制方式

text:文本解析方法,cache管理

Ⅶ 關於opengl es 如何畫圓 以及不規則圖形

球面坐標計算三重積分:k是緯度(-90~90) m是經度(0~360)x=r*sink*cosmy=r*sink*sinmz=r*cosk繪制柱面的話 只要計算緯度為0時的x,y,z。經度的采樣間隔要小於30

Ⅷ Androidstudio視頻播放器中的播放界面怎麼由矩形改為梯形或不規則四邊形

左邊為直角,連接對角線,則可以用勾股定理計算第三邊,接下去使用海倫公式求分隔的另一個三角形的面積即可

熱點內容
java記事本程序 發布:2025-01-10 22:38:27 瀏覽:665
如何通過網吧電腦進入網吧伺服器 發布:2025-01-10 22:22:30 瀏覽:706
資料庫緩存是什麼 發布:2025-01-10 22:21:05 瀏覽:386
dns配置出現錯誤該怎麼辦 發布:2025-01-10 22:13:00 瀏覽:439
雲頂演算法 發布:2025-01-10 22:10:07 瀏覽:990
收件伺服器有什麼作用 發布:2025-01-10 21:50:01 瀏覽:391
安卓70緩存 發布:2025-01-10 21:49:03 瀏覽:684
圖像檢索演算法 發布:2025-01-10 21:43:58 瀏覽:559
plsqlforupdate 發布:2025-01-10 21:43:50 瀏覽:917
如何設置健康碼快捷方式vivo安卓 發布:2025-01-10 21:39:52 瀏覽:504