Android – 用于onDraw的Predraw画布

Android – 用于onDraw的Predraw画布,第1张

概述我曾经在onDraw方法的 ImageView中进行绘图. 但是,我已经了解到在onDraw之外绘制画布更好,只需更新onDraw中的画布. 我知道这显然是错误的(因为它不起作用),但我将如何完成我正在尝试做的事情: @Override public void onDraw(Canvas c) { c = this.newCanvas; super.onDraw(c);} public 我曾经在onDraw方法的 ImageVIEw中进行绘图.
但是,我已经了解到在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画布所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1126655.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存