自定義控制項時經常用到canvas,畫新的東西之前需要先清除畫布內容,人臉識別專案中需要準確畫出當前人臉位置,清空上一幀位置。
關於清除畫布內容網上有兩種非常流行的方法:
方法一:
mcanvas.drawcolor(color.transparent, porterduff.mode.clear);
方法二:
paint paint = new paint();
paint.setxfermode(new porterduffxfermode(porterduff.mode.clear));
mcanvas.drawpaint(paint);
paint.setxfermode(new porterduffxfermode(porterduff.mode.src));
遺憾的是這兩種方法在我自定義的su***ceview中都不起作用,嘗試結果如出一轍,左右晃一下 畫面如下:
我的解決方案是在每次設定path畫線前,清空一下path,問題迎刃而解。
清除path中的內容有兩個方法:
reset( )不保留內部資料結構,但會保留filltype.
rewind( )會保留內部的資料結構,但不保留filltype
關於path其他更多方法解釋詳見這篇部落格。
自定義su***ceview**如下:
/**
* title:
* description:
* company: 北京****科技****,010-62538800,[email protected]
* * @author created by ylwang on 2018/1/30
*/public class customsu***ceview extends su***ceview implements su***ceholder.callback, runnable
public customsu***ceview(context context, attributeset attrs)
public customsu***ceview(context context, attributeset attrs, int defstyleattr)
private gson gson;
private listlistfaces;
public void setfaceinfo(string faceinfo)
}private void initview()
@override
public void su***cecreated(su***ceholder holder)
@override
public void su***cechanged(su***ceholder holder, int format, int width, int height)
@override
public void su***cedestroyed(su***ceholder holder)
public static final int time_in_frame = 20;
@override
public void run()
//保證穩定幀率重新整理介面
while (systemclock.uptimemillis() - start <= time_in_frame) }}
private void setpathtocanvas()
mpath.close();//第乙個點連線到最後乙個點,形成乙個閉合區域
ps[1]);
drawsth();}}
/*** 獲取每個人臉的四點位置座標
** @param fre
* @return
*/private int getpositions(facebean.facesentity.face_rectangleentity fre)
}return faces;
}private void drawsth() catch (exception e) finally }}
}
說明一下,多個su***ceview疊加可能會遇到的問題,
請參考這篇部落格。
mholder = getholder();//獲取su***ceholder物件
//todo:保證該su***ceview在最上層,避免兩個su***ceview疊加,遮擋問題
mholder.setformat(pixelformat.transparent);
setzorderontop(true);
Android Canvas實際操作
本篇我們來看canvas的實際應用,這裡會應用到屬性動畫valueanimator類,下面先看一下具體的效果 上述效果圖中主要由三部分組成,第一,繪製6個小球並旋轉,第二,6個小球先擴充套件然後收縮,第三,水波紋效果,展示一張。1 旋轉部分 首先,將6個小球分別繪製到螢幕上,呼叫 canvas.dr...
Android canvas 監聽繪製電池電量
1 簡介 使用canvas 根據電池電量變化 繪製電池圖示 1 充電 顯示綠色 2 電量低於10 使用 紅色 3 其餘白色 2 自定義 batteryview override 設定 view 大小 protected void onmeasure int widthmeasurespec,int ...
Android Canvas繪製七巧板
心血來潮,封裝了乙個繪製彩色多邊形的方法,並用這個方法繪製了乙個七巧板 感覺繪製華容道太簡單了 如下 public class canvaspuzzle extends view public canvaspuzzle context context,attributeset attrs publi...