【问题标题】:Change Interpolation method in scaled SurfaceView在缩放的 SurfaceView 中更改插值方法
【发布时间】:2012-02-15 18:05:07
【问题描述】:

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

这是我的意思的一个例子,在全屏视图中使用 4x4 表面制作:

左图:这就是我想要的要查看的结果(此处通过绘制未过滤的位图实现)
右图:这是将 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){}
}

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

【问题讨论】:

    标签: android rendering resolution interpolation surfaceholder


    【解决方案1】:

    抱歉,您无法控制。没有定义将在这些表面上进行什么样的缩放——这取决于硬件及其配置方式。此外,确实应该避免这种极端缩放,因为在某些情况下硬件无法做到这一点,因此您最终会走上较慢的路径。 (例如,如果将表面放入叠加层中,许多硬件叠加层引擎无法进行这种极端缩放。)

    【讨论】:

    • 哦,那有点难过。我希望以一半/四分之一的分辨率渲染 GLSurfaceView 以获得更复古的低分辨率效果。
    • 先对资源进行预缩放怎么样?
    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多