Android: растровое изображение в увеличенном виде - PullRequest
6 голосов
/ 15 февраля 2012

ОПИСАНИЕ ПРОБЛЕМЫ:
Я проверил следующие два метода, чтобы создать снимок растрового изображения из представления (например, в этом случае RelativeLayout). Оба метода отлично работают для видов, размеры которых (например, ширина и высота) меньше размеров экрана устройства (например, 480x900). Видимая часть представления фиксируется и записывается в растровое изображение. К сожалению, растровое изображение черное в невидимой части представления.

ВОПРОС:
Как я могу также захватить невидимую часть вида?

КОД:

public class NewRelativeLayout extends RelativeLayout{

private Bitmap bmp;

public NewRelativeLayout(Context context){
    super(context);
    this.setLayoutParams(new RelativeLayout.LayoutParams(2000,2000));
    // add here methods to configure the RelativeLayout or to add children
    }

//This is the first method
public void makeSnapshot_Method1(){
    this.setDrawingCacheEnabled(true);   
    bmp = Bitmap.createBitmap(this.getDrawingCache());   
    this.setDrawingCacheEnabled(false);
    }

//This is the second method
public void makeSnapshot_Method2(){
    bmp = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888);
    Canvas helpCanvas = new Canvas(bmp);
    this.draw(helpCanvas);
    }

}

Ответы [ 3 ]

1 голос
/ 10 апреля 2015

Я тоже искал решение для этого и, в конце концов, сумел придумать свое собственное решение, которое на самом деле довольно просто.

В моем случае у меня был LinearLayout, который содержалнесколько элементов View, некоторые из которых иногда не отображались на экране, вертикально ниже границ экрана.Мне удалось сохранить View как растровое изображение (см. loadBitmapFromView() ниже), но возникли проблемы, когда он вышел за пределы нижней части экрана.

Мое решение состояло в том, чтобы сделать LinearLayout составной ScrollView составной.

например

Это:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_linear_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
 >
<!-- Some Views added here at runtime -->
</LinearLayout>

Стал:

Обратите внимание на использование wrap_content, чтобы ScrollView масштабировался до высоты вашего контента.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    >

    <LinearLayout
        android:id="@+id/my_linear_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
     >
        <!-- Some Views added here at runtime -->
    </LinearLayout>
</ScrollView>

Это, казалось, гарантировало, что за кадромэлементы могли быть размещены вручную, когда я хотел сохранить View как растровое изображение.Я использовал следующий метод для сохранения растрового изображения.Я нашел это намного раньше на SO, но я не могу найти вопрос для того, чтобы ссылаться на него должным образом (кем бы вы ни были - спасибо!).

Для следующего метода я передаю ссылку наLinearLayout выше (my_linear_layout).

public static Bitmap loadBitmapFromView(View view) {
    Bitmap bitmap = null;

    // width measure spec
    int widthSpec = View.MeasureSpec.makeMeasureSpec(
            view.getMeasuredWidth(), View.MeasureSpec.AT_MOST);
    // height measure spec
    int heightSpec = View.MeasureSpec.makeMeasureSpec(
            view.getMeasuredHeight(), View.MeasureSpec.AT_MOST);

    // measure the view
    view.measure(widthSpec, heightSpec);

    // set the layout sizes
    int left = view.getLeft();
    int top = view.getTop();
    int width = view.getMeasuredWidth();
    int height = view.getMeasuredHeight();
    int scrollX = view.getScrollX();
    int scrollY = view.getScrollY();

    view.layout(left, top, width + left, height + top);

    // create the bitmap

    bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
            Bitmap.Config.ARGB_8888);

    // create a canvas used to get the view's image and draw it on the
    // bitmap

    Canvas c = new Canvas(bitmap);
    // position the image inside the canvas
    c.translate(-view.getScrollX(), -view.getScrollY());
    // get the canvas
    view.draw(c);

    return bitmap;
}
0 голосов
/ 29 февраля 2012

Я также пытаюсь выяснить это для ListView, чтобы получить все строки, которых нет на экране.

Я нашел много вещей, которыми хотел бы поделиться:

Здесь кто-то спрашивает, можно ли создать растровое изображение из не нарисованного вида: Растровое изображение из вида не отображается на Android

Здесь они утверждают, что это дубликат, и на него также правильно ответили (?) Он содержит URL с некоторой устаревшей кодировкой и не компилируется. Также возможный дублирующий вопрос не помог мне. Android получить полный просмотр в виде растрового изображения

Я думаю, что я попытаюсь сделать это с помощью этого метода: Просмотр списка с использованием растрового изображения Уже придумал ту же идею, теперь мне еще предстоит выяснить, как.

Надеюсь, вы сможете использовать эту информацию.

0 голосов
/ 15 февраля 2012

Зависит от того, какое изображение вы хотите захватить, изображение с фона или переднего плана вида.В любом случае вы должны получить от них объект Drawable, привести их к BitmapDrawable и получить растровое изображение от них.Код: -

BitmapDrawable bd=(BitmapDrawable) view.getBackground(); //if you need background image
BitmapDrawable bd=(BitmapDrawable) view.getDrawable(); //if you need foreground image (Only available to some views who have an android:src xml property)
Bitmap bm=bd.getBitmap();

Надеюсь, это сработает для вас.

...