Я пытаюсь настроить масштаб изображения до определенного размера в зависимости от размера по горизонтали, отправляемого в функцию обновления, но следующий код, похоже, не правильно масштабирует изображение.
РЕДАКТИРОВАТЬ: код:
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:
Вот очки:
РЕДАКТИРОВАТЬ 3:
Из любопытства я запустил его на своем реальном телефоне и получил сильно отличающийся результат , изображение было растянуто за пределы предполагаемой синей рамки.
РЕДАКТИРОВАТЬ 4:
Я попытался запустить приложение на нескольких эмуляторах, чтобы увидеть, было ли это несовместимостью с версией Android, но все они, казалось, работали отлично. Проблема масштабирования возникает только на моем телефоне (Vibrant, root, CM7) и моей кузине (Droid, также root). Это единственные физические устройства, на которых я тестировал, но у них, похоже, одна и та же проблема.
Я был бы очень признателен, если бы кто-то смог мне здесь помочь, это огромное препятствие в моем проекте, и никакие другие форумы или группы сообщений не отвечают.
РЕДАКТИРОВАТЬ 5:
Следует отметить, что в обновлении 4 код немного изменился, что, как я уже говорил, исправило проблему в эмуляторах, но не работает на физических устройствах. Изменения обновляются в коде выше. * отчаянно нуждаются в помощи *: P
РЕДАКТИРОВАТЬ 6:
Еще одно обновление, я протестировал тот же код на моем старом G1, и он работает отлично, как и ожидалось. У меня сейчас нет абсолютно никакой подсказки.