2

さて、SurfaceViewの背景をJPGファイルに設定しようとしています。しかし、それは画像を描きたくないようで、私が得るのは黒い画面だけです。

ここに:私のコード:

    public class FloorplanActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MapView mapView = new MapView(getApplicationContext());
    setContentView(mapView);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.floorplan, menu);
    return true;
}

class MapView extends SurfaceView{

    Rect testRectangle1 = new Rect(0, 0, 50, 50);
    Bitmap scaled;
    int x;
    int y;

    public MapView(Context context) {
        super(context);

    }

    public void surfaceCreated(SurfaceHolder arg0){
        Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.floorplan);
        float scale = (float)background.getHeight()/(float)getHeight();
        int newWidth = Math.round(background.getWidth()/scale);
        int newHeight = Math.round(background.getHeight()/scale);
        scaled = Bitmap.createScaledBitmap(background, newWidth, newHeight, true);
    }

 public void onDraw(Canvas canvas) {
        canvas.drawBitmap(scaled, 0, 0, null); // draw the background
    }

drawable-mdpiフォルダーに保存した「フロアプラン」画像が描画されない理由がわかりません。

誰か提案がありますか?

ありがとう。

編集:ブレークポイントを使用してデバッグを行った後、「scaled」変数が何らかの理由で「Infinity」になり、newWidth変数とnewHeight変数が0未満になり、アプリケーションがクラッシュしたようです。

これは、surfaceCreated全体をコンストラクターに移動した場合のみです。コードをここに残しておくと、黒い画面が表示される以外に何も起こりません。

何が原因でそれが行われているのかわかりません...

4

1 に答える 1

9

まず、MapViewクラスを使用してSurfaceHolder.Callbackインターフェイスを実装し、それをSurfaceHolderのコールバックとして設定して、アプリがonSurfaceCreated()メソッドを呼び出すようにする必要があります。次に、onDraw()メソッドを呼び出す場合は、MapViewのコンストラクターでsetWillNotDraw(false)を呼び出します。

私はそれを次のように行いました:

public class MapView extends SurfaceView implements SurfaceHolder.Callback {

    private Bitmap scaled;

    public MapView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        getHolder().addCallback(this);
    }

    public void onDraw(Canvas canvas) {
        canvas.drawBitmap(scaled, 0, 0, null); // draw the background
    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        Bitmap background = BitmapFactory.decodeResource(getResources(), R.drawable.dr);
        float scale = (float) background.getHeight() / (float) getHeight();
        int newWidth = Math.round(background.getWidth() / scale);
        int newHeight = Math.round(background.getHeight() / scale);
        scaled = Bitmap.createScaledBitmap(background, newWidth, newHeight, true);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Callback method contents
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Callback method contents
    }
}

そしてそれはうまくいきます。 注: MapViewクラスを別の*.javaファイルに移動しました。ウォッチの複製コピー移動を更新

于 2013-02-26T15:31:17.650 に答える