相同的图片缩小到屏幕大小后,在view里显示很锐利的,但用SurfaceView显示就惨不忍睹 
核心代码都相同,只是容器不同而已,大侠来解惑下。附演示代码 SurfaceView 核心代码:            public void doDraw(Canvas canvas) { 
Paint p = new Paint(); 
p.setAntiAlias(true);// <<====== Anti Alias 
p.setColor(Color.WHITE); 
canvas.drawColor(Color.BLACK); 
Matrix mMatrix=new Matrix(); 
mMatrix.postScale(0.34f, 0.34f); 
canvas.drawBitmap(mBitmap, mMatrix, p); 
canvas.drawText("Surface View Anti alias", 100, 300, p); 
} View 核心代码: @Override 
protected void onDraw(Canvas canvas) { 
Paint p = new Paint(); 
p.setAntiAlias(true);// <<====== Anti Alias 
p.setColor(Color.WHITE); 
canvas.drawColor(Color.BLACK); 
Matrix mMatrix = new Matrix(); 
mMatrix.postScale(0.34f, 0.34f); 
canvas.drawBitmap(mBitmap, mMatrix, p); 
canvas.drawText("View Anti alias", 100, 300, p); 
} 两种效果差距甚大,到底surfaceview下怎么抗锯齿呢? 附源代码 
http://sharpidea.co.cc/GifViewTest.rar

解决方案 »

  1.   

    Surface View 和 一般的View是不太一样的。Surface View是有buffer的,一般画图直接画到这个buffer上。一般的view是没有这个buffer的,是share window的viewRoot(DecroView)的buffer。详细代码没仔细研究过,可能一般view的事件循环路径稍微长一些,有些许不同吧。
      

  2.   

    更新下代码:相同的图片缩小到屏幕大小后,在view里显示很锐利的,但用SurfaceView显示就惨不忍睹
    核心代码都相同,只是容器不同而已,大侠来解惑下。附演示代码SurfaceView 核心代码:
    public void doDraw(Canvas canvas) {
    Paint p = new Paint();
    p.setColor(Color.WHITE);
    canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
    canvas.drawColor(Color.BLACK);
    Matrix mMatrix = new Matrix();
    mMatrix.postScale(0.34f, 0.34f);
    canvas.drawBitmap(mBitmap, mMatrix, p);
    canvas.drawText("Surface View Anti alias", 100, 300, p);
    }
    View 核心代码: @Override
    protected void onDraw(Canvas canvas) {
    Paint p = new Paint();
    p.setColor(Color.WHITE);
    canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));  
    canvas.drawColor(Color.BLACK);
    Matrix mMatrix = new Matrix();
    mMatrix.postScale(0.34f, 0.34f);
    canvas.drawBitmap(mBitmap, mMatrix, p);
    canvas.drawText("View Anti alias", 100, 300, p);
    }
    两种效果差距甚大,到底surfaceview下怎么抗锯齿呢?
    附源代码  
    http://sharpidea.co.cc/GifViewTest.rar
      

  3.   

    测试过,因为surfaceview 有独立的buffer,这个缓冲的话,如果必要的话,要手动清理一下canvas区域的内容。简单的做法:canvas.drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);出现锯齿,即使绘制同一张图也会出现,应该是图的像素点,在实际转化成屏幕像素时,float计算时两次情况不一致。