
但是,我已经了解到在onDraw之外绘制画布更好,只需更新onDraw中的画布.
我知道这显然是错误的(因为它不起作用),但我将如何完成我正在尝试做的事情:
@OverrIDe public voID onDraw(Canvas c) { c = this.newCanvas; super.onDraw(c);}解决方法 public class GameLoopThread extends Thread {private GameVIEw vIEw;private boolean running = false;public GameLoopThread(GameVIEw vIEw) { this.vIEw = vIEw;}public voID setRunning(boolean run) { running = run;}@OverrIDepublic voID run() { while (running) { Canvas c = null; try { c = vIEw.getHolder().lockCanvas(); synchronized (vIEw.getHolder()) { if (c != null) { vIEw.onDraw(c); } } } finally { if (c != null) { vIEw.getHolder().unlockCanvasAndPost(c); } } try { sleep(10); } catch (Exception e) {} }}} 然后让你的活动中的那个线程做这样的事情
@OverrIDepublic voID onCreate(Bundle savedInstanceState) { requestwindowFeature(Window.FEATURE_NO_Title); getwindow().setFlags(WindowManager.LayoutParams.FLAG_FulLSCREEN,WindowManager.LayoutParams.FLAG_FulLSCREEN); super.onCreate(savedInstanceState); setContentVIEw(new GameVIEw(GameActivity.this));} 然后在GameVIEwClass做这样的事情
public class GameVIEw extends SurfaceVIEw { private SurfaceHolder holder; private GameLoopThread gameLoopThread; public GameVIEw(Context context) { super(context); gameLoopThread = new GameLoopThread(this); holder = getHolder(); holder.addCallback(new SurfaceHolder.Callback() { @OverrIDe public voID surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; gameLoopThread.setRunning(false); while (retry) { try { gameLoopThread.join(); retry = false; } catch (InterruptedException e) { } } } @OverrIDe public voID surfaceCreated(SurfaceHolder holder) { gameLoopThread.setRunning(true); gameLoopThread.start(); } @OverrIDe public voID surfaceChanged(SurfaceHolder holder,int format,int wIDth,int height) { } }); } @OverrIDe protected voID onDraw(Canvas canvas) { //Do Drawing }} 这里重要的是线程是手动自动调用onDraw()方法,并锁定画布,绘制它,然后发布它.如果你不需要超快的刷新率,那么你最好做这样的事情:
@OverrIDe public voID onDraw(Canvas c) { c = this.getHolder().lockCanvas(); if (c != null) { //draw on canvas } if (c != null) { this.getHolder().unlockCanvasAndPost(c); } } 我只是不知道最后一点是否有效,从未测试过.另外如果你想在绘图方法之外进行绘图,你可以在一个线程中运行你的更新(在你的画布上绘图),并且每次调用onDraw方法时都要检查Canvas是否准备好它帖子.例如,你的线程有一个布尔值,一旦画布被拉动它被设置为false,所以线程将绘制一个新的,但一旦完成绘图设置布尔值为true.在ondraw方法中检查boolean是否为true以及是否拉动画布.
总结以上是内存溢出为你收集整理的Android – 用于onDraw的Predraw画布全部内容,希望文章能够帮你解决Android – 用于onDraw的Predraw画布所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)