Проблема при масштабировании изображения с использованием матрицы в ImageView - PullRequest
2 голосов
/ 11 декабря 2010

У меня есть следующий фрагмент кода в методе onCreate класса, расширяющего Activity:

 ImageView view = (ImageView) findViewById(R.id.ImageView01);

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeResource(getResources(),
R.drawable.sample_landscape, bmpFactoryOptions);

Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();

Log.v("IMAGEVIEWERMATRIX", "Display Width: " + display.getWidth());
Log.v("IMAGEVIEWERMATRIX", "Display Height: " + display.getHeight());

Log.v("IMAGEVIEWERMATRIX", "BMP Width: " + bmpFactoryOptions.outWidth);
Log.v("IMAGEVIEWERMATRIX", "BMP Height: " + bmpFactoryOptions.outHeight);

if (bmpFactoryOptions.outWidth > width || bmpFactoryOptions.outHeight > height) {
    float heightRatio = (float) height / (float) bmpFactoryOptions.outHeight;
    float widthRatio = (float) width / (float) bmpFactoryOptions.outWidth;

    // WHY
    heightRatio = heightRatio / 1.5f;
    widthRatio = widthRatio / 1.5f;

    Log.v("IMAGEVIEWERMATRIX", "heightRatio:" + heightRatio);
    Log.v("IMAGEVIEWERMATRIX", "widthRatio: " + widthRatio);

    float scale = widthRatio;
    if (heightRatio < widthRatio) {
        scale = heightRatio;
    }

    matrix.setScale(scale, scale);
    Log.v("IMAGEVIEWERMATRIX", "Scale: " + scale);
} else {
    Log.v("IMAGEVIEWERMATRIX", "NOTNOTNOT");
    matrix.setTranslate(1f, 1f);
}

Bitmap realBmp = BitmapFactory.decodeResource(getResources(),
R.drawable.sample_landscape);
view.setImageBitmap(realBmp);
view.setImageMatrix(matrix);

Когда я запускаю его, изображение появляется на экране в масштабе, соответствующем размеру. Моя проблема в том, что мне нужно отрегулировать шкалу на 1,5, чтобы это было правильно.

heightRatio = heightRatio / 1.5f;
widthRatio = widthRatio / 1.5f;

Моя интуиция заключается в том, что это связано с плотностью дисплея устройства, но я не могу понять, зачем мне это нужно.

Вот макет XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/ImageView01" android:scaleType="matrix"     android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
</LinearLayout>

1 Ответ

4 голосов
/ 11 декабря 2010

Хорошо, отвечаю на мой вопрос здесь. Проблема, с которой я столкнулся, связана с тем, куда я поместил актив изображения. Он был только в папке res / drawable-mdpi, и устройство, на котором я тестировал, было высокой плотности. Поэтому Android масштабировал изображение для меня автоматически. Чтобы исправить ситуацию и разобраться с пикселями напрямую, я поместил изображение в папку res / drawable-nodpi.

Это поведение описано на этой странице: http://developer.android.com/guide/practices/screens_support.html в разделе «Как Android поддерживает несколько экранов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...