Question

Je suis en train d'avoir une échelle d'image à une certaine taille en fonction de la taille horizontale envoyé à une fonction de mise à jour, mais le doesnt de code suivant semble à la taille de l'image correctement.

EDIT: Le code:

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

}

le résultat. (Le rectangle bleu étant la zone de délimitation de l'intention de l'image taille)

Quelle partie que je vais mal à?

EDIT 2: Voici les verres: verres

EDIT 3: Par curiosité, je l'ai couru sur mon téléphone lui-même, et a obtenu un très différent résultat , l'image a été étiré passé la boîte bleue destinée.

EDIT 4: J'ai essayé de lancer l'application sur quelques émulateurs pour voir si elle était une chose d'incompatibilité de version Android, mais ils semblaient tous fonctionner parfaitement. La question de la mise à l'échelle ne se produit que sur mon téléphone (Vibrant, enraciné, CM7) et de mon cousin (Droid, aussi enraciné). Ce sont les seuls dispositifs physiques que j'ai testé, mais ils semblent tous deux avoir le même problème. J'apprécierais vraiment si quelqu'un pourrait me aider, c'est un énorme barrage routier dans mon projet et pas d'autres forums ou groupes de messages réagissent.

EDIT 5: Je dois mentionner que dans la mise à jour 4, le code a changé un peu, ce qui a résolu le problème dans les émulateurs comme je l'ai dit, mais ne fonctionne pas sur les appareils physiques. Les changements sont mis à jour dans le code ci-dessus. * désespérément besoin d'aide * : P

EDIT 6: Une autre mise à jour, je l'ai testé le même code sur mon vieux G1, et il fonctionne parfaitement comme prévu. Je n'ai absolument aucune idée maintenant.

Était-ce utile?

La solution 3

trouvé ce qui était erroné. L'image doit être dans un dossier appelé « drawable-nodpi », sinon il sera mis à l'échelle en fonction de DPI.

Autres conseils

vous avez utilisé le / res / drawable-nodpi / répertoire pour stocker vos images?

Apparemment, si vous utilisez les / drawable-LDPI /, / drawable-mdpi / ou / drawable-hdpi / dossiers, Android appliquera mise à l'échelle à l'image lorsque vous le chargez en fonction de l'appareil. La raison pour laquelle votre G1 peut fonctionner est qu'il ne peut pas exiger une mise à l'échelle en fonction du dossier que vous avez utilisé.

En outre, votre Imgur liens sont cassés ... aussi votre code ne semble pas correct ... vous appelez DrawGlasses sans arguments.

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

Modifier le dernier paramètre de false à true. vous pouvez essayer.

Le suivi est utilisé i zoom méthode échelle:

 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);  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top