Pregunta

Estoy tratando de tener una escala de imagen a cierto tamaño dependiendo del tamaño horizontal enviado a una función de actualización, pero el siguiente código no parece dimensionar la imagen correctamente.

Editar: el código:

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

}

El resultado. (El rectángulo azul es el cuadro delimitador del tamaño previsto de la imagen)

¿En qué parte me estoy equivocando?

Editar 2: Aquí están las gafas: glasses

Editar 3: Por curiosidad, lo ejecuté en mi teléfono real y obtuve un resultado muy diferente, la imagen se estiró pasó la caja azul prevista.

Editar 4: Intenté ejecutar la aplicación en algunos emuladores para ver si era una cosa de incompatibilidad de la versión de Android, pero todos parecían funcionar perfectamente. El problema de escala solo ocurre en mi teléfono (vibrante, rooteado, CM7) y mi primo (droide, también enraizado). Estos son los únicos dispositivos físicos en los que he probado, pero ambos parecen tener el mismo problema. Realmente agradecería que alguien pudiera ayudarme aquí, este es un obstáculo enorme en mi proyecto y ningún otro foros o grupos de mensajes responde.

Editar 5: Debo mencionar que en la actualización 4, el código cambió un poco, lo que solucionó el problema en los emuladores como dije, pero no funciona en dispositivos físicos. Los cambios se actualizan en el código anterior. *Desesperado por ayuda* :PAGS

Editar 6: otra actualización más, probé el mismo código en mi antiguo G1, y funciona perfectamente como se esperaba. No tengo absolutamente ninguna ni idea ahora.

¿Fue útil?

Solución 3

Encontré lo que estaba mal. La imagen debe estar en una carpeta llamada "Drawable-NODPI", de lo contrario se escalará dependiendo de DPI.

Otros consejos

¿Ha estado utilizando el directorio/res/drawable-NODPI/para almacenar sus imágenes?

Aparentemente, si usa las carpetas /Drawable-LDPI /, /Drawable-MDPI /o /Drawable-HDPI /, Android aplicará escala a la imagen cuando lo cargue dependiendo del dispositivo. La razón por la que su G1 puede funcionar es que puede no requerir ninguna escala dependiendo de la carpeta que haya usado.

Además, sus enlaces de Imgur están rotos ... también su código no parece correcto ... llamas gafas de lanzamiento sin argumentos.

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

Cambie el último parámetro de falso a verdadero. Puedes intentarlo.

Lo siguiente es que utilicé el método zoom en escala:

 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);  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top