[英]What I'm doing wrong with 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;
}
}
如果要在SurfaceView的Surface上绘制,请不要重写onDraw()
。
SurfaceViews有两个部分,Surface和View。 View部分的工作方式与View类的其他任何成员一样,遵循通常的无效/重绘序列。 通常,SurfaceView的“视图”是一个透明孔,布局代码使用该孔为Surface透出空隙。
Surface是一个完全独立的图层,默认情况下它位于View图层的后面,但可以配置为位于最上面。 它会忽略无效/刷新,并在您对其进行解锁时进行更新(或者,如果您使用的是GLES,则交换EGL缓冲区)。 因为没有与View UI的交互,所以您可以从专用渲染器线程更新Surface。
您正在将两者混合在一起。 您已经覆盖了onDraw()
,就像在创建自定义View一样 ,但是您也使用相同的功能渲染到Surafce上。
将onDraw()
重命名为doDraw()
并删除覆盖。 或者,从SurfaceView切换到普通的自定义视图,然后使用postInvalidate()
驱动更新。
画布在SurfaceView曲面上的渲染不是硬件加速的,而是在自定义View上的Canvas绘图的。 根据设备和要触摸的像素数,使用自定义视图可能会更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.