2013-04-05 55 views
0

注:在这里,我不是在谈论保存的ViewGroup状态:安卓

我使用https://github.com/eskim/android_drag_sample代码拖动和我的应用程序删除视图的onSaveInstanceState通过(...)节约活动的状态。用户可以在我的应用程序和每个场景中创建多个场景,用户可以添加多个视图并将它们拖放到任何他们想要的位置。在切换场景时,我将所有场景信息(如添加的儿童数量,属性等)存储在模型对象中,并且其工作正常。用户可以保存场景并通过邮件将其作为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

经过相当长的时间,得到了我的问题的解决方案。想法是模型对象中的任何数据,将其添加到任何布局并从中获取图像。以下是代码。

/** 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; 
}