Как создать shader в Flutter для эффектной анимации в приложении?

(Анимация и Flutter)

(Создание шейдера)

#include  // импорт среды выполнения Flutter

uniform vec2 uSize; // универсальная переменная, в которой хранится размер визуализируемого объекта

uniform float iTime; // универсальная переменная, в которой хранится время, прошедшее с момента запуска шейдера

vec2 iResolution; // переменная, в которой хранится разрешение экрана

out vec4 fragColor; // выходная переменная, в которой хранится окончательный цвет визуализируемого объекта

iResolution = uSize;

       vec2  fragCoord  = FlutterFragCoord();

(Интеграция во Flutter)

class ShimmerFromShader extends StatefulWidget {

  final Widget child;

  final FragmentShader shader;

class _ShimmerFilter extends RenderProxyBox {

 FragmentShader shader;

 double _time;

 _ShimmerFilter(this.shader, this._time);



 @override

 ShaderMaskLayer? get layer => super.layer as ShaderMaskLayer?;



 @override

 bool get alwaysNeedsCompositing => child != null;



 set time(double newValue) {

   if (newValue == _time) {

     return;

   }

   _time = newValue;

   markNeedsPaint();

 }



 @override

 void paint(PaintingContext context, Offset offset) {

   if (child != null) {

     assert(needsCompositing);



     layer ??= ShaderMaskLayer();

     shader.setFloat(0, size.width);

     shader.setFloat(1, size.height);

     shader.setFloat(2, _time);

     layer!

       ..shader = shader

       ..maskRect = Offset.zero & size

       ..blendMode = BlendMode.srcIn;

     context.pushLayer(layer!, super.paint, offset);

   } else {

     layer = null;

   }

 }

(Далее сам пример)

 flutter:

 shaders:

   - shaders/shader.frag

Future loadMyShader() async {

   final program = await FragmentProgram.fromAsset('shaders/shader.frag');

   shader = program.fragmentShader();

   return shader!;

 }

ShimmerFromShader.fromShader(

                 shader: snapshot.data!,

                 child: const SingleChildScrollView(

                   physics: NeverScrollableScrollPhysics(),

                   child: Column(

                     crossAxisAlignment: CrossAxisAlignment.start,

                     mainAxisSize: MainAxisSize.max,

                     children: [

                       BannerPlaceholder(),

                       TitlePlaceholder(width: double.infinity),

                       SizedBox(height: 16.0),

                       ContentPlaceholder(

                         lineType: ContentLineType.threeLines,

                       ),

                       SizedBox(height: 16.0),

                       TitlePlaceholder(width: 200.0),

                       SizedBox(height: 16.0),

                       ContentPlaceholder(

                         lineType: ContentLineType.twoLines,

                       ),

                       SizedBox(height: 16.0),

                       TitlePlaceholder(width: 200.0),

                       SizedBox(height: 16.0),

                       ContentPlaceholder(

                         lineType: ContentLineType.twoLines,

                       ),

                     ],

                   ),

                 ));

(Заключение)

Хотите связаться с владельцем
компании напрямую?
Дмитрий Тарасов
Дмитрий Тарасов
СЕО

НАПИСАТЬ