Android - onDraw()中的invalidate()

时间:2013-02-03 14:42:40

标签: android android-canvas android-view android-image

我创建了两个类 - 一个是扩展SurfaceView的类,并且有一个方法onDraw(),我在其中绘制了一个图像:

public class Board extends SurfaceView{

    public BitmapFactory myBitmapFactory = new BitmapFactory();

    public  Bitmap myBitmap = new Bitmap;
    public Board(Context context) {
        super(context);
        setFocusable(true);
    }
    //here i implement all the abstract classes, which are not important now

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        myBitmap = Bitmap.createScaledBitmap(myBitmapFactory.decodeResource(getResources(), R.drawable.image), 90, 90, false);
        Paint paint = new Paint();
        canvas.drawBitmap(myBitmap, 20, 20, paint);
    }
    public void setBitmap(Bitmap b){
        this.myBitmap = b;
    }
}

我还有我的活动类,在点击按钮后运行方法changeImage。我想要两个更改我放在画布上的图像

public class MyActivity extends Activity {
    public Context context = this;
    public Board board;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start_game);
    }
    public void changeImage(View view){
        Bitmap tmpBitmap = new Bitmap();
        BitmapFactory tmpBitmapFactory = new BitmapFactory();
        tmpBitmap = Bitmap.createScaledBitmap(tmpBitmapFactory.decodeResource(getResources(), R.drawable.image2), 130, 130, false);
        board.setBitmap(tmpBitmap);
        board.invalidate();
    }
}

但是在调用方法changeImage之后没有任何改变 - 图像与开头的图像相同。我也尝试在invalidate()方法中使用setBitmap(),但它也不起作用。这是因为每次我打电话invalidate()我都在创建一个新的位图,或者我做错了什么?

--- --- EDIT 因此,错误的是:

myBitmap = Bitmap.createScaledBitmap(myBitmapFactory.decodeResource(getResources(), R.drawable.image), 90, 90, false);

一直设置相同的图像。我改变了它,但仍然无效()那些工作。我的意思是图像没有变化。我正在寻找其他主题的结果,但我找不到任何解决方案,现在我的课程看起来像这样:

  public class Board extends SurfaceView{


       public BitmapFactory myBitmapFactory = new BitmapFactory();
       public  Bitmap myBitmap = Bitmap.createScaledBitmap(myBitmapFactory.decodeResource(getResources(), R.drawable.image), size, size, false);
    public int tmp = 0;
        public Paint paint = new Paint();
       protected void onDraw(Canvas canvas) {
           Paint paint = new Paint();
           canvas.drawBitmap(myBitmap, 50, 50, paint);
    }
    public void setBitmaps(Bitmap one){
            this.paint = new Paint();
            this.myBitmap = one;
            this.tmp=4;
            this.invalidate();

        }

我的活动中的方法changeImage():

public void changeImage(View view){
        Bitmap tmpBitmap1 = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.blue), 230, 230, false);
myGameBoard.setBitmaps(tmpBitmap1);

}

我尝试使用:invalidate(),postInvalidate(),但它不起作用,我现在知道我做错了什么

1 个答案:

答案 0 :(得分:3)

您在myBitmap更新onDraw()

myBitmap = Bitmap.createScaledBitmap(myBitmapFactory.decodeResource(getResources(), R.drawable.image), 90, 90, false);

因此,您仍然不会使用更新后的图片,因为您直接使用其他图片覆盖它...


旧答案,由于固定问题现已过时)
您的示例代码中似乎还有其他内容。在setBitmap()中,您将新位图存储在pawnBitmap中。在onDraw()方法中,您不使用pawnBitmap。因此,预计不会发生任何变化,因为您不使用更改的值...


旧答案,由于问题的变化而现已过时
您正尝试使用以下方法调用静态类方法:

Board.setBitmap(tmpBitmap);
Board.invalidate();

(我想知道为什么你没有得到编译错误......或者你忘记提及它们了吗?)
由于Board是您班级的名称。相反,您需要调用实例方法。

Board board = ...
board.setBitmap(tmpBitmap);
board.invalidate();

这显然需要board实例,您需要在活动类中使用该实例。

注意:如果您从非UI线程调用invalidate(),则需要使用postInvalidate()