2013-06-07 2 views
1

В Android есть чистый способ отображения только определенной части растрового изображения в ImageView (например, одного спрайта листа спрайтов) без необходимости:Отображение части спрайта в Android ImageView

  • вручную разбить растровые детские в маленький формат PNG (=> больше встроенный в вводимом коэффициенте приложения, утомительная ручная работа, возможно, приведет к ошибкам, или потерять spritesheet).
  • Есть небольшой PNGs, используемый в ImageViews, с спрайт лист генерируется (=> осложнены)
  • Создать «грязные» подклассы ImageView, Drawable и т.д. (=> больше мы используем Android API «ASIS» лучше)
  • Программные создать суб-битовые карты большого растрового изображения (=> Мы должны сделать всю работу программно)

например, я попытался создать в ImageView ширина/высоту 40dp, и установив его вытяжку как ClipDrawable, отображающий только часть растрового изображения, которое я хотел, но это не помогло:

  • Обрезанная часть не заполняла родителя при использовании Gravity.CENTER при создании ClipDrawable.

  • При использовании Gravity.FILL отображается вся «большая» PNG.

Кроме того, это решение устроиств возможно с помощью простого спрайтов листа (например, 2 * 2 спрайтов), но я не считаю, что это возможно при использовании что-то вроде спрайтов листа 4 * 4. Я думаю, что ClipDrawable не предназначен для такого использования.

Не существует ли чего-то «чистого и легкого», как в OpenGL, где вы можете установить идентификатор текстуры и задать координаты текстуры для отображения только части текстуры? Учитывая мои исследования, я считаю, что лучшим решением является ручное разделение большого растрового изображения с помощью Bitmap.createBitmap, когда я предпочитаю просить, прежде чем начинать что-то подобное.

PS: Я рассматриваю использование SpriteSheets из-за OpenGl, хотя мои «меню» разрабатываются с использованием API Android, следовательно, используя ImageView.

ответ

0

Вы знакомы с Canvas? Я думаю, это другой способ, который сработает для вас.

Вы создаете одно растровое изображение в памяти, затем используйте drawBitmap для рисования только текущего фрагмента, который вы хотите.

Вот фрагмент from the manual:

public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)

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

Parameters 
bitmap The bitmap to be drawn 
src  May be null. The subset of the bitmap to be drawn 
dst  The rectangle that the bitmap will be scaled/translated to fit into 
paint May be null. The paint used to draw the bitmap 
+0

Спасибо. Я знал о холсте, но никогда не использовал их широко. Это может быть действительно хорошим решением (мой «любимый» - это программное разделение растровых изображений, но я боялся, что это, возможно, в конечном итоге приведет к большому количеству памяти). Я посмотрю на это, и поскольку Views использует Canvas, это можно было бы обработать «автоматически» (и используя макеты), создав пользовательский вид чертежа только частью растрового изображения. Еще раз спасибо. – Consign

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