دليل احترافي لاستخدام Flutter Shaders لإنشاء تأثيرات بصرية مذهلة
إذا كنت ترغب في إضافة تأثيرات بصرية متقدمة إلى تطبيق Flutter الخاص بك مثل ضبابية الحركة (Motion Blur) أو تأثير RGB Split، فإن مكتبة Flutter Shaders توفر لك أدوات قوية لإنشاء تجربة مستخدم احترافية ومبهرة بسهولة.
في هذا الدليل سنشرح كيفية استخدام Flutter Shaders خطوة بخطوة، مع تطبيق عملي لتأثير Motion Blur وشرح أهم المفاهيم المرتبطة بها.
ما هي مكتبة Flutter Shaders؟
تساعدك هذه المكتبة على إضافة تأثيرات مثل:
– تشتت الألوان (RGB Split) – ضبابية الحركة (Motion Blur) – تأثيرات بصرية ديناميكية
وهي مثالية للتطبيقات التي تحتاج إلى تجربة مستخدم حديثة وجذابة.
ما هو ShaderProvider ولماذا نحتاجه؟
class ShaderProvider extends InheritedWidget {
const ShaderProvider({
super.key,
required this.shader,
required super.child,
});
final ShaderCollection shader;
static ShaderCollection of(BuildContext context) {
final provider =
context.dependOnInheritedWidgetOfExactType();
return provider!.shader;
}
@override
bool updateShouldNotify(covariant ShaderProvider oldWidget) {
return oldWidget.shader != shader;
}
}
شرح الكود
ما هو ShaderCollection؟
– Motion Blur – RGB Split
ويساعدك على تنظيم وإدارة التظليلات داخل التطبيق بشكل احترافي.
طريقة تنفيذ ShaderProvider في التطبيق
import 'dart:ui' as ui;
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final motionBlurDistortionShader = await ui.FragmentProgram.fromAsset('lib/widgets/blur.frag');
runApp(MyApp(design: motionBlurDistortionShader));
}
class MyApp extends StatelessWidget {
final FragmentProgram design;
const MyApp({super.key,required this.design});
@override
Widget build(BuildContext context) {
return ShaderProvider(
shader: ShaderCollection(
motionBlurDistortionShader: design,
rgbSplitDistortionShader: design,
),
child: MaterialApp(
title: 'My Application Test',
home: const MotionBlurDistortionPage(),
),
);
}
}
تطبيق تأثير Motion Blur في Flutter
class MotionBlurDistortionPage extends StatefulWidget {
const MotionBlurDistortionPage({super.key});
@override
State createState() =>
_MotionBlurDistortionPageState();
}
class _MotionBlurDistortionPageState extends State {
late final ScrollController _controller;
ui.Image? previosImage;
double offset = 0;
double velocity = 0;
@override
void initState() {
super.initState();
_controller = ScrollController()
..addListener(scrollListener)
..addListener(() {
if (!_controller.position.isScrollingNotifier.value) {
setState(() {
previosImage = null;
velocity = 0;
});
}
});
}
void scrollListener() {
velocity = offset - _controller.offset;
offset = _controller.offset;
}
}
ملف Shader (blur.frag)
#version 460 core
#include <flutter/runtime_effect.glsl>
uniform vec2 u_size;
uniform vec2 u_velocity;
uniform sampler2D u_texture;
out vec4 frag_color;
void main() {
const int q = 24;
vec2 p = FlutterFragCoord().xy / u_size;
vec2 v = u_velocity / (u_size * 2.0);
float o = -pow((p.y * 2.0) - 1.0, 6.0) + 1.0;
vec4 new_p = vec4(0.0);
for (int i = 0; i < q; i++) {
float offset_x = (o - 1.0) * length(v.y) * 6.0 * (p.x - 0.5);
vec2 sample_pos = vec2(p.x + offset_x + (v.x * float(i)) / float(q), p.y + 0.01 + (v.y * float(i)) / float(q));
new_p += texture(u_texture, sample_pos);
}
new_p /= float(q);
frag_color = new_p;
}
إضافة ملف Shader في pubspec.yaml
flutter:
shaders:
- lib/widgets/blur.frag
نصائح لتحسين أداء Flutter Shaders
أفضل استخدامات Flutter Shaders
الخلاصة
سواء كنت ترغب في إضافة Motion Blur أو RGB Split، يمكنك تحسين تجربة المستخدم بشكل كبير دون تعقيد كبير في الكود.
إذا كنت تسعى لبناء تطبيق احترافي بواجهة حديثة، فإن استخدام Shaders في Flutter خطوة قوية تستحق التجربة.
لمزيد من الدروس المتقدمة في Flutter تابع مقالاتنا القادمة , وايضا يمكنك مشاهده المقاله التاليه : اضافه تاثيرات حركيه (Animations) على النصوص في Flutter



