android不規則圖形
Ⅰ 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視頻播放器中的播放界面怎麼由矩形改為梯形或不規則四邊形
左邊為直角,連接對角線,則可以用勾股定理計算第三邊,接下去使用海倫公式求分隔的另一個三角形的面積即可