Изменить метод интерполяции в масштабированном SurfaceView - PullRequest
2 голосов
/ 15 февраля 2012

Можно визуализировать вид с низким разрешением, а затем увеличить его до фактического размера, используя метод setFixedSize() для SurfaceHolder.Однако масштабирование выполняется с помощью некоторой интерполяции, в результате чего все становится размытым.
Есть ли способ изменить метод интерполяции на ближайший сосед или просто отключить его?

Вот пример того, что я имею в виду, Сделанный с поверхностью 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 Ответ

2 голосов
/ 26 февраля 2012

Извините, вы не можете это контролировать. Не определено, какое масштабирование будет выполнено на этих поверхностях - это зависит от аппаратного обеспечения и того, как оно настроено. Кроме того, такого рода экстремального масштабирования действительно следует избегать, поскольку в некоторых случаях аппаратное обеспечение не может этого сделать, поэтому вы окажетесь на более медленных путях. (Например, если поверхности накладываются на оверлеи, многие механизмы аппаратного оверлея не могут выполнить такое экстремальное масштабирование.)

...