Domanda

Sto cercando di avere una scala di un'immagine a una certa dimensione a seconda della dimensione orizzontale inviato a una funzione di aggiornamento, ma il seguente codice doesnt sembrano dimensioni l'immagine correttamente.

EDIT: Il codice:

public class GlassesView extends View {

    private Paint paint;
    private BitmapFactory.Options options;
    private Bitmap bitmapOrg;
    private Bitmap target;
    private Bitmap bitmapRev;
    private Bitmap resizedBitmap;

    private int currY;

    public int glassesX;
    public int glassesY;
    public float glassesSizeX;
    public float glassesSizeY;
    private boolean drawGlasses;
    private boolean glassesMirrored;

    public GlassesView(Context context) {
        super(context);
        paint = new Paint();
        paint.setDither(false);
        paint.setAntiAlias(false);

        options = new BitmapFactory.Options();
        options.inDither = false;
        options.inScaled = false;

        bitmapOrg = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
                R.drawable.micro_glasses, options), 32, 5, false);
        bitmapRev = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
                R.drawable.glasses_reverse, options), 32, 5, false);
        drawGlasses = false;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(target, 0, 0, paint);

        boolean moving = currY < glassesY;
        if (moving) {
            currY++;
        }
        if (drawGlasses) {
            int newWidth = resizedBitmap.getWidth();
            int newHeight = resizedBitmap.getHeight();
            Paint bluey = new Paint();
            bluey.setColor(Color.argb(64, 0, 0, 255));
            canvas.drawRect(new Rect(glassesX, currY, glassesX + newWidth,
                    currY + newHeight), bluey);

            canvas.drawBitmap(resizedBitmap, glassesX, currY, paint);
        }
        if (moving) {
            invalidate();
        }
    }

    public void drawGlasses(int x1, int x2, int y, boolean mirror) {
        drawGlasses = true;
        glassesMirrored = mirror;
        if (!mirror) {
            glassesSizeX = (float) (x2 - x1) / (float) (25 - 16);
            glassesSizeY = glassesSizeX;
            glassesY = y - (int)(1*glassesSizeX);
            glassesX = (int) (x1 - (glassesSizeX * 16));
        } else {
            glassesSizeX = (float) (x1 - x2) / (float) (25 - 16);
            glassesSizeY = glassesSizeX;
            glassesY = y - (int)(1*glassesSizeX);
            glassesX = (int) (x1 - (glassesSizeX * 16));
        }

        currY = -1;

        if (!glassesMirrored) {
            resizedBitmap = Bitmap.createScaledBitmap(bitmapOrg,
                    (int) (bitmapOrg.getWidth() * glassesSizeX),
                    (int) (bitmapOrg.getHeight() * glassesSizeY), false);
        } else {
            resizedBitmap = Bitmap.createScaledBitmap(bitmapRev,
                    (int) (bitmapRev.getWidth() * glassesSizeX),
                    (int) (bitmapRev.getHeight() * glassesSizeY), false);
        }
    }

    public void setTargetPic(Bitmap targetPic) {
        target = targetPic;
    }

}

Il risultato. (il rettangolo blu è il rettangolo di selezione dell'immagine è destinato dimensioni)

Quale parte sto andando sbagliato al?

EDIT 2: Qui ci sono gli occhiali: occhiali

EDIT 3: Per curiosità, mi sono imbattuto sul mio telefono reale, e ottenuto un molto diverso risultato , l'immagine è stato allungato superato la scatola blu destinato.

EDIT 4: Ho provato a fare funzionare l'applicazione su un paio di emulatori per vedere se era un androide cosa versione di incompatibilità, ma tutti sembrava funzionare perfettamente. Il problema di scala si verifica solo sul mio cellulare (vibrante, radicata, CM7) e di mio cugino (Droid, anche radicata). Questi sono i dispositivi fisici solo ho testato su, ma entrambi sembrano avere lo stesso problema. Mi piacerebbe davvero grato se qualcuno mi potrebbe aiutare fuori qui, questo è un grande posto di blocco nel mio progetto e nessun altro forum o gruppi di messaggi stanno rispondendo.

EDIT 5: Devo dire che nell'aggiornamento 4, il codice cambiato un po ', che fissa il problema nei emulatori come ho affermato, ma non funziona su dispositivi fisici. Le modifiche vengono aggiornate nel codice di cui sopra. * disperata ricerca di aiuto * :

EDIT 6: Ancora un altro aggiornamento, ho provato lo stesso codice sul mio vecchio G1, e funziona perfettamente come previsto. Non ho assolutamente idea ora.

È stato utile?

Soluzione 3

Trovato cosa non andava. L'immagine deve essere in una cartella chiamata "drawable-nodpi", in caso contrario verrà ridimensionata a seconda DPI.

Altri suggerimenti

sei stato utilizzando il / res / drawable-nodpi / directory per memorizzare le vostre immagini?

A quanto pare se si utilizza il / drawable-ldpi /, / drawable-MDPI / o / drawable-hdpi / cartelle, Android si applicherà ridimensionamento all'immagine quando lo si carica a seconda del dispositivo. Il motivo per il vostro G1 può lavoro è che essa non può richiedere alcun ridimensionamento a seconda della cartella che hai utilizzato.

Inoltre, l'Imgur collegamenti sono rotti ... anche il codice non sembra corretto ... si chiama DrawGlasses senza argomenti.

Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, glassesWidth,   
                                           glassesHeight, matrix, false);

Cambia l'ultimo parametro da false a true. si può avere una prova.

Il seguire è che ho usato lo zoom in modo da scala:

 private void small()    {  
     int bmpWidth=bmp.getWidth();   
     int bmpHeight=bmp.getHeight();  

     Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);  

     /* 设置图片缩小的比例 */  
     double scale=0.8;  
     /* 计算出这次要缩小的比例 */   
     scaleWidth=(float) (scaleWidth*scale);   
     scaleHeight=(float) (scaleHeight*scale);   
     /* 产生reSize后的Bitmap对象 */  
     Matrix matrix = new Matrix();  
     matrix.postScale(scaleWidth, scaleHeight);  
     Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
             bmpHeight,matrix,true);  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top