2017-05-25 131 views
0

我正在按钮单击生成图像。用于创建图像的布局在活动内部当前不可见。矢量图像是布局的背景,但我看到的只是黑色图像。Android - 保存布局作为图像显示黑色图像

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="370dp" 
    android:layout_height="400dp" 
    android:background="@drawable/ic_background"> 

    <TextView 
     android:id="@+id/address" 
     android:layout_width="match_parent" 
     android:textColor="@color/white" 
     android:textSize="40sp" 
     android:textStyle="bold" 
     android:gravity="center" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

生成图像

private void generateAndShareImage(){ 
    final LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View view = inflater.inflate(R.layout.image_address, null); 
    final TextView addressView = (TextView) view.findViewById(R.id.address); 
    addressView.setText("Test Address"); 

    final Bitmap cardImage = getBitmapFromView(view); 
    //store image in external storage 
    String savedImagePath = storeImage(cardImage); 
    if(savedFilePath != null){ 
     scanGallery(savedImagePath); 
    } 
} 

private void scanGallery(final String path) { 
    try { 
     MediaScannerConnection.scanFile(getBaseContext(), new String[] { path },null, new MediaScannerConnection.OnScanCompletedListener() { 
      public void onScanCompleted(String path, Uri uri) { 
      } 
     }); 
    } catch (Exception e) { 
     Log.e("Error scanning gallery",e.getMessage()); 
    } 
} 

private Bitmap getBitmapFromView(@NonNull final View view){ 
    final Bitmap bitmap = Bitmap.createBitmap(370, 400, Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bitmap); 
    view.draw(canvas); 
    return bitmap; 
} 

有什么不对?

回答

0

您需要measurelayout你的意见第一:

int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
view.measure(spec, spec); 
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 
final Bitmap cardImage = getBitmapFromView(view); 

上面的代码应该工作。

它更好地传递getBitmapFromView(view, width, height)中的测量视图的尺寸,用于Bitmap.createBitmap()而不是使用硬编码值。

检查了这一点其他的调整Converting a view to Bitmap without displaying it in Android?

BTW,你不能使用370作为它的是,如果你真的需要使用硬编码的数字,然后用这个来代替:

float dp_370 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 370, context.getResources().getDisplayMetrics()); 

要了解密度独立的像素在Android中是如何工作的,请阅读: What is the difference between "px", "dp", "dip" and "sp" on Android?

https://material.io/guidelines/layout/units-measurements.html#units-measurements-scaleable-pixels-sp

编辑:

下面是我使用的是看在ImageView生成的位图工作的代码示例:

final LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
final View test = inflater.inflate(R.layout.test, null); 
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
test.measure(spec, spec); 
int measuredWidth = test.getMeasuredWidth(); 
int measuredHeight = test.getMeasuredHeight(); 
test.layout(0, 0, measuredWidth, measuredHeight); 
final Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888); 
final Canvas canvas = new Canvas(bitmap); 
test.draw(canvas); 

//now show this inside an ImageView 
ImageView image = (ImageView) findViewById(R.id.image); 
image.setImageBitmap(bitmap); 
+0

谢谢,但它仍然无法正常工作。我没有在背景中看到drawable,也没有看到文字。只是图像的颜色现在变了 – Coder

+0

@Coder我更新了我正在使用的工作示例的答案,以查看生成的位图。可能是你的'storeImage()'代码的问题。 –