【问题标题】:How to access canvas width outside of the onDraw method Android如何在onDraw方法Android之外访问画布宽度
【发布时间】:2014-06-26 18:39:19
【问题描述】:

我有以下代码:

Bitmap right1;

public TicTacToe(Context context) {
    super(context);
    right1 = BitmapFactory.decodeResource(getResources(), R.drawable.plus);
    int width = right1.getWidth();
    int height = right1.getHeight();
}

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    canvas.drawColor(Color.WHITE);
    right1 = Bitmap.createScaledBitmap(right1, canvas.getWidth()/3, canvas.getWidth()/3, false);
    canvas.drawBitmap(right1, (canvas.getWidth() - (canvas.getWidth()/3)), 0, null);
    invalidate();
}

我想根据画布的宽度重新调整名为“right1”的位图。我成功地这样做了,但是执行此操作的代码行是 onDraw 方法下的第三行。那行代码的问题在于,当我只想运行一次时,它会不断循环。理想情况下,我想将该行代码放在 TicTacToe 方法中,但我不确定如何在 TicTacToe 方法中初始化画布,以便获得画布宽度。

【问题讨论】:

    标签: java android canvas initialization width


    【解决方案1】:

    你不需要在构造函数中做这些事情,只需在 onDraw() 方法中添加条件。

    @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawColor(Color.WHITE);
    
            if(right1==null){
                right1 = Bitmap.createScaledBitmap(right1, canvas.getWidth() / 3, canvas.getWidth() / 3, false);
                canvas.drawBitmap(right1, (canvas.getWidth() - (canvas.getWidth() / 3)), 0, null);
                invalidate();
            }
        }
    

    【讨论】:

    • 这样会更好,但代码会一直检查这个 if 语句。所以最好在构造函数中初始化一次,而不必在 onDraw 方法中检查它
    • 因为 onDraw() 处于无限调用状态,所以一旦你绘制不调用 invalidate() 方法,所以我更新代码并将 invalide() 调用放入 if() 块中,现在它将调用只有一次
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2013-11-06
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多