Получить растровое изображение RelativeLayout с невидимым TextView или ImageView

Я должен создать растровое изображение относительного макета, имеющего видимый ImageView с двумя невидимыми TextViews и одним невидимым ImageView. Но данные невидимых видов не отображались в растровом изображении. Если я сделаю видимыми все эти невидимые виды, это будет показано в растровом изображении, но не скрыто.

Я использую приведенный ниже код -

 private Bitmap getBitmap(View v) {
    Bitmap bmp = null, b1 = null;
    RelativeLayout targetView = (RelativeLayout) v;
    targetView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    targetView.buildDrawingCache();
    b1 = targetView.getDrawingCache();
    bmp = b1.copy(Bitmap.Config.ARGB_8888, true);
    targetView.destroyDrawingCache();
    return bmp;
}

Я также использовал ссылку ниже, но это также не дало мне ожидаемого результата.

Получение растрового изображения из вида видимого-невидимого

Я действительно в затруднении.

1 ответ

Решение

Кэш чертежа сохраняет растровое изображение того, что в данный момент отображается на экране. Естественно, это не включает скрытые представления.

Основное различие между статьей, которую вы указали в ссылке, и вашим кодом в том, что в этой статье кэш растровых изображений создан для невидимого представления.

Однако у вас есть видимый родитель, который содержит невидимые представления. Когда вы создаете кэш чертежа для родителя, невидимые виды, конечно, не отображаются.

Чтобы вы могли видеть невидимые виды, вам нужно нарисовать их самостоятельно в растровом изображении, а затем нарисовать это растровое изображение внутри растрового изображения, которое содержит родительский элемент.

Пример кода:

//these fields should be initialized before using
TextView invisibleTextView1;

TextView invisibleTextView2;

ImageView invisibleImageView;

private Bitmap getBitmap(View v) {
    Bitmap bmp = null;
    Bitmap b1 = null;
    RelativeLayout targetView = (RelativeLayout) v;
    targetView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    targetView.buildDrawingCache();
    b1 = targetView.getDrawingCache();
    bmp = b1.copy(Bitmap.Config.ARGB_8888, true);
    targetView.destroyDrawingCache();

    //create a canvas which will be used to draw the invisible views
    //inside the bitmap returned from the drawing cache
    Canvas fullCanvas = new Canvas(bmp);

    //create a list of invisible views
    List<View> invisibleViews = Arrays.asList(invisibleTextView1, invisibleImageView, invisibleTextView2);

    //iterate over the invisible views list
    for (View invisibleView : invisibleViews) {

        //create a bitmap the size of the current invisible view
        //in this bitmap the view will draw itself
        Bitmap invisibleViewBitmap = Bitmap.createBitmap(invisibleView.getWidth(), invisibleView.getHeight(), Bitmap.Config.ARGB_8888);

        //wrap the bitmap in a canvas. in this canvas the view will draw itself when calling "draw" 
        Canvas invisibleViewCanvas = new Canvas(invisibleViewBitmap);

        //instruct the invisible view to draw itself in the canvas we created
        invisibleView.draw(invisibleViewCanvas);

        //the view drew itself in the invisibleViewCanvas, which in term modified the invisibleViewBitmap
        //now, draw the invisibleViewBitmap in the fullCanvas, at the view's position
        fullCanvas.drawBitmap(invisibleViewBitmap, invisibleView.getLeft(), invisibleView.getTop(), null);

        //finally recycle the invisibleViewBitmap
        invisibleViewBitmap.recycle();
    }

    return bmp;
}

Заключительные упоминания:

  • если ваши невидимые представления имеют видимость = View.GONE, вы должны layout(...) на каждом, перед звонком draw(...) в петле.
  • если родительский вид ваших невидимых видов не занимает весь экран, то ваши невидимые виды не будут отображаться в правильном положении, поскольку getLeft() & getTop() вернуть свойства left & top в пикселях относительно родительского местоположения. Если ваши невидимые виды находятся в пределах родительского элемента, который покрывает только часть экрана, используйте вместо этого:

    fullCanvas.drawBitmap(invisibleViewBitmap, invisibleView.getLeft() + parent.getLeft(), v.getTop() + v.getTop(), null);

Дайте мне знать, если это работает!

Другие вопросы по тегам