我试图使用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;
}
}
答案 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。根据您的设备和您触摸的像素数量,使用自定义视图可能会更快。