2011-04-02 1 views
0

Je suis en train d'écrire une vue qui devrait afficher un dessin qui semble "jamais fin". Il doit être deux fois ou trois fois l'affichage et se déplacer lentement à travers l'affichage.Android Drawable semble moche en raison de la mise à l'échelle

donc j'ai étudié quelques-uns SampleCode par Google et a trouvé les lignes importantes

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    canvasWidth = width; 
    canvasHeight = height; 
    float sf = backgroundImage.getWidth()/canvasWidth; 
    backgroundImage = Bitmap.createScaledBitmap(backgroundImage, 
     (int) (canvasWidth * sf), canvasHeight, true); 
    } 

Pour redimensionner l'image et que

 // decrement the far background 
     backgroundXPos = backgroundXPos - DELTAMOVE; 
     // calculate the wrap factor for matching image draw 
     int newFarX = backgroundImage.getWidth() - (-backgroundXPos); 
     // if we have scrolled all the way, reset to start 
     if (newFarX <= 0) { 
      backgroundXPos = 0; 
      // only need one draw 
      canvas.drawBitmap(backgroundImage, backgroundXPos, 0, null); 

     } else { 
      // need to draw original and wrap 
      canvas.drawBitmap(backgroundImage, backgroundXPos, 0, null); 
      canvas.drawBitmap(backgroundImage, newFarX, 0, null); 
     } 

Pour dessiner l'image en mouvement. Les images sont déjà en mouvement, c'est bon.

Mais, et c'est le point de ma question, l'image semble très moche. Son original est de 960 * 190 pixels par 240ppi. Il doit être dessiné dans une vue avec 80dip de hauteur et "fill_parent" largeur.

Il devrait sembler identique (et bon) sur tous les appareils. J'ai beaucoup essayé mais je ne sais pas comment rendre l'image belle.

Merci pour votre aide. Cordialement, Jusqu'à

Répondre

0

Puisque vous dites que c'est un dessin sans fin, vous écrivez probablement un jeu quelconque. Si votre image est un pixel-art type, vous ne voulez pas de mise à l'échelle; Les images de type pixel-art ne peuvent pas être mises à l'échelle et conservent leur aspect net (vous pouvez essayer d'utiliser nearest neighbor interpolation et de mettre à l'échelle un entier de l'original, ce qui peut parfois fonctionner, mais vous aurez parfois besoin de modifications manuelles). C'est le cas rare où vous auriez besoin d'avoir une ressource d'image différente pour différentes résolutions d'écran.

Sinon, vous pouvez utiliser un vector image, mais si - comme vous l'avez dit - votre original est une image haute résolution, alors l'image vectorielle ne sera probablement pas utile ici.

btw, vous voulez probablement montrer quelques captures d'écran. "Look laid" est tout aussi utile que de dire que mon code ne fonctionne pas.

+0

Merci pour votre réponse. Désolé de ne laisser aucune image. Il s'agit d'un bitmap pixel-art. Il ya juste le problème que je ne sais pas, quelle taille et la résolution de mon image devrait avoir et quel dossier (drawable, drawable-hdpi, drawable-normal-mdpi et ainsi de suite) il doit être po étudié les pages de google parler de ce sujet, mais cela ne me donne aucune idée. La largeur de l'image est la largeur de l'écran, la hauteur est définie sur 80dip. Une autre question: pourquoi est-ce le «cas rare»? – Till

+0

@Till: parce que la plupart du temps, vous utiliserez habituellement des images vectorielles ou des images qui sont lisses et peuvent donc être automatiquement mises à l'échelle. Pixel-art, d'autre part, nécessite généralement une modification manuelle de l'image redimensionnée. Essayez de désactiver le filtrage bilinéaire (et ainsi, en utilisant le filtre du plus proche voisin), et voyez si cela fonctionne mieux dans votre cas: 'Bitmap.createScaledBitmap (backgroundImage, (int) (canvasWidth * sf), canvasHeight, false);'. Assurez-vous de redimensionner uniquement un entier ou une petite fraction de multiples de l'image originale (par ex.si original est 100x100, vous pouvez essayer 300x300, 200x200, 50x50, 25x25, 20x20) –

+0

@Till: essayez de jouer dans Photoshop ou GIMP ou quel que soit votre éditeur d'image préféré, et essayez de trouver un paramètre qui semble acceptable, puis essayez pour reproduire ce paramètre dans Android (ou simplement expédier plusieurs bitmaps si vous ne pouvez pas reproduire le paramètre dans Android). Assurez-vous d'utiliser le filtre voisin le plus proche ou un filtre spécialisé pixel-art (p.ex. scale2x), car vous ne voulez pas les bords flous que les autres filtres rescale font (ces filtres sont utiles pour les photos, où les bords flous "résolution de l'image, dans votre cas, vous voulez un bord net et net) –

0

Juste une supposition, mais au lieu de passer une peinture null à votre DrawBitmap() appelle, essayez de faire une peinture avec filtrage bitmap désactivé:

Paint p = new Paint(); 
p.setFilterBitmap(false); 
canvas.drawBitmap(backgroundImage, backgroundXPos, 0, p); 

espoir qui aide.

+0

Merci pour votre indice.Juste essayé et il ressemble à avant. – Till

Questions connexes