Увеличение слоистых изображений, которые были масштабированы на Android

StackOverflow https://stackoverflow.com/questions/8814483

Вопрос

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

Окончательный результат У меня есть базовое изображение, которое имеет 3 слоя (прозрачные PNG) сверху. Слои, которые отображаются, подходят для пользователя. Каждый слой добавляет больше информации к базовому изображению. В моей ситуации базовое изображение - это изображение звезд. Поскольку пользователь добавляет дополнительные слои, он может увидеть границы созвездий, звездные имена и сетку. Пользователь также должен иметь возможность увеличить область для более четкой картины секции неба.

Первый выпуск. Размеры изображений - два больших (1324 × 1872), что приводит к ошибке переоборудования.

Решено путем масштабирования изображения, используя

    /**
    * This method scales an image in the assets directory and returns a 
    * BitmapDrawable object that can be passed to an images setImageBitmap or a
    * views setBackgroundDrawable by passing this method into the constructor
    * of BitmapDrawable.
    * eg ViewGroup.setBackgroundDrawable(
    * new BitmapDrawable(getScaledBitMap(this, imagePath, 2)));
    * 
    * @param context
    * @param imgFullPath
    * @param imageSize
    * @return
    * @throws IOException
    */
    public static Bitmap getScaledBitMap(Context context, String imgFullPath,
        int imageSize)  throws IOException
    {
        InputStream instream;
        instream = context.getAssets().open(imgFullPath);

        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inSampleSize = imageSize;
        Bitmap bitmap=BitmapFactory.decodeStream(instream, null, options);

        return bitmap;
    }

Хотя этот код помог, я все еще получаю ошибку Outofmemory при загрузке 3 слоев. Я также думаю, что масштабирование изображения станет проблемой при увеличении, так как качество уменьшилось.

Второй выпуск. Насколько я обнаружил, вы не можете сложить PNG, где одно из изображений не является прозрачным. Никакие прозрачные изображения не будут отображаться, показывая только тот, который не является прозрачным (базовое изображение).

Решены это, установив фон Framelayout на базовое изображение и оставив лишь 3 слоя в качестве детей в этот макет.

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

Как лучше всего загрузить все 4 изображения (базовые + 3 слои), не получая OutofmemoryError, и иметь функциональность для увеличения изображений.

Я создал проект с необходимым кодом здесь

Это было полезно?

Решение

Я нашел несколько решений. Выпуск первого: после завершения кода и использования TouchImageView здесь. Анкет Я больше не получаю ошибки в памяти. Я могу загрузить все слои без проблем.

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

Последняя большая проблема, с которой я столкнулся, была, когда увеличение пинчала, это только увеличило бы верхний слой (как и ожидалось). Исправлено, чтобы немного изменить класс TouchImageView и добавить функциональность для матрицы, измененного прослушивателя. Теперь, когда когда -либо изменяется, матрица возвращается слушателю, который затем обновляет матрицу во всех слоях, включая базовое изображение. Теперь это заставляет все изображения Zoom одновременно, сохраняя метки, указывающие на то же место на базовом изображении независимо от Zoom.

Это очень простой интерфейс, используемый для уведомления слушателей об изменении матрицы

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top