注意:这里我不是说通过onSaveInstanceState保存活动状态(...)
我正在使用https://github.com/eskim/android_drag_sample代码在我的应用程序中拖放视图。用户可以在我的应用程序和每个场景中创建多个场景,用户可以添加多个视图并将其拖放到任何他们想要的位置。在切换场景时,我将所有场景信息存储在模型对象中,例如添加的子项数,其属性等,以及其工作正常。用户可以保存场景并通过邮件发送为pdf。问题是准备pdf我需要图像(使用iText库将图像转换为pdf)但是如何将其他隐藏的场景(不可见)转换为图像?目前可见的场景我可以转换成图像并存储在SD卡中。我尝试在模型对象中保存当前场景并在准备pdf时将其转换为图像,但是它会将所有场景覆盖到当前场景。我不知道这种方法是否正确。所以,非常感谢任何帮助或线索。
将视图转换为位图的代码:
public static Bitmap getBitmapFromView(final View view) {
if(view.getWidth() <= 0 && view.getHeight() <= 0)
return null;
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(returnedBitmap);
Drawable bgDrawable = view.getBackground();
if (bgDrawable != null)
bgDrawable.draw(canvas);
else
canvas.drawColor(Color.WHITE);
((Activity) view.getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
view.draw(canvas);
}
});
return returnedBitmap;
}
答案 0 :(得分:0)
经过相当长的一段时间,我的问题得到了解决方案。想法是模型对象中的任何数据,将其添加到任何布局并从中获取图像。以下是代码。
/** convert MySTScene(model object) into a View */
public static View getView(Context context, MySTScene mySTScene) {
RelativeLayout sceneView = new RelativeLayout(context);
RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(Constants.PLAY_AREA_WIDTH_TAG,
LayoutParams.WRAP_CONTENT);
parms.setMargins(100, 100, 100, 100);
String sceneBackground = mySTScene.getThemeImageName();
Drawable drawable = BitmapConverter.getDrawable(context, sceneBackground);
sceneView.setBackgroundDrawable(drawable);
for(MySTCharacter mySTCharacter : mySTScene.getCharacterList()) {
int scale = mySTCharacter.getScale();
ImageView image = new ImageView(context);
String filePath = mySTCharacter.getCharacterName();
int xPosition = (int) mySTCharacter.getCharacterPoint().x + 141;
if(xPosition >= Constants.PLAY_AREA_WIDTH_TAG)
xPosition -= 400;
else if(xPosition > (Constants.PLAY_AREA_WIDTH_TAG / 2))
xPosition -= 300;
else
xPosition -= 200;
int yPosition = (int) mySTCharacter.getCharacterPoint().y;
if(!mySTCharacter.getIsDialog())
sceneView.addView(setImageProperties(image, scale, filePath,
xPosition, yPosition, 0, 0));
else {
addDialog(mySTCharacter, sceneView, filePath,
xPosition, yPosition);
}
}
// add writing pad only if some text is added to it while creating/saving scene
boolean isTrue = mySTScene.getStoryText() != null && mySTScene.getStoryText().length() != 0;
if(isTrue)
addWritingPad(mySTScene, sceneView);
sceneView.setLayoutParams(parms);
return sceneView;
}
将视图另存为SD卡
public static void saveViewToSD(getView(context, mySTScene)) {
File fullSaveDir = FileUtils.createDirectory(FileUtils.PDF_IMAGES_DIRECTORY_TAG);
File file = new File(fullSaveDir, ""+System.currentTimeMillis()+".PNG");
Bitmap bitmap = null;
try {
if(file != null && !file.exists())
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
bitmap = loadBitmapFromView(view);
if(bitmap == null) {
fileOutputStream.close();
return;
}
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
}
}
从视图加载位图
public static Bitmap loadBitmapFromView(View view) throws IllegalArgumentException {
if (view.getMeasuredHeight() <= 0)
view.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
Bitmap bitmap = Bitmap.createBitmap( Constants.PLAY_AREA_WIDTH_TAG, Constants.PLAY_AREA_HEIGHT_TAG,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Drawable bgDrawable = view.getBackground();
Bitmap bitmapbg = ((BitmapDrawable)bgDrawable).getBitmap();
canvas.drawBitmap(bitmapbg, view.getLeft(), view.getTop(), null);
view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
view.draw(canvas);
return bitmap;
}