Как конвертировать виды в растровые изображения?

У меня два взгляда (Textview & ImageView) в FrameLayoutЯ хочу сохранить изображение с текстом. Для этого я преобразую вид в растровое изображение.

Мой xml это:

<FrameLayout 
     android:id="@+id/framelayout"
     android:layout_marginTop="30dip"
     android:layout_height="fill_parent" 
     android:layout_width="fill_parent">

     <ImageView 
          android:id="@+id/ImageView01"
          android:layout_height="wrap_content" 
          android:layout_width="wrap_content"/>

    <TextView android:id="@+id/text_view"
          android:layout_marginTop="30dip"
          android:layout_width="wrap_content" 
          android:maxLines="20"
          android:scrollbars="vertical"
          android:layout_height="wrap_content"/>

</FrameLayout>

6 ответов

Решение

Как преобразовать вид в растровое изображение

FrameLayout view = (FrameLayout)findViewById(R.id.framelayout);

view.setDrawingCacheEnabled(true);

view.buildDrawingCache();

Bitmap bm = view.getDrawingCache();

Я использовал для buildDrawingCache() метод, чтобы получить растровое изображение моего макета, но у меня были проблемы с ним, когда представление было большим. Сейчас я использую следующий метод:

FrameLayout view = findViewById(R.id.framelayout);
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);

Привет, вы можете получить растровое изображение, используя следующий фрагмент

mView.setDrawingCacheEnabled(true);
mView.getDrawingCache();

Почему бы вам не написать свой класс, который расширяет ImageView и переопределить метод onDraw и поместить туда ваше изображение и текст, это проще

Прежде всего, вам нужно добавить зависимость

      implementation 'com.github.vipulasri.layouttoimage:library:1.0.0'

Затем преобразовать макет в растровое изображение

      RelativeLayout pdfmain;
Layout_to_Image layout_to_image;
Bitmap mBitmap;



    layout_to_image = new Layout_to_Image(AllotmentDoc.this, pdfmain);
    mBitmap = layout_to_image.convert_layout();
          FrameLayout v = (FrameLayout)findViewById(R.id.frme1);

    v.setDrawingCacheEnabled(true);

    // this is the important code :)
  // Without it the view will have a dimension of 0,0 and the bitmap will be null
    v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

    v.buildDrawingCache(true);

    v.post(new Runnable() {
        @Override
        public void run() {
           // Bitmap b = v.getDrawingCache();
            Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
            v.setDrawingCacheEnabled(false); // clear drawing cache
            Log.e("ss","ss"+b.getHeight());
        }
    });

Здесь я добавил сообщение Runnable thread, которое гарантирует, что метод createBitmap будет выполняться только после v.buildDrawingCache(true);. v.buildDrawingCache(истина); занимает несколько миллисекунд на некоторых мобильных устройствах, и именно по этой причине он дает сбой на некоторых мобильных. Попробуйте это решение, если вы столкнулись с исключением нулевого указателя для объекта Bitmap.

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