Почему мое изображение не имеет правильного масштабирования?
-
27-10-2019 - |
Вопрос
Я пытаюсь иметь масштаб изображений до определенного размера в зависимости от горизонтального размера, отправленного функции обновления, но следующий код, кажется, неправильно определяет изображение.
Изменить: код:
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, но все они, казалось, работали отлично. Проблема масштабирования возникает только на моем телефоне (яркий, укоренившийся, 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);