java - 为什么我的图像缩放不正确?

标签 java android android-layout android-canvas

我正在尝试根据发送到更新函数的水平尺寸将图像缩放到特定尺寸,但以下代码似乎无法正确调整图像尺寸。

编辑:代码:

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

}

The result. (蓝色矩形是图像预期大小的边界框)

我哪里出错了?

编辑 2: 这是眼镜:glasses

编辑 3: 出于好奇,我在我的真实手机上运行它,得到了一个 much different result ,图像被拉伸(stretch)通过了预期的蓝色框。

编辑 4: 我尝试在几个模拟器上运行该应用程序,看看它是否是 Android 版本不兼容的问题,但它们似乎都能完美运行。缩放问题只发生在我的手机(Vibrant,root,CM7)和我堂兄的手机(Droid,也 root)上。这些是我测试过的唯一物理设备,但它们似乎都有相同的问题。 如果有人能在这里帮助我,我将不胜感激,这是我项目中的一个巨大障碍,没有其他论坛或消息组响应。

编辑 5: 我应该提到,在更新 4 中,代码发生了一些变化,如我所说,这解决了模拟器中的问题,但不适用于物理设备。更改在上面的代码中更新。 *迫切需要帮助* :P

编辑 6: 又一次更新,我在我的旧 G1 上测试了相同的代码,它按预期完美运行。我现在完全不知道。

最佳答案

您是否一直在使用/res/drawable-nodpi/目录来存储图像?

显然,如果您使用/drawable-ldpi/、/drawable-mdpi/或/drawable-hdpi/文件夹,Android 将在您加载图像时根据设备对图像应用缩放。您的 G1 可能工作的原因是它可能不需要任何缩放,具体取决于您使用的文件夹。

此外,您的 IMGUR 链接已损坏...您的代码似乎也不正确...您调用 DrawGlasses 时不带任何参数。

关于java - 为什么我的图像缩放不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6326412/

相关文章:

Java - 基于第一列组织二维数组的问题

java - 如何从 Java android 启动 Kotlin Activity

使用 Circleci 构建的 Android 持续集成失败并出现错误 android ndk 未配置

android - 如何在 Android 上的应用程序启动器图标上显示气球计数器

java - 使用SQLite数据库之前先创建它

Android Studio 从右到左 ListView

java - Eclipse Indigo 安装 m2e-wtp 插件时出现问题

java - 来自 Java 的 kerberos - 为当前经过身份验证的用户获取主题

java - JSON 解析和 NullPointer

android - 带有自定义 TextView 的 Tablayout,在首次启动时未更改选定状态颜色