Почему мое изображение не имеет правильного масштабирования?

StackOverflow https://stackoverflow.com/questions/6326412

Вопрос

Я пытаюсь иметь масштаб изображений до определенного размера в зависимости от горизонтального размера, отправленного функции обновления, но следующий код, кажется, неправильно определяет изображение.

Изменить: код:

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

}

Результат. (Синий прямоугольник является ограничивающей коробкой намеренного размера изображения)

В какой части я ошибаюсь?

РЕДАКТИРОВАТЬ 2: Вот очки: glasses

Изменить 3: Из любопытства я запустил его на своем настоящем телефоне и получил Большой другой результат, Изображение было растянуто мимо намеченной синей коробки.

РЕДАКТИРОВАТЬ 4: Я попытался запустить приложение на нескольких эмуляторах, чтобы увидеть, была ли это несовместимость версии Android, но все они, казалось, работали отлично. Проблема масштабирования возникает только на моем телефоне (яркий, укоренившийся, CM7) и моего двоюродного брата (Droid, также укоренившиеся). Это единственные физические устройства, на которых я тестировал, но, похоже, у них оба одинаковая проблема. Я бы очень признателен, если бы кто -то мог мне помочь здесь, это огромный препятствие в моем проекте, и никакие другие форумы или группы сообщений не отвечают.

Редактировать 5: Я должен упомянуть, что в обновлении 4 код немного изменился, что исправило проблему в эмуляторах, как я заявил, но не работает на физических устройствах. Изменения обновляются в коде выше. *Отчаянно нуждается в помощи*

РЕДАКТИРОВАТЬ 6: Еще одно обновление, я проверил тот же код на своем старом G1, и оно работает отлично, как и ожидалось. Сейчас я абсолютно понятия не имею.

Это было полезно?

Решение 3

Нашел то, что случилось. Изображение должно быть в папке, называемой «нарисовано-нодпи», в противном случае оно будет масштабировано в зависимости от DPI.

Другие советы

Вы использовали каталог/res/drawable-nodpi/для хранения ваших изображений?

По-видимому, если вы используете /Drawable-Ldpi /, /Drawable-Mdpi /или /Drawable-HDPI /папки, Android будет применять масштабирование к изображению при загрузке его в зависимости от устройства. Причина, по которой ваш G1 может работать, заключается в том, что он не может потребовать какого -либо масштабирования в зависимости от используемой вами папки.

Кроме того, ваши ссылки на imgur разорваны ... также ваш код не кажется правильным ... вы называете Drawlagses без аргументов.

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

Измените последний параметр от false на True. Вы можете попробовать.

Следуем, я использовал Zoom в методе по масштабе:

 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);  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top