保存ViewGroup状态:Android

时间:2013-04-05 07:03:43

标签: android view drag-and-drop save viewgroup

注意:这里我不是说通过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;
}

1 个答案:

答案 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;
}