Создайте NinePatch/NinePatchDrawable во время выполнения

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

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

Изображения с девятью патчами извлекаются и сохраняются в приложении в виде растровых изображений. Чтобы создать NinePatchDrawable, вам потребуется соответствующий NinePatch или фрагмент (byte[]) NinePatch. NinePatch НЕ МОЖЕТ быть загружен из Ресурсов, так как изображения не существуют в /res/drawable/. Более того, чтобы создать NinePatch, вам понадобится фрагмент NinePatch. Итак, все сводится к чанку.
Тогда возникает вопрос, как отформатировать/сгенерировать чанк из существующего растрового изображения (содержащего информацию о NinePatch)?

Я искал в исходном коде Android и в Интернете, и я не могу найти никаких примеров этого. Что еще хуже, кажется, что все декодирование ресурсов NinePatch выполняется изначально.

Был ли у кого-нибудь опыт решения такой проблемы?

Я ориентируюсь на уровень API 4, если это важно.


person jacob11    schedule 22.02.2011    source источник


Ответы (7)


getNinePatchChunk работает нормально. Он вернул null, потому что вы дали Bitmap "исходный" девятый патч. Нужен "скомпилированный" образ с девятью патчами.

В мире Android существует два типа форматов файлов с девятью патчами («исходный» и «скомпилированный»). В исходной версии вы повсюду добавляете границу прозрачности 1px — когда вы позже скомпилируете свое приложение в .apk, aapt преобразует ваши файлы *.9.png в двоичный формат, который ожидает Android. Именно здесь файл png получает метаданные «фрагмента». (подробнее)

Хорошо, теперь к делу (вы слушаете DJ kanzure).

  1. Код клиента, примерно такой:

    InputStream stream = .. //whatever
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    byte[] chunk = bitmap.getNinePatchChunk();
    boolean result = NinePatch.isNinePatchChunk(chunk);
    NinePatchDrawable patchy = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
    
  2. На стороне сервера вам необходимо подготовить изображения. Вы можете использовать компилятор двоичных ресурсов Android. Это автоматизирует часть усилий, связанных с созданием нового проекта Android, просто для компиляции некоторых файлов *.9.png в родной формат Android. Если бы вы делали это вручную, вы бы, по сути, сделали проект и добавили несколько файлов *.9.png («исходные» файлы), скомпилировали все в формат .apk, разархивировали файл .apk, затем нашли файл *. 9.png, и именно его вы отправляете своим клиентам.

Кроме того: я не знаю, знает ли BitmapFactory.decodeStream о фрагменте npTc в этих png-файлах, поэтому он может правильно обрабатывать поток изображения или нет. Существование Bitmap.getNinePatchChunk предполагает, что BitmapFactory может... вы можете поискать его в кодовой базе основной ветки разработки.

В том случае, если он не знает о чанке npTc и ваши образы сильно лажают, то мой ответ немного меняется.

Вместо отправки скомпилированных изображений с девятью патчами клиенту вы пишете быстрое приложение для Android, которое загружает скомпилированные изображения и выдает фрагмент byte[]. Затем вы передаете этот байтовый массив своим клиентам вместе с обычным изображением — без прозрачных границ, не с «исходным» изображением с девятью патчами, не с «скомпилированным» изображением с девятью патчами. Вы можете напрямую использовать фрагмент для создания своего объекта.

Другой альтернативой является использование сериализации объектов для отправки изображений с девятью исправлениями (NinePatch) вашим клиентам, например, с помощью JSON или встроенного сериализатора.

Изменить Если вам действительно нужно создать собственный массив байтов фрагментов, я бы начал с просмотра do_9patch, isNinePatchChunk, Res_png_9patch и Res_png_9patch::serialize() в ResourceTypes.cpp. Также есть самодельный считыватель фрагментов npTc от Дмитрия Скибы. Я не могу публиковать ссылки, поэтому, если кто-то сможет отредактировать мой ответ, это будет здорово.

do_9patch: https://android.googlesource.com/platform/frameworks/base/+/gingerbread/tools/aapt/Images.cpp

isNinePatchChunk: http://netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android/graphics/NinePatch.cpp

struct Res_png_9patch: https://scm.sipfoundry.org/rep/sipX/main/sipXmediaLib/contrib/android/androidBitmap0_headers/frameworks/base/include/utils/ResourceTypes.h

Материал Дмитрия Скибы: http://code.google.com/p/android4me/source/browse/src/android/graphics/Bitmap.java

person kanzure    schedule 01.04.2011
comment
Спасибо kanzure за очень впечатляющий ответ! Не могу поверить, что мне не пришло в голову отправлять скомпилированные изображения клиентам. Я так понимаю, вы сами не пробовали решение с BitmapFactory.decodeStream(), верно!? Вот что я сделал: скомпилировал изображения с помощью abrc и отправил скомпилированные изображения клиенту. Я использовал BitmapFactory.decodeStream() для декодирования скомпилированных растровых изображений, но, тем не менее, bitmap.getNinePatchChunk() возвращает null. Пробовал как на эмуляторе, так и на нескольких таргетах (разные уровни API). Похоже, BitmapFactory не может правильно декодировать изображения с девятью патчами... =( - person jacob11; 05.04.2011
comment
Хм. Мне удалось успешно использовать BitmapFactory.decodeStream() на скомпилированном девятом патче. Кроме того, он успешно вернул мне кусок. Сказав это, я не знаю, почему я написал свой ответ с этой строкой о том, знает ли decodeStream о куске - конечно, знает, иначе мои собственные попытки не сработали бы. Но меня беспокоит, что у вас это не работает. Можете ли вы подтвердить, что ваши скомпилированные девять патчей действительно скомпилированы? Вы можете использовать diff, чтобы проверить, совпадают ли до/после. - person kanzure; 10.04.2011
comment
Ты прав! Действительно можно показать скомпилированные 9-патчи, расшифровав их с помощью BitmapFactory.decodeStream()! Я заставил его работать, настроив небольшой пример проекта, который извлекает только скомпилированное изображение с 9 патчами по сети и отображает его в пользовательском интерфейсе. Это должно быть что-то еще, что испортило мое исходное приложение. Я использую кеш образа (диска), который может быть проблемой ... сейчас посмотрю! Как только найду причину, сообщу! Спасибо, канзуре! - person jacob11; 12.04.2011
comment
Причина, по которой я не мог правильно отобразить скомпилированные изображения с 9 патчами, заключалась в том, что когда я сохраняю извлеченные изображения на диск (как часть функции кэширования), изображения PNG теряют информацию о своем фрагменте из 9 патчей (npTc). . Я использую Bitmap.compress(), и, похоже, он неправильно обрабатывает кодировку скомпилированных PNG с 9 патчами. Я заключаю это, поскольку сохраненные файлы PNG не содержат фрагмент npTc ... =( - person jacob11; 13.04.2011
comment
Э-э, ну, мне пришло в голову, что вы должны просто сохранить байты фрагмента в другом файле и прочитать их позже. Вы также можете просто хранить изображения напрямую через InputStream прямо в файл. - person kanzure; 14.04.2011
comment
Привет Канзуре, у меня тоже такая же проблема. для меня возвращаемый фрагмент всегда равен нулю, даже если обслуживаемое изображение представляет собой 9-патч (то же самое изображение в папке ресурсов работает нормально). В своем комментарии вы говорите, что мы даем исходное растровое изображение вместо скомпилированного. Как получить скомпилированный образ? - person Nar Gar; 13.08.2012
comment
Вы должны использовать инструмент Android Binary Resource Compiler для создания 9 патчей. Если этого больше не существует, то вы должны сделать простой проект для Android, поместить изображение куда-нибудь в папку res/ приложения (я забыл, куда оно идет), затем скомпилировать приложение, разархивировать файл apk и вынуть измененный версия файла. Это будет ваша скомпилированная версия изображения. - person kanzure; 14.08.2012
comment
Компилятор двоичных ресурсов Android является излишним для этого. Вам просто нужно вызвать AndroidSDK\build-tools\${version}\aapt s -i ${img}.png -o ${img}.9.png - person Peter Taylor; 29.06.2017

Если вам нужно создать 9 исправлений на лету, ознакомьтесь с этой сутью, которую я сделал: https://gist.github.com/4391807

Вы передаете ему любое растровое изображение, а затем даете ему заглавные вставки, как в iOS.

person Brian Griffey    schedule 27.12.2012
comment
Это именно то, что я хотел знать, возможно ли это, поэтому спасибо, что поделились своим фрагментом кода. - person sradforth; 04.01.2013
comment
Это идеально подходит для меня, так как я пытаюсь точно воспроизвести функцию iOS для кроссплатформенных растровых изображений, большое спасибо! - person Andre; 25.02.2013
comment
При использовании предоставленного кода у меня возникли проблемы с определением того, что должно быть слева/справа/... Я пробовал очевидное, используя значения UIEdgeInsets, но это не сработало. Поэтому в крайнем случае я попытался использовать такие значения: слева, ширина-справа, сверху, высота-снизу. К сожалению, опять не получилось - заработало только верхнее левое и верхняя часть. Поскольку это действительно структура, есть идеи, как ее правильно использовать? Возможно, растровое изображение должно быть в специальной форме? - person Panayotis; 08.04.2013
comment
@Panayotis Сначала декодируйте растровое изображение (используя BitmapFactory.Options.inJustDecodeBounds = true) и получите ширину/высоту растрового изображения. Затем передайте параметры как createNinePathWithCapInsets(res, bm, top, left, width - right, height - bottom);, используя точно такие же значения iOS. - person Andre; 24.04.2013
comment
Это: stackoverflow.com/a/16676419/580677 .. для меня более надежно. (Связанная суть терпит неудачу примерно в 1/10 раз, создавая девять патчей с неожиданным черным центральным патчем.) - person nmr; 23.09.2014
comment
Спасибо, это отлично работает. Наконец, через несколько лет я смог понять это. Большое спасибо. Я опубликую свою реализацию в качестве ответа здесь - person Diljeet; 13.06.2016

Я создаю инструмент для создания NinePatchDrawable из (нескомпилированного) растрового изображения NinePatch. См. https://gist.github.com/knight9999/86bec38071a9e0a781ee.

Вам поможет метод NinePatchDrawable createNinePatchDrawable(Resources res, Bitmap bitmap).

Например,

    ImageView imageView = (ImageView) findViewById(R.id.imageview);
    Bitmap bitmap = loadBitmapAsset("my_nine_patch_image.9.png", this);
    NinePatchDrawable drawable = NinePatchBitmapFactory.createNinePatchDrawable(getResources(), bitmap);
    imageView.setBackground( drawable );

где

public static final Bitmap loadBitmapAsset(String fileName,Context context) {
    final AssetManager assetManager = context.getAssets();
    BufferedInputStream bis = null;
    try {
        bis = new BufferedInputStream(assetManager.open(fileName));
        return BitmapFactory.decodeStream(bis);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            bis.close();
        } catch (Exception e) {

        }
    }
    return null;
}

В этом примере my_nine_patch_image.9.png находится в каталоге ресурсов.

person KNaito    schedule 23.04.2015
comment
Спасибо, что поделились этой честолюбивой атакой. Тем не менее, этот подход по-прежнему испортит растровый фон NinePatch, сравнивая заданный фон с помощью xml. - person zionpi; 04.02.2016
comment
Ваша NinePatchBitmapFactory — это именно то, что мне нужно для решения моей проблемы: из url">stackoverflow.com/questions/35203989/. Кажется, работает нормально. Это бесплатно для использования? - person user2331454; 04.02.2016
comment
@zionpi Да, настоящее растровое изображение NinePatch сложнее. - person KNaito; 05.02.2016
comment
@ user2331454 Мой код бесплатный. Но мой код является разветвленной версией. Я не знаю, исходный код бесплатный или нет. (Думаю, может быть бесплатным) Пожалуйста, посетите оригинальный репозиторий briangriffey. gist.github.com/briangriffey/4391807 - person KNaito; 05.02.2016
comment
@zionpi Если у вас есть файл изображения, который вызывает некоторые проблемы в моем коде эмуляции NinePatch, сообщите мне его URL. Я или кто-то другой может улучшить мои коды NInePatch. - person KNaito; 08.02.2016
comment
@KNaito Ваш код NinePatch просто отличный. Мне жаль, что я не описал свою проблему четко. Я хочу установить девять патчей, которые можно рисовать в качестве фона, используя код для уменьшения потребления памяти, что как-то связано с BitmapFactory.Options. Так что я думаю, что BitmapFactory.decodeStream делает винт не вашим кодом NinePatch. - person zionpi; 14.02.2016

Нет необходимости использовать компилятор двоичных ресурсов Android для подготовки скомпилированных файлов 9patch png, достаточно использовать aapt в android-sdk, командная строка выглядит следующим образом:
aapt.exe c -v -S /path/to/project -C /path/to/destination

person figofuture    schedule 03.06.2013
comment
Это действительно должен быть принятый ответ. 9 патчей для рисования имеют 9 фрагментов патчей, добавленных aapt (обычно с использованием Eclipse) при сборке APK. PNG с 9 патчами, созданный draw9patch, не включает в себя фрагмент и буквально добавляет черные линии в PNG. - person Kevin Parker; 12.11.2014

Итак, вы в основном хотите создать NinePatchDrawable по запросу, не так ли? Я попробовал следующий код, возможно, он работает для вас:

InputStream in = getResources().openRawResource(R.raw.test);
Drawable d = NinePatchDrawable.createFromStream(in, null);
System.out.println(d.getMinimumHeight() + ":" + d.getMinimumHeight());

Я думаю, это должно сработать. Вам просто нужно изменить первую строку, чтобы получить InputStream из Интернета. Согласно документации, getNinePatchChunk() не предназначен для вызова разработчиками и может сломаться в будущем.

person mreichelt    schedule 22.02.2011
comment
Это правильная моя ошибка, я только что посмотрел обзор метода, и они пропустили это. - person FoamyGuy; 22.02.2011
comment
Спасибо за ответ, mreichelt! - person jacob11; 23.02.2011
comment
Да, я хочу создать NinePatchDrawable. Вы действительно использовали приведенный выше код для создания NinePatchDrawable на целевом устройстве? Я попробовал, и Drawable.createFromStream(InputStream, String) возвращает BitmapDrawable (расширяет Drawable), а не NinePatchDrawable (расширяет Drawable). Я пробовал это с входным потоком для удаленного изображения (через HTTP) и с входным потоком для локального файла изображения. В обоих случаях возвращается BitmapDrawable. Я тестировал это на Samsung Galaxy S и HTC Desire (оба работают под управлением 2.2). Любые другие предложения!? Любая помощь приветствуется! - person jacob11; 23.02.2011
comment
Вы можете найти одно из изображений с девятью исправлениями, которые я пытаюсь загрузить здесь. Я почти уверен, что это действительный патч из девяти, так как он отлично работает, если я загружаю его из /res/drawable/... - person jacob11; 23.02.2011
comment
Хорошо, здесь я сделал небольшую ошибку — метод createFromStream унаследован от класса Drawable, так что это не работает. Я также пытался декодировать растровое изображение, используя другие методы, фрагмент с девятью патчами не декодируется (getNinePatchChunk() возвращает null). Я думаю, вы можете попробовать это: декодируйте обычный Bitmap, определите массив фрагментов NinePatch вручную и вызовите конструктор NinePatch напрямую: developer.android.com/reference/android/graphics/ Вы может быть в состоянии учиться у обычных NinePatches. - person mreichelt; 23.02.2011
comment
Это был мой первоначальный подход, но я нигде не могу найти определение формата фрагмента. Я загрузил (связанный) патч с девятью патчами из /res/drawable/ и взглянул на кусок с девятью патчами: [1, 2, 2, 6, 64, -128, -117, -66, 72, -128 , -117, -66, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 80, -128, -117, -66, 6, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]. Основываясь на этом выводе, по крайней мере, я не вижу никакой логики в том, как динамически создавать фрагмент. Кто-нибудь знает, как создать чанк вручную (из растрового изображения с девятью патчами)? - person jacob11; 23.02.2011
comment
Мой коллега указал мне на код источника AAPT, но мне действительно нужно портировать этот код, чтобы иметь возможность создать NinePatchDrawable (из изображения, полученного по сеть)!? Мне это кажется несколько излишним... - person jacob11; 23.02.2011
comment
Зарегистрирована ошибка при загрузке NinePatchDrawable с помощью Drawable.createFrom... методы. См. этот SO-thread. Так что этот подход, вероятно, не сработает... Так что единственный оставшийся вариант - узнать, как отформатировать фрагмент, и создать `NinePatch' с помощью конструктора. - person jacob11; 23.02.2011
comment
Возможно, вы захотите взглянуть на собственный файл ResourceTypes.h — там есть некоторая документация о расширениях PNG и патче struct Res_png_9: android.git.kernel.org/?p=platform/ фреймворки/ - person mreichelt; 23.02.2011
comment
Здесь также есть реализация методов сериализации и десериализации: android.git.kernel.org/?p=platform/frameworks/ Надеюсь, это поможет. - person mreichelt; 23.02.2011

РАБОТАЕТ И ПРОВЕРЕН - СОЗДАНИЕ NINEPATCH

Это моя реализация Android Ninepatch Builder, вы можете создавать NinePatches во время выполнения с помощью этого класса и примеров кода ниже, предоставляя любой Bitmap

public class NinePatchBuilder {
    int width,height;
    Bitmap bitmap;
    Resources resources;
    private ArrayList<Integer> xRegions=new ArrayList<Integer>();
    private ArrayList<Integer> yRegions=new ArrayList<Integer>();
    public NinePatchBuilder(Resources resources,Bitmap bitmap){
        width=bitmap.getWidth();
        height=bitmap.getHeight();
        this.bitmap=bitmap;
        this.resources=resources;
    }
    public NinePatchBuilder(int width, int height){
        this.width=width;
        this.height=height;
    }
    public NinePatchBuilder addXRegion(int x, int width){
        xRegions.add(x);
        xRegions.add(x+width);
        return this;
    }
    public NinePatchBuilder addXRegionPoints(int x1, int x2){
        xRegions.add(x1);
        xRegions.add(x2);
        return this;
    }
    public NinePatchBuilder addXRegion(float xPercent, float widthPercent){
        int xtmp=(int)(xPercent*this.width);
        xRegions.add(xtmp);
        xRegions.add(xtmp+(int)(widthPercent*this.width));
        return this;
    }
    public NinePatchBuilder addXRegionPoints(float x1Percent, float x2Percent){
        xRegions.add((int)(x1Percent*this.width));
        xRegions.add((int)(x2Percent*this.width));
        return this;
    }
    public NinePatchBuilder addXCenteredRegion(int width){
        int x=(int)((this.width-width)/2);
        xRegions.add(x);
        xRegions.add(x+width);
        return this;
    }
    public NinePatchBuilder addXCenteredRegion(float widthPercent){
        int width=(int)(widthPercent*this.width);
        int x=(int)((this.width-width)/2);
        xRegions.add(x);
        xRegions.add(x+width);
        return this;
    }
    public NinePatchBuilder addYRegion(int y, int height){
        yRegions.add(y);
        yRegions.add(y+height);
        return this;
    }
    public NinePatchBuilder addYRegionPoints(int y1, int y2){
        yRegions.add(y1);
        yRegions.add(y2);
        return this;
    }
    public NinePatchBuilder addYRegion(float yPercent, float heightPercent){
        int ytmp=(int)(yPercent*this.height);
        yRegions.add(ytmp);
        yRegions.add(ytmp+(int)(heightPercent*this.height));
        return this;
    }
    public NinePatchBuilder addYRegionPoints(float y1Percent, float y2Percent){
        yRegions.add((int)(y1Percent*this.height));
        yRegions.add((int)(y2Percent*this.height));
        return this;
    }
    public NinePatchBuilder addYCenteredRegion(int height){
        int y=(int)((this.height-height)/2);
        yRegions.add(y);
        yRegions.add(y+height);
        return this;
    }
    public NinePatchBuilder addYCenteredRegion(float heightPercent){
        int height=(int)(heightPercent*this.height);
        int y=(int)((this.height-height)/2);
        yRegions.add(y);
        yRegions.add(y+height);
        return this;
    }
    public byte[] buildChunk(){
        if(xRegions.size()==0){
            xRegions.add(0);
            xRegions.add(width);
        }
        if(yRegions.size()==0){
            yRegions.add(0);
            yRegions.add(height);
        }
        /* example code from a anwser above
        // The 9 patch segment is not a solid color.
        private static final int NO_COLOR = 0x00000001;
        ByteBuffer buffer = ByteBuffer.allocate(56).order(ByteOrder.nativeOrder());
        //was translated
        buffer.put((byte)0x01);
        //divx size
        buffer.put((byte)0x02);
        //divy size
        buffer.put((byte)0x02);
        //color size
        buffer.put(( byte)0x02);

        //skip
        buffer.putInt(0);
        buffer.putInt(0);

        //padding
        buffer.putInt(0);
        buffer.putInt(0);
        buffer.putInt(0);
        buffer.putInt(0);

        //skip 4 bytes
        buffer.putInt(0);

        buffer.putInt(left);
        buffer.putInt(right);
        buffer.putInt(top);
        buffer.putInt(bottom);
        buffer.putInt(NO_COLOR);
        buffer.putInt(NO_COLOR);

        return buffer;*/
        int NO_COLOR = 1;//0x00000001;
        int COLOR_SIZE=9;//could change, may be 2 or 6 or 15 - but has no effect on output 
        int arraySize=1+2+4+1+xRegions.size()+yRegions.size()+COLOR_SIZE;
        ByteBuffer byteBuffer=ByteBuffer.allocate(arraySize * 4).order(ByteOrder.nativeOrder());
        byteBuffer.put((byte) 1);//was translated
        byteBuffer.put((byte) xRegions.size());//divisions x
        byteBuffer.put((byte) yRegions.size());//divisions y
        byteBuffer.put((byte) COLOR_SIZE);//color size

        //skip
        byteBuffer.putInt(0);
        byteBuffer.putInt(0);

        //padding -- always 0 -- left right top bottom
        byteBuffer.putInt(0);
        byteBuffer.putInt(0);
        byteBuffer.putInt(0);
        byteBuffer.putInt(0);

        //skip
        byteBuffer.putInt(0);

        for(int rx:xRegions)
            byteBuffer.putInt(rx); // regions left right left right ...
        for(int ry:yRegions)
            byteBuffer.putInt(ry);// regions top bottom top bottom ...

        for(int i=0;i<COLOR_SIZE;i++)
            byteBuffer.putInt(NO_COLOR);

        return byteBuffer.array();
    }
    public NinePatch buildNinePatch(){
        byte[] chunk=buildChunk();
        if(bitmap!=null)
            return new NinePatch(bitmap,chunk,null);
        return null;
    }
    public NinePatchDrawable build(){
        NinePatch ninePatch=buildNinePatch();
        if(ninePatch!=null)
            return new NinePatchDrawable(resources, ninePatch);
        return null;
    }
}

Теперь мы можем использовать NinePatch Builder для создания NinePatch или NinePatchDrawable или для создания NinePatch Chunk.

Пример:

NinePatchBuilder builder=new NinePatchBuilder(getResources(), bitmap);
NinePatchDrawable drawable=builder.addXCenteredRegion(2).addYCenteredRegion(2).build();

//or add multiple patches

NinePatchBuilder builder=new NinePatchBuilder(getResources(), bitmap);
builder.addXRegion(30,2).addXRegion(50,1).addYRegion(20,4);
byte[] chunk=builder.buildChunk();
NinePatch ninepatch=builder.buildNinePatch();
NinePatchDrawable drawable=builder.build();

//Here if you don't want ninepatch and only want chunk use
NinePatchBuilder builder=new NinePatchBuilder(width, height);
byte[] chunk=builder.addXCenteredRegion(1).addYCenteredRegion(1).buildChunk();

Просто скопируйте и вставьте код класса NinePatchBuilder в файл Java и используйте примеры для создания NinePatch на лету во время выполнения вашего приложения с любым разрешением.

person Diljeet    schedule 13.06.2016

Класс Bitmap предоставляет для этого метод yourbitmap.getNinePatchChunk(). Я никогда не использовал его, но кажется, что это то, что вы ищете.

person FoamyGuy    schedule 22.02.2011
comment
Как сказал mreichelt, документ говорит: Возвращает необязательный массив частных данных, используемых системой пользовательского интерфейса для некоторых растровых изображений. Не предназначен для вызова приложениями.. Так что этот метод не может быть использован. Спасибо, в любом случае! - person jacob11; 23.02.2011