最近在研究一个音频图的绘制,用到了Canvas画图方法,一个奇怪的问题困扰了我好久,最后终于解决了。
本来是想得到这种不断跳动的音频频谱柱状图的:
谁能想到,本想要个格格,谁知道来了个嬷嬷。。。得到了这样的效果:
后来才知道,Canvas绘图时不会自动清空的,所以,在下一次绘制之前,需要进行清空处理,否则就会出现这种重叠绘制的效果。
有两种方法可以清除canvas内容:
方法一:
canvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
方法二:
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawPaint(paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
下面,附上我的主要代码,让大家更直观的感受一下(注:有注释的地方就是关键之处):
@Override
public void run() {
while (isRunning) {
Log.v("run", "run()");
long start = System.currentTimeMillis();
draw();
long end = System.currentTimeMillis();
try {
if (end - start < 1000) {
Thread.sleep(1000 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void draw() {
try {
mCanvas = mSurfaceHolder.lockCanvas();
if (mCanvas != null) {
//十分重要!!!清空上一次的绘图。Canvas是属于叠加式的绘图,如果不加这句,则一层层的进行重叠绘制
mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (int i = 0; i < mRectCount; i++) {
mRandom = Math.random();
float currentHeight = (float) (mRectHeight * mRandom);
if (i == 0) {
Log.d("test", "mRandom=" + mRandom + " currentHeight=" + currentHeight +
" mWidth=" + mWidth);
}
mCanvas.drawRect(
(float) (mWidth * 0.4 / 2 + mRectWidth * i + offset),
currentHeight,
(float) (mWidth * 0.4 / 2 + mRectWidth * (i + 1)),
mRectHeight,
mPaint);
}
}
} catch (Exception e) {
} finally {
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}