2011-04-02 3 views
0

Я пишу представление, которое должно отображать drawable, который кажется «никогда не заканчивается». Он должен быть дважды или третьим, отображать и медленно перемещаться по экрану.Android Drawable выглядит уродливым из-за масштабирования

Поэтому я изучил некоторые samplecode на Google и нашел важных направлений

public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    canvasWidth = width; 
    canvasHeight = height; 
    float sf = backgroundImage.getWidth()/canvasWidth; 
    backgroundImage = Bitmap.createScaledBitmap(backgroundImage, 
     (int) (canvasWidth * sf), canvasHeight, true); 
    } 

Чтобы изменить масштаб изображения и чем

 // decrement the far background 
     backgroundXPos = backgroundXPos - DELTAMOVE; 
     // calculate the wrap factor for matching image draw 
     int newFarX = backgroundImage.getWidth() - (-backgroundXPos); 
     // if we have scrolled all the way, reset to start 
     if (newFarX <= 0) { 
      backgroundXPos = 0; 
      // only need one draw 
      canvas.drawBitmap(backgroundImage, backgroundXPos, 0, null); 

     } else { 
      // need to draw original and wrap 
      canvas.drawBitmap(backgroundImage, backgroundXPos, 0, null); 
      canvas.drawBitmap(backgroundImage, newFarX, 0, null); 
     } 

Чтобы нарисовать движущееся изображение. Изображения уже движутся, все в порядке.

Но, и это точка моего вопроса, изображение выглядит очень уродливо. Его оригинал составляет 960 * 190 пикселей на 240 пикселей. Он должен быть нарисован внутри вида с шириной 80 дюймов и шириной «fill_parent».

Он должен выглядеть так же (и хорошо) на всех устройствах. Я много пробовал, но не знаю, как сделать картинку красивой.

Благодарим за помощь. С уважением, До

ответ

0

Поскольку вы говорите, что это никогда не заканчивается, возможно, вы пишете какую-то игру. Если ваше изображение pixel-art type, то вы не хотите масштабирования; Изображения с пиксельным изображением нельзя масштабировать и сохранять свой четкий вид (вы можете попробовать использовать nearest neighbor interpolation и масштабировать до целого числа, кратного оригиналу, что иногда может работать, но иногда вам все равно понадобятся ручные настройки). Это редкий случай, когда вам действительно нужно иметь разные ресурсы изображения для разных разрешений экрана.

В противном случае вы можете использовать vector image, но если - как вы сказали, ваш оригинал изображения с высоким разрешением, то векторное изображение, вероятно, не поможет здесь.

Кстати, вы, вероятно, захотите показать скриншот. «Выглядит уродливо» так же полезно, как и мой код не работает.

+0

Спасибо за ваш ответ. Извините за отсутствие изображения. Это растровое изображение с пиксельным изображением. Есть только проблема, о которой я не знаю, какой размер и разрешение должно иметь мое изображение и какая папка (drawable, drawable-hdpi, drawable-normal-mdpi и т. Д.) Она должна быть. Я уже изучил страницы google, рассказывая об этой теме, но это не дает мне никаких подсказок. Ширина изображения - ширина экрана, высота - 80dip. Другой вопрос: почему это «редкий случай»? – Till

+0

@ Должно быть: потому что большую часть времени вы обычно используете векторные изображения или изображения, которые являются гладкими, и поэтому их можно автоматически масштабировать. Pixel-art, с другой стороны, обычно требует ручной настройки для масштабированного изображения. Попробуйте отключить билинейную фильтрацию (и, таким образом, используя фильтр ближайших соседей) и посмотрите, будет ли она лучше работать в вашем случае: 'Bitmap.createScaledBitmap (backgroundImage, (int) (canvasWidth * sf), canvasHeight, false);'. Не забудьте изменить размер только на целое число или малую долю кратного исходного изображения (например,если оригинал 100x100, вы можете попробовать 300x300, 200x200, 50x50, 25x25, 20x20) –

+0

@ Поверните: попробуйте сыграть в Photoshop или GIMP или как вам понравится ваш любимый редактор изображений, и попытайтесь найти параметр, который выглядит приемлемым, а затем попробуйте воспроизвести этот параметр в Android (или просто отправить несколько растровых изображений, если вы не можете воспроизвести настройку на Android). Убедитесь, что вы используете фильтрацию ближайшего соседа или специализированный фильтр масштабирования пикселей (например, scale2x), поскольку вы не хотите, чтобы размытые края делали другие фильтры масштабирования (эти фильтры полезны для фотографий, где размытые края увеличивают «воспринимаемые «разрешение изображения, в вашем случае вы хотите чистый, четкий край) –

0

Только предположение, но вместо того, чтобы передать пустую краску вашего drawBitmap() звонков, попробуйте сделать краску с растровыми фильтрациями отключены:

Paint p = new Paint(); 
p.setFilterBitmap(false); 
canvas.drawBitmap(backgroundImage, backgroundXPos, 0, p); 

Надежда, что помогает.

+0

Спасибо за подсказку. Просто попробовал, и это выглядит как раньше. – Till

Смежные вопросы