2013-02-26 2 views
2

Итак, я пытаюсь установить фон SurfaceView в файл JPG. Но, похоже, он не хочет рисовать изображение, и все, что я получаю, это черный экран.Настройка изображения в SurfaceView, получение черного экрана

Здесь: мой код:

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 
    } 

Не знаю, почему он не потянет «FLoorPlan» образ Я сохраненный в папке вытяжки-MDPI.

У кого-нибудь есть предложения?

Спасибо.

EDIT: после некоторой отладки с точками останова, по-видимому, «масштабированная» переменная становится «бесконечной» по какой-то причине, и поэтому переменные newWidth и newHeight становятся меньше 0, и приложение выходит из строя.

Это только в том случае, если я перемещаю всю поверхность, созданную в контрструктор, если я оставлю код, как здесь, то он ничего не делает, пока не отображается черный экран.

Не знаю, что вызывает его, чтобы сделать это, хотя ...

ответ

9

Во-первых, вы должны реализовать интерфейс SurfaceHolder.Callback с классом MapView и установить его в качестве обратного вызова для его SurfaceHolder, чтобы сделать приложение вызвать ваш onSurfaceCreated () метод. Во-вторых, если вы хотите, чтобы ваш метод onDraw() вызывался, тогда вызывайте setWillNotDraw (false) в свой конструктор MapView.

Я сделал это следующим образом:

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-файл. Update Watch Duplicate Copy Move

+0

Спасибо, что решил! – Hallow

+2

Пока это старое, СПАСИБО. Я слишком долго бил головой по этой же проблеме. – Alastair

+0

Если вы хотите нарисовать что-то на этом фоне с фоном, u hv, чтобы удалить вызов setWillNotDraw (false) else u what u draw, wint be visible – Braj

Смежные вопросы