我创建了两个类 - 一个是扩展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(),但它不起作用,我现在知道我做错了什么
答案 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()
。