1

私は2つのクラスを作成しました - 1つは拡張さ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。キャンバスに置いたこの画像を2つ変更したい

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()新しいビットマップを作成している、または何か間違ったことをしているからですか?

---編集---おおざっぱに、間違っていたのは次のとおりです。

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()、しかし機能せず、何が間違っているのかわかりました

4

1 に答える 1

3

で更新myBitmaponDraw()ます:

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インスタンスが必要であり、アクティビティ クラスで使用できるようにする必要があります。

注:invalidate()非 UI スレッドから呼び出している場合は、 を使用する必要がありますpostInvalidate()

于 2013-02-03T14:47:27.397 に答える