2013-03-15 2 views
1

[ОБНОВЛЕНО с дополнительным кодом]Android canvas.drawBitmap() делает ошибку

У меня серьезная проблема с Android правильно рендеринга некоторых растровых изображений в моей настраиваемое представление в OnDraw() метод на некоторых (Nexus 7 и 10, которые Я знаю), но не все устройства. Он правильно отображается на телефонах Android, которые у меня есть для тестирования. Вот отрывок следствия:

/* set up mImagePaint earlier */ 
mImagePaint.setAntiAlias(true); 
mImagePaint.setFilterBitmap(true); 
mImagePaint.setDither(true); 
mImagePaint.setStyle(Paint.Style.FILL_AND_STROKE); 
mImagePaint.setStrokeWidth(0); 
mImagePaint.setColor(Color.WHITE); 

protected void onDraw(Canvas canvas) { 
    final float vw = getWidth(); 
    final float vh = getHeight(); 
    final float bw = mBitmap.getWidth(); 
    final float bh = mBitmap.getHeight(); 
    final float ba = bw/bh; 
    final float va = vw/vh; 
    if (va > ba) { 
     final float top = (bh - ba/va * bh)/2; 
     mSrcRect.set(0, (int) top, (int) bw, (int) (bh - top)); 
    } else { 
     final float left = (bw - va/ba * bw)/2; 
     mSrcRect.set((int) left, 0, (int) (bw - left), (int) bh); 
    } 
    mContentRect.set(0, 0, vw, vh); 
    canvas.drawBitmap(mBitmap, mSrcRect, mContentRect, mImagePaint); 
} 

Результаты на Nexus 7 и 10 некорректен и оказывает широкую белой каймы, как показано ниже. Это часть рендеринга растровых изображений, но не часть исходного растрового изображения или прямоугольника.

Incorrect rendering on Nexus 7

Правильный (по желанию) результат на телефоне Samsung Galaxy:

Correct rendering on Samsung Galaxy phone

Изображение и код, показанный в обоих вышеприведенных примерах точно так же. Я уже опробовал варианты, используя null paint, null srcRect и даже используя альтернативный метод drawBitmap (bitmap, 0, 0, null) и получаю те же результаты. Глядя на код фреймворка, конечно drawBitmap() вызывает непосредственно собственные методы, исходный код которых я не могу просмотреть.

Данное изображение показалось малочисленному числу изображений, и кажется, что в основном квадратные изображения демонстрируют его. Но вот только один другой неквадрат образ, который демонстрирует эту проблему:

incorrect non-square image on Nexus 7

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

Любые идеи? Это орехи!

+1

Не могли бы вы поделиться еще немного кода? Если вы занимаетесь обработкой поверхности, тогда нет никакой гарантии относительно порядка z, но из-за вашего недостатка кода не ясно, что вы на самом деле делаете. –

ответ

0

Вы уверены, что фотографии достаточно большие, чтобы отображать их без необходимости масштабирования на этих устройствах?

+0

Джеймс, хорошая мысль, и я тоже подумал об этом, но изображение 320x300 и вид rect меньше. Даже если это было меньше, метод drawBitmap должен увеличить источник, чтобы он соответствовал представлению (карта от src до dst), а это не так. – Jackpile