Canvas和Paint那点事(2)

最近在研究一个音频图的绘制,用到了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);
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值