У меня есть простая комбинация одного ImageView
и двух TextViews
над ним. Я хотел бы сделать TextViews
перекрытием ImageView
, а затем сохранить комбинацию в целом (например, PNG).
Я знаю, что могу FrameLayout
TextViews
через ImageView
используя FrameLayout
, который я уже делаю. Теперь мне интересно, как я могу экспортировать это изображение?
Я читал разные сообщения об использовании холста. Есть ли способ просто экспортировать FrameLayout
в качестве изображения PNG, скажем, или мне нужно создать холст, добавить ImageView
и TextViews
и экспортировать сам холст в виде PNG?
Заранее спасибо.
Это можно сделать легко? , ДА
Как?
Хорошо, я, случается, сделал функцию для этого на днях, и это действительно просто (убедитесь, что у вас есть разрешение на использование внешнего устройства). Все, что вы делаете, это указать, какой вид (он будет включать все представления для детей тоже), которые вы хотите "нарисовать" в 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
(без скриншота или обрезки, прямо из устройства).
LinearLayouts
вы можете захватить весь экран или часть. Надеюсь, это поможет, +1 и примите, если это полезно;)