Frage

Ich versuche, ein Bild auf eine bestimmte Größe zu skalieren, abhängig von der horizontalen Größe, die an eine Aktualisierungsfunktion gesendet wird, aber der folgende Code scheint die Größe des Bildes nicht richtig anzupassen.

BEARBEITEN:Der 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;
    }

}

Das Ergebnis. (Das blaue Rechteck ist der Begrenzungsrahmen der beabsichtigten Größe des Bildes)

Bei welchem ​​Teil mache ich einen Fehler?

EDIT 2:Hier sind die Gläser: glasses

EDIT 3:Aus Neugier habe ich es auf meinem tatsächlichen Telefon ausgeführt und eins erhalten ganz anderes Ergebnis, wurde das Bild über das vorgesehene blaue Kästchen hinaus gestreckt.

EDIT 4:Ich habe versucht, die App auf einigen Emulatoren auszuführen, um festzustellen, ob es sich um eine Inkompatibilität mit der Android-Version handelt, aber sie schienen alle perfekt zu funktionieren.Das Skalierungsproblem tritt nur auf meinem Telefon (Vibrant, gerootet, CM7) und dem meines Cousins ​​(Droid, ebenfalls gerootet) auf.Dies sind die einzigen physischen Geräte, auf denen ich getestet habe, aber beide scheinen das gleiche Problem zu haben.Ich würde mich sehr freuen, wenn mir hier jemand weiterhelfen könnte, da dies eine große Hürde in meinem Projekt darstellt und keine anderen Foren oder Nachrichtengruppen antworten.

EDIT 5:Ich sollte erwähnen, dass sich in Update 4 der Code etwas geändert hat, wodurch das Problem in den Emulatoren behoben wurde, wie ich sagte, aber auf physischen Geräten nicht funktioniert.Änderungen werden im obigen Code aktualisiert. *verzweifelt um Hilfe* :P

EDIT 6:Noch ein Update, ich habe den gleichen Code auf meinem alten G1 getestet und er funktioniert perfekt wie erwartet.Ich habe jetzt absolut keine Ahnung.

War es hilfreich?

Lösung 3

Habe herausgefunden, was falsch war.Das Bild muss sich in einem Ordner namens „drawable-nodpi“ befinden, ansonsten wird es abhängig von der DPI skaliert.

Andere Tipps

Haben Sie das Verzeichnis /res/drawable-nodpi/ zum Speichern Ihrer Bilder verwendet?

Wenn Sie die Ordner /drawable-ldpi/, /drawable-mdpi/ oder /drawable-hdpi/ verwenden, wendet Android offenbar je nach Gerät eine Skalierung auf das Bild an, wenn Sie es laden.Der Grund dafür, dass Ihr G1 möglicherweise funktioniert, besteht darin, dass je nach verwendetem Ordner möglicherweise keine Skalierung erforderlich ist.

Außerdem sind Ihre IMGUR-Links defekt ...Außerdem scheint Ihr Code nicht korrekt zu sein ...Sie rufen DrawGlasses ohne Argumente auf.

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

Ändern Sie den letzten Parameter von „false“ in „true“.Du kannst es versuchen.

Im Folgenden habe ich die Methode zum Vergrößern nach Maßstab verwendet:

 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);  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top