Захват ViewGroup в файл изображения

1

У меня есть простая комбинация одного ImageView и двух TextViews над ним. Я хотел бы сделать TextViews перекрытием ImageView, а затем сохранить комбинацию в целом (например, PNG).

Я знаю, что могу FrameLayout TextViews через ImageView используя FrameLayout, который я уже делаю. Теперь мне интересно, как я могу экспортировать это изображение?

Я читал разные сообщения об использовании холста. Есть ли способ просто экспортировать FrameLayout в качестве изображения PNG, скажем, или мне нужно создать холст, добавить ImageView и TextViews и экспортировать сам холст в виде PNG?

Заранее спасибо.

Теги:
android-layout
screen-capture

1 ответ

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

Это можно сделать легко? , ДА

Как?

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

public void captureView(int viewId,String filename){
    //Find the view we are after
    View    view = (View) findViewById(viewId);
    //Create a Bitmap with the same dimensions 
    Bitmap image = Bitmap.createBitmap(view.getWidth(), 
                                       view.getHeight(), 
                                       Bitmap.Config.RGB_565);
    //Draw the view inside the Bitmap
    view.draw(new Canvas(image)); 

    //Store to sdcard
    try {
       String path = Environment.getExternalStorageDirectory().toString();
       File myFile = new File(path,filename);
       FileOutputStream out = new FileOutputStream(myFile);

       image.compress(Bitmap.CompressFormat.PNG, 90, out); //Output
    } catch (Exception e) {
       e.printStackTrace();
    }
}

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

Охватывает ли это представление так, как оно есть или как оно было создано?

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

Изображение 174551

  • 0
    Спасибо, это выглядит потрясающе! Должен ли я вызывать его в отдельных TextViews / ImageView или вызывать его в самом макете?
  • 0
    Все макеты расширяют ViewGroup, который одновременно расширяет View. Таким образом, вы можете передать все, что расширяет представление, которое я бы предположил. Работает с LinearLayouts вы можете захватить весь экран или часть. Надеюсь, это поможет, +1 и примите, если это полезно;)
Показать ещё 4 комментария

Ещё вопросы

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