Пользовательский вид Android сохраняет видимый экран в растровое изображение

1

В моем приложении пользователь манипулирует изображением, поворачивается, щелкает, масштабирует и т.д. Это делается внутри onDraw() using canvas.translate(), canvas.rotate() и т.д. Конечно, изображение является большим и после манипуляции с изображением пользователь выполняет взаимодействия с другими представлениями. Дело в том, что я не хочу перерисовывать все большое изображение снова и снова только видимой частью. Поэтому я хочу, чтобы после того, как пользователь завершил операции, СОХРАНИТЕ текущее изображение VISIBLE на экране в память/битмап/кеш и перерисуйте только это.

Как я могу это достичь?

Теги:
caching
android-custom-view
bitmap

4 ответа

1
Лучший ответ

Я нашел действительно замечательную статью о том, что мне нужно ЗДЕСЬ

Чтобы сделать кепп ясным, сначала мне нужно создать растровое изображение с размером моего представления, а затем создать холст для него, нарисовать холст и затем сохранить его.

public void saveScreenshot() {
            Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            canvas.draw(myGiganticImage)

            File file = new File(context.getFilesDir() + "/cache.jpg");
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                fos.close();

                cachedBackground = BitmapFactory.decodeFile(context.getFilesDir()  + "/cache.jpg"
                invalidate()                
            } catch (FileNotFoundException e) {
            } catch (IOException e) {
            }
        }

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

  • 1
    что такое myGiganticImage?
3

В конструкторе вашего пользовательского представления включите кеш чертежа следующим образом: setDrawingCacheEnabled(true); , Затем, когда вы хотите сохранить состояние Canvas вы можете вызвать getDrawingCache(), который возвращает желаемый Bitmap.

Документация: getDrawingCache()

  • 0
    У вас есть ответ здесь, но, к сожалению, как я уже сказал, я работаю с изображениями, и кажется, что buildDrawingCache не должен иметь мой вид, если он больше экрана, так как видимая часть вида рисуется только, а кэш содержит только то, что рисуется .... любой способ исправить это? Мне нужно кэшировать только видимый экран, в то время как мой вид больше экрана ...
  • 0
    Ваше первое предложение не совсем понятно для меня. И можете ли вы также уточнить разницу между нарисованным и видимым в этом контексте?
Показать ещё 2 комментария
1

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

0

Следующее может помочь вам:

(1)

 View v = view.getRootView();
    v.setDrawingCacheEnabled(true);
    Bitmap b = v.getDrawingCache();

(2) Это похоже на другой вопрос в разделе Как захватить содержимое экрана устройства Android?

(3) Вы можете попробовать использовать эту библиотеку http://code.google.com/p/android-screenshot-library/ Она представляет собой Android Screenshot Library (ASL), которая позволяет программно захватывать скриншоты с устройств Android без необходимости иметь root привилегии доступа.

  • 0
    (1) где мне нужно запустить этот код? в моей деятельности? Если это так, он не подходит для моих нужд, так как мне нужно запросить getDrawingCache () внутри onDraw, непосредственно перед рисованием некоторых других элементов. И это, вероятно, не сработает, как я объяснил ранее. (2) и (3) Я не хочу использовать эту библиотеку, так как она имеет какой-то сервис, запускающийся при загрузке устройства. Спасибо за помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню