2 votes

Réglage de l'arrière-plan de l'image dans SurfaceView, obtention d'un écran noir

J'essaie donc de définir l'arrière-plan d'un SurfaceView sur un fichier JPG. Mais il ne semble pas vouloir dessiner l'image, et tout ce que j'obtiens est un écran noir.

Voici mon code :

    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
    }

Je ne sais pas pourquoi il ne dessine pas l'image du "plan d'étage" que j'ai enregistrée dans le dossier drawable-mdpi.

Quelqu'un a des suggestions ?

Gracias.

EDIT : Après avoir fait un peu de débogage avec des points d'arrêt, il semble que la variable "scaled" devienne "Infinity" pour une raison quelconque et, de ce fait, les variables newWidth et newHeight deviennent inférieures à 0 et l'application se plante.

C'est seulement si je déplace toute la surfaceCreated dans le contstructeur, si je laisse le code tel qu'il est ici, il ne fait rien d'autre que d'afficher un écran noir.

Je n'ai aucune idée de la raison pour laquelle il fait ça...

9voto

QArea Points 1991

Premièrement, vous devez implémenter l'interface SurfaceHolder.Callback avec votre classe MapView et la définir comme callback pour son SurfaceHolder afin que l'application appelle votre méthode onSurfaceCreated(). Ensuite, si vous voulez que votre méthode onDraw() soit appelée, appelez setWillNotDraw(false) dans le constructeur de votre MapView.

Je l'ai fait comme suit :

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
    }
}

Et ça marche bien. NOTE : Déplacement de la classe MapView vers un fichier *.java distinct. Update Watch Duplicate Copy Move

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X