在SurfaceView中设置图像背景,获得黑屏

时间:2013-02-26 12:59:39

标签: android image background surfaceview

好的,我试图将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文件夹中的图像。

有人有任何建议吗?

感谢。

编辑:在使用断点进行一些调试之后,它似乎是"缩放"变量变为" Infinity"由于某种原因,newWidth和newHeight变量小于0,应用程序崩溃。

只有当我将整个surfaceCreated移动到contstructor中时,如果我将代码留在这里,那么它就不会显示黑屏。

不知道导致它做什么但是......

1 个答案:

答案 0 :(得分: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文件中。 更新观看重复复制移动