Также вопрос касается видео, а не GIF

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

этот).Во всяком случае, для этого я нашел разные места, говорящие об этом, и на основе этого

библиотека github (в котором есть некоторые ошибки), я, наконец, получил его на работу.Проблема

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

В настоящее время он всегда растягивается до размера экрана, что означает, что это (видео взято из

Вот):получает показать как это:

Причина в другом соотношении сторон: 560x320 (разрешение видео) и 1080x1920 (разрешение устройства).

Примечание: я хорошо знаком с решениями по масштабированию видео, которые доступны в различных репозиториях Github (таких как

Вот), но я спрашиваю про живые обои. Как таковой, он не имеет представления, поэтому он более ограничен в том, как что-то делать. Точнее говоря, решение не может иметь какого-либо макета, TextureView, SurfaceView или любого другого вида.Что я пробовал

Я пытался играть с различными полями и функциями SurfaceHolder, но пока безуспешно. Примеры:

setVideoScalingMode

 - либо вылетает, либо ничего не делает.изменения

surfaceFrame - такой же.Вот текущий код, который я сделал (полный проект доступен

Вот):Вопросы

class MovieLiveWallpaperService : WallpaperService() {
    override fun onCreateEngine(): WallpaperService.Engine {
        return VideoLiveWallpaperEngine()
    }

    private enum class PlayerState {
        NONE, PREPARING, READY, PLAYING
    }

    inner class VideoLiveWallpaperEngine : WallpaperService.Engine() {
        private var mp: MediaPlayer? = null
        private var playerState: PlayerState = PlayerState.NONE

        override fun onSurfaceCreated(holder: SurfaceHolder) {
            super.onSurfaceCreated(holder)
            Log.d("AppLog", "onSurfaceCreated")
            mp = MediaPlayer()
            val mySurfaceHolder = MySurfaceHolder(holder)
            mp!!.setDisplay(mySurfaceHolder)
            mp!!.isLooping = true
            mp!!.setVolume(0.0f, 0.0f)
            mp!!.setOnPreparedListener { mp ->
                playerState = PlayerState.READY
                setPlay(true)
            }
            try {
                //mp!!.setDataSource(this@MovieLiveWallpaperService, Uri.parse("http://techslides.com/demos/sample-videos/small.mp4"))
                mp!!.setDataSource(this@MovieLiveWallpaperService, Uri.parse("android.resource://" + packageName + "/" + R.raw.small))
            } catch (e: Exception) {
            }
        }

        override fun onDestroy() {
            super.onDestroy()
            Log.d("AppLog", "onDestroy")
            if (mp == null)
                return
            mp!!.stop()
            mp!!.release()
            playerState = PlayerState.NONE
        }

        private fun setPlay(play: Boolean) {
            if (mp == null)
                return
            if (play == mp!!.isPlaying)
                return
            when {
                !play -> {
                    mp!!.pause()
                    playerState = PlayerState.READY
                }
                mp!!.isPlaying -> return
                playerState == PlayerState.READY -> {
                    Log.d("AppLog", "ready, so starting to play")
                    mp!!.start()
                    playerState = PlayerState.PLAYING
                }
                playerState == PlayerState.NONE -> {
                    Log.d("AppLog", "not ready, so preparing")
                    mp!!.prepareAsync()
                    playerState = PlayerState.PREPARING
                }
            }
        }

        override fun onVisibilityChanged(visible: Boolean) {
            super.onVisibilityChanged(visible)
            Log.d("AppLog", "onVisibilityChanged:" + visible + " " + playerState)
            if (mp == null)
                return
            setPlay(visible)
        }

    }

    class MySurfaceHolder(private val surfaceHolder: SurfaceHolder) : SurfaceHolder {
        override fun addCallback(callback: SurfaceHolder.Callback) = surfaceHolder.addCallback(callback)

        override fun getSurface() = surfaceHolder.surface!!

        override fun getSurfaceFrame() = surfaceHolder.surfaceFrame

        override fun isCreating(): Boolean = surfaceHolder.isCreating

        override fun lockCanvas(): Canvas = surfaceHolder.lockCanvas()

        override fun lockCanvas(dirty: Rect): Canvas = surfaceHolder.lockCanvas(dirty)

        override fun removeCallback(callback: SurfaceHolder.Callback) = surfaceHolder.removeCallback(callback)

        override fun setFixedSize(width: Int, height: Int) = surfaceHolder.setFixedSize(width, height)

        override fun setFormat(format: Int) = surfaceHolder.setFormat(format)

        override fun setKeepScreenOn(screenOn: Boolean) {}

        override fun setSizeFromLayout() = surfaceHolder.setSizeFromLayout()

        override fun setType(type: Int) = surfaceHolder.setType(type)

        override fun unlockCanvasAndPost(canvas: Canvas) = surfaceHolder.unlockCanvasAndPost(canvas)
    }
}
Я хотел бы знать, как настроить масштаб содержимого на основе того, что у нас есть для ImageView, при этом сохраняя соотношение сторон:

посев по центру - подходит для 100% контейнера (в данном случае экрана), обрезая по бокам (сверху и снизу или слева и справа) при необходимости. Ничего не растягивает. Это означает, что содержимое выглядит нормально, но не все из него могут быть показаны.

Fit-Center - растянуть, чтобы соответствовать ширине / высотеcenter-inside - задайте исходный размер, отцентрируйте и растяните по ширине / высоте, только если они слишком велики.Вы пытались установить размер видео для держателя поверхности с помощью setFixedSize

Ответы на вопрос(3)

Ваш ответ на вопрос