在缩放的SurfaceView中更改插值方法

3
可以使用SurfaceHoldersetFixedSize()方法在低分辨率下呈现视图,然后将其缩放以适应实际视图的大小。但是,缩放会使用某种插值方法,导致所有内容模糊。
是否有任何方法可以更改插值方法为最近邻或者关闭它?
这是一个示例,使用全屏视图中的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){}
}

注意:上面的方格图案只是我想要避免的效果的示例。我正在寻找一种通用解决方案,可应用于任何具有SurfaceHolder的视图并带有任何内容。
1个回答

2

抱歉,您无法控制此操作。这些表面将被执行何种缩放并未定义--它取决于硬件和其配置方式。此外,应该避免进行过度的缩放,因为在某些情况下,硬件无法承受,导致速度变慢。(例如,如果表面被放入覆盖层中,则许多硬件覆盖引擎无法进行这种极端缩放。)


哦,那有点遗憾。我希望能够以一半/四分之一的分辨率渲染GLSurfaceView,以获得更具复古低分辨率效果。 - Jave
1
先预先缩放资源怎么样? - snapfractalpop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接