我在使用SurfaceView时遇到了什么问题?

时间:2015-07-26 16:53:56

标签: android surfaceview

我试图使用SurfaceView绘制一些东西,看起来像这样的绘画越来越慢,而不是使用onDraw和View Class的无效。

所以我需要知道我是否可以加快速度。 这是我的代码。

public class ViewCentroMesa extends SurfaceView implements Runnable
{



    // Bucle pintar
    Thread t = null;
    SurfaceHolder holder;
    boolean isItOk = false;

    public ViewCentroMesa(MesaActivity mesaActivity, Mesa mesa) 
    {
        super(mesaActivity.getContext());

        setZOrderOnTop(true);

        setWillNotDraw(false);

        holder = getHolder();

        holder.setFormat(PixelFormat.TRANSLUCENT);

        isItOk = true;
        t = new Thread(this);
        t.start();

}

@Override
protected void onDraw(Canvas canvas) 
{
    super.onDraw(canvas);

    /* Tapete */
    try 
    {
        dibujarTapete(canvas);  
    } catch (Exception e) {}

    this.sentido = mesaActivity.getSentidoBitmap();
    this.miIcono = mesaActivity.getMiIcono();
    this.mazo = mesaActivity.getMazo();

    /* Cartas A Robar */
    try 
    {
        dibujarCartasARobar(canvas);
    } catch (Exception e) {dibujarCartasARobar(canvas);}

    /* Sentido */
    try 
    {
        dibujarSentido(canvas);
    } catch (Exception e) {}

    /* Mi icono */
    try 
    {
        dibujarMiIcono(canvas);
    } catch (Exception e) {}

    //if (getMesa().isJuegoAcabado()) return;
    boolean cond = mesa.isMiJugadorAcabo();
    if (cond) return;


    /*Cartas Tiradas */
    try 
    {
        dibujarCartasTiradas(canvas);
    } catch (Exception e) {e.printStackTrace();}

    /*Carta mesa */
    try 
    {
        dibujarCartaMesa(canvas);
    } catch (Exception e) {}

    /* Carta Tirada*/
    try 
    {
        dibujarCartaTirada(canvas);
    } catch (Exception e) {}

    /* Mazo */
    try 
    {
        dibujarMazo(canvas);
    } catch (Exception e) {}

    /* Repartiendo o robando*/
    try 
    {
        dibujarAnimacionRobarRepartir(canvas);
    } catch (Exception e) {}

}

@SuppressLint("WrongCall")
@Override
public void run() 
{
    while (true)
    {
        // Dibujar
        if (!holder.getSurface().isValid())continue;
        if (!isItOk) continue;
        Canvas c = holder.lockCanvas();
        synchronized (holder) {
            onDraw(c);
        }
        holder.unlockCanvasAndPost(c);

        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

public void pause ()
{
    //isItOk = false;
}

public void resume ()
{
    //isItOk = true;
}

}

1 个答案:

答案 0 :(得分:1)

如果要在SurfaceView的Surface上绘制,请不要覆盖onDraw()

SurfaceViews有两个部分,Surface和View。 View部分的工作方式与View类的任何其他成员一样,遵循通常的无效/重绘序列。通常情况下,SurfaceView的视图是一个透明的孔,布局代码使用它来留下Surface显示的间隙。

Surface是一个完全独立的图层,默认情况下位于View图层后面,但可以配置为位于顶部。它会忽略invalidate / refresh,无论何时解锁它都会更新(如果你使用GLES,则交换EGL缓冲区)。由于没有与View UI的交互,您可以从专用的渲染器线程更新Surface。

你把两者混合在一起。您已覆盖onDraw(),就好像您正在创建custom View,但您也使用相同的功能渲染到Surafce。

onDraw()重命名为doDraw()并删除覆盖。或者,从SurfaceView切换到普通的自定义视图,并使用postInvalidate()

来推动更新

在SurfaceView Surface上绘制的画布不是硬件加速的,而是在自定义视图上绘制Canvas。根据您的设备和您触摸的像素数量,使用自定义视图可能会更快。

您还可以通过使用较小的Surface并让硬件对其进行缩放来加速Surface渲染。 (demoblog post