更改缩放SurfaceView中的插值方法

时间:2012-02-15 18:05:07

标签: android rendering resolution interpolation surfaceholder

可以使用SurfaceHolder的{​​{1}}方法以低分辨率渲染视图,然后将其放大以适合视图的实际大小。然而,缩放是通过某种插值完成的,导致一切都变得模糊 是否有任何方法可以将插值方法更改为最近邻居或仅将其关闭?

这是我的意思的一个例子,在全屏视图中用4x4表面制作:
What I want What I get
左图:这就是我想要的结果(这里通过绘制一个非过滤的位图来实现)
右图:当4x4画布缩放到全屏时会发生这种情况。

如果有兴趣的话,用于生成正确图像的示例代码:

public class ScaleView extends SurfaceView implements SurfaceHolder.Callback {
    private final static float[] points = {0,0, 2,0, 4,0, 1,1, 3,1, 0,2, 2,2, 4,2, 1,3, 3,3};
    private Paint white;
    public ScaleView(Context context) {
        super(context);
        white = new Paint();
        white.setColor(0xFFFFFFFF);
        getHolder().addCallback(this);
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){
        Canvas c = holder.lockCanvas();
        try{
            c.drawPoints(points, white);
        }finally{
            holder.unlockCanvasAndPost(c);
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder){
        holder.setFixedSize(4, 4);
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder){}
}

注意:上面的方形图案只是我想要避免的效果的一个例子。我正在寻找一个可以应用于任何具有任何内容的视图(带有曲面)的通用解决方案。

1 个答案:

答案 0 :(得分:2)

抱歉,你无法控制这个。没有定义在这些表面上进行何种缩放 - 它取决于硬件及其配置方式。此外,这种极端缩放确实应该避免,因为在某些情况下硬件不能这样做,所以你最终会在较慢的路径。 (例如,如果将表面放入叠加层,许多硬件覆盖引擎无法进行那种极端缩放。)