Захват макета экрана в Android - PullRequest
1 голос
/ 13 февраля 2020

Я столкнулся с проблемой. Я хочу сделать снимок экрана с макетом XML. Я знаю, что в этом вопросе много топи c. Я читаю их всех. Но никто из них не помог мне. Примечание. Я хочу получить снимок экрана с макетом, который не является частью текущей операции

, это моя функция, которая должна делать захват макета Y (вызывается для операции X)

fun getTestCapture() : Bitmap{
    val view = layoutInflater.inflate(R.layout.activity_test, null)
    val layout = view.findViewById<LinearLayout>(R.id.linearLayout)

    layout.layout(0,0, layout.measuredWidth, layout.measuredHeight)
    val bitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    val background = layout.background

    if (background != null) {
        background.draw(canvas)
    }

    layout.draw(canvas)

    storeScreenShot(bitmap, "test.jpg", this)

    return bitmap

}

И когда я сохраняю растровое изображение, оно мне ничего не показывает. Моя функция сохранения растрового изображения работает нормально, я не хочу беспокоить вас этим. Поэтому мой вопрос прост: почему моя функция не работает?

Ответы [ 3 ]

1 голос
/ 13 февраля 2020

Попробуйте приведенное ниже решение

Java

yourView.post(new Runnable() {
    @Override
    public void run() {
        //take screenshot
        Bitmap myBitmap = captureScreen(binding.llMain);
        Log.e(TAG, "run :: Screenshot captured..!");
        try {
            if (myBitmap != null) {
                //your save image code
                Log.e(TAG, "run :: Screenshot saved..!");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
});

private Bitmap captureScreen(View v) {
    Bitmap screenshot = null;
    try {
        if (v != null) {
            screenshot = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(screenshot);
            v.draw(canvas);
        }
    } catch (Exception e) {
        Log.e(TAG, "Failed to capture screenshot because:" + e.getMessage());
    }
    return screenshot;
}

Kotlin

binding.idLayout.post(Runnable {
    val myBitmap = getScreenShotFromView(binding.idLayout)
    try {
        if (myBitmap != null) {
            storeScreenShot(myBitmap, "test2.jpg", this@TelecollecteActivity)
        }
    } catch (e: java.lang.Exception) {
        Log.e("BLABLA", "Error ::" + e.message)
    }
})

fun getScreenShotFromView(v: View): Bitmap? {
    var screenshot: Bitmap? = null
    try {
        if (v != null) {
            screenshot = Bitmap.createBitmap(v.measuredWidth, v.measuredHeight, Bitmap.Config.ARGB_8888)
            val canvas = Canvas(screenshot)
            v.draw(canvas)
        }
    } catch (e: Exception) {
        Log.e("BLABLA", "Failed to capture screenshot because:" + e.message)
    }
    return screenshot
}

Для справки

Я также добавил полный код, который я тестировал, и он отлично работает для меня.

activity_main_two. xml

Если вы используете черный цвет Итак, вам нужно добавить цвет фона как белый другие тиски полного изображения отображаются как черные.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/llMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/White"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".Main2Activity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hardik Talaviya" />

</LinearLayout>

Main2Activity

class Main2Activity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_two)

        llMain.post(Runnable {
            val myBitmap = getScreenShotFromView(llMain)
            try {
                if (myBitmap != null) {
                    //storeScreenShot(myBitmap, "test2.jpg", this@TelecollecteActivity)
                    val extr = Environment.getExternalStorageDirectory().toString()
                    val myPath = File(extr, "test.jpg")
                    var fos: FileOutputStream? = null

                    try {
                        fos = FileOutputStream(myPath)
                        myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
                        fos!!.flush()
                        fos!!.close()
                        MediaStore.Images.Media.insertImage(contentResolver, myBitmap,
                                "Screen", "screen")

                    } catch (e: FileNotFoundException) {
                        // TODO Auto-generated catch block
                        e.printStackTrace()
                    } catch (e: Exception) {
                        // TODO Auto-generated catch block
                        e.printStackTrace()
                    }

                }
            } catch (e: java.lang.Exception) {
                Log.e("BLABLA", "Error ::" + e.message)
            }
        })
    }

    fun getScreenShotFromView(v: View): Bitmap? {
        var screenshot: Bitmap? = null
        try {
            if (v != null) {
                screenshot = Bitmap.createBitmap(v.measuredWidth, v.measuredHeight, Bitmap.Config.ARGB_8888)
                val canvas = Canvas(screenshot)
                v.draw(canvas)
            }
        } catch (e: Exception) {
            Log.e("BLABLA", "Failed to capture screenshot because:" + e.message)
        }
        return screenshot
    }
}

Сохраненное изображение снимка экрана

Ссылка на изображение

Надеюсь, это поможет вам !

0 голосов
/ 13 февраля 2020

Так вот, что я и сделал, но у меня все еще пустое изображение.

binding.idLayout

- это мой LinearLayout с содержимым, которое я извлекаю с привязкой данных

run { Log.v("BLABLA", "jifjifoer")
            val myBitmap = getScreenShotFromView(binding.idLayout)
            try {
                if (myBitmap != null){
                    storeScreenShot(myBitmap, "test2.jpg", this@TelecollecteActivity)
                }
            }catch (e : java.lang.Exception){} }

Получить функцию экрана

fun getScreenShotFromView(v: View) : Bitmap? {
    var screenshot : Bitmap? = null;
    try {
        if (v != null) {
            screenshot = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888);
            val canvas = Canvas(screenshot);
            v.draw(canvas);
        }
    } catch (e : Exception) {
        Log.e("BLABLA", "Failed to capture screenshot because:" + e.message);
    }
    return screenshot
}

РЕДАКТИРОВАТЬ

view.post(object : Runnable{
            override fun run() {
                Log.v("BLABLA", "jifjifoer")
                val myBitmap = getScreenShotFromView(binding.parent)
                try {
                    if (myBitmap != null){
                        storeScreenShot(myBitmap, "test2.jpg", this@TelecollecteActivity)
                    }
                }catch (e : java.lang.Exception){}
            }
        })
0 голосов
/ 13 февраля 2020

Вам нужен следующий код

layout.buildDrawingCache(true);
bitmap = layout.getDrawingCache(true).copy(Config.ARGB_8888, false);
layout.destroyDrawingCache();

, он захватит представление в растровое изображение, и это растровое изображение может быть сохранено в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...