Когда инициализировать ресурсы, которые будут использоваться внутри Compose Canvas? ⇐ Android
-
Anonymous
Когда инициализировать ресурсы, которые будут использоваться внутри Compose Canvas?
Я использую Jetpack Compose и хочу создать круг с собственными эффектами тени/градиента. Насколько мне известно, невозможно создать это с помощью составных объектов внутри DrawScope, и вместо этого мне приходится использовать NativeCanvas. В моем случае это отлично работает, но, насколько я помню, когда мы используем View и пишем что-то в методе onDraw(), мы НЕ ДОЛЖНЫ ИНИЦИАЛИЗИРОВАТЬ там НОВЫЕ ОБЪЕКТЫ. Поскольку метод вызывается каждые 30/60 кадров в секунду, при использовании анимации создание новых объектов для каждого вызова приведет к снижению производительности.
Где правильно определить эти объекты BlurMaskFilter, RadialGradient, Paint, чтобы их можно было повторно инициализировать только тогда, когда размер составной элемент меняется?
Мне было интересно, следует ли мне определить их как lateinit var вне функции, а затем использовать SideEffect для их инициализации? Я забыл упомянуть, что я использую InfiniteTransition, а затем использую состояние для изменения фигур, нарисованных внутри NativeCanvas!
Коробка( модификатор = Модификатор .size(ширинаDp, ширинаDp) .drawBehind { drawIntoCanvas { холст -> холст.nativeCanvas.apply { val BlurMask = BlurMaskFilter( 15ф, BlurMaskFilter.Blur.NORMAL ) val радиальныйGradient = android.graphics.RadialGradient( 100ф, 100ф, 50ф, intArrayOf(android.graphics.Color.WHITE, android.graphics.Color.BLACK), floatArrayOf(0f, 0.9f), android.graphics.Shader.TileMode.CLAMP ) val краска = Paint().asFrameworkPaint().apply { шейдер = радиальный градиент MaskFilter = BlurMask цвет = android.graphics.Color.WHITE } drawCircle(100f, 100f, 50f, краска) } } } ) { }
Я использую Jetpack Compose и хочу создать круг с собственными эффектами тени/градиента. Насколько мне известно, невозможно создать это с помощью составных объектов внутри DrawScope, и вместо этого мне приходится использовать NativeCanvas. В моем случае это отлично работает, но, насколько я помню, когда мы используем View и пишем что-то в методе onDraw(), мы НЕ ДОЛЖНЫ ИНИЦИАЛИЗИРОВАТЬ там НОВЫЕ ОБЪЕКТЫ. Поскольку метод вызывается каждые 30/60 кадров в секунду, при использовании анимации создание новых объектов для каждого вызова приведет к снижению производительности.
Где правильно определить эти объекты BlurMaskFilter, RadialGradient, Paint, чтобы их можно было повторно инициализировать только тогда, когда размер составной элемент меняется?
Мне было интересно, следует ли мне определить их как lateinit var вне функции, а затем использовать SideEffect для их инициализации? Я забыл упомянуть, что я использую InfiniteTransition, а затем использую состояние для изменения фигур, нарисованных внутри NativeCanvas!
Коробка( модификатор = Модификатор .size(ширинаDp, ширинаDp) .drawBehind { drawIntoCanvas { холст -> холст.nativeCanvas.apply { val BlurMask = BlurMaskFilter( 15ф, BlurMaskFilter.Blur.NORMAL ) val радиальныйGradient = android.graphics.RadialGradient( 100ф, 100ф, 50ф, intArrayOf(android.graphics.Color.WHITE, android.graphics.Color.BLACK), floatArrayOf(0f, 0.9f), android.graphics.Shader.TileMode.CLAMP ) val краска = Paint().asFrameworkPaint().apply { шейдер = радиальный градиент MaskFilter = BlurMask цвет = android.graphics.Color.WHITE } drawCircle(100f, 100f, 50f, краска) } } } ) { }
Мобильная версия