إنشاء عدسة تكبير في Flutter باستخدام RawMagnifier وتحديد موقعها محليًا وقص محتواها، مع فصل العدسة عن تكبير الصورة كاملة.
العدسة تقرأ ما تحت موضعها
RawMagnifier يعرض جزءًا مكبرًا من المحتوى المرسوم تحته، وتتحكم size وmagnificationScale وfocalPointOffset في العينة. ضعها في Stack فوق صورة محدودة المساحة، ولا تستعمل إحداثيات الشاشة مباشرة كقيم Positioned. حوّل موضع المؤشر إلى فضاء المكون ثم امنع العدسة من الخروج عن حدوده عند الحواف.
التفاعل والوصول
اعرض العدسة أثناء السحب أو الضغط وفق سياسة واضحة، وأخفها عند الإلغاء وانتهاء المؤشر. لا تجعلها تمتص كل الإيماءات إذا كان المستخدم يحتاج تفاعلًا مع الصورة. لمن يحتاج تكبيرًا دائمًا مع تحريك الصورة كاملة، InteractiveViewer أنسب غالبًا. اختبر مؤشر الفأرة واللمس وصورة لم تكتمل وحواف العنصر والاتجاهين.
ضبط مركز العينة
الموضع الذي تضع فيه إطار العدسة ليس بالضرورة مركز البكسلات التي تريد تكبيرها، لذلك جرب focalPointOffset مع العلامة التي تحت المؤشر وتأكد أن العينة تتبعها عند السحب. إذا كان المكون داخل صفحة تمرير فاستعمل الإحداثيات المحلية المناسبة بعد أي تحويل، لا globalPosition مباشرة. اختبر قرب الزوايا حيث تضطر العدسة إلى البقاء داخل الحدود: قد يحتاج مركز العينة تعويضًا مستقلًا عن مكان الإطار. أبق مثالًا صغيرًا بعلامات مرئية قبل استخدام صورة عالية الدقة، ثم أضف صورة ذات حالة فشل وحجم معلوم كي تميز خطأ القياس عن تأخر الشبكة.
مراجعة أخيرة للتطبيق
وفّر زر إعادة ضبط أو إخفاء للعدسة إذا ظلت ظاهرة في نمط تفاعل دائم، واختبر أن المكون لا يمنع تمرير الصفحة عندما لا تكون العدسة نشطة.
خطوات التطبيق والشرح
اضافة عدسة مكبره للصور في تطبيقات Flutter || Add a magnifying glass to images in Flutter applications
في هذا المقال سوف نشرح معكم كيف تقوم بإضافة خاصية عدسة مكبره تظهر في التطبيق الخاص بك وعندما يقوم المستخدم بتمرير العدسه على العناصر سوف تكبر العناصر بالحجم الذي تقوم بتحديده انت ولتنفيذ هذه العملية سوف يكون من خلال widget موجود في Flutter وهيا RawMagnifier ولن تحتاج الى اي مكتبات خارجية اطلاقا لتنفيذ هذه العملية فكل شيئ موجود بداخل لغة البرمجة وكل ما عليك فعله فقط هو تنفيذ الاكواد التاليه حتى تصل في النهايه الى المراد واتبع التعليمات بشكل صحيح حتى لا يحدث معك مشاكل اثناء عملية التنفيذ .
شرح كيفية تكبير جزء معين من الصورة في تطبيقات فلاتر
سوف نقوم بعمل زر يظهر مخفي يكون فوق الصورة بداخل Stack وعندما يقوم المستخدم بالنقر على الصورة تظهر العدسة المكبره وعند تمرير اي عنصر عليها وهيا العدسه سوف يتم تكبير العنصر المراد كما هو موضح بالصورة الخاصه بالمقال , وعند التحريك سوف يتم تحديث الصفحة والحصول على البيانات الجديده بحيث تبقى العدسه موجوده وتكبر العنصر الذي تمر عليه .
RawMagnifier widget ?
يمكن استخدام RawMagnifier في العديد من سيناريوهات الاستخدام المختلفة، مثل:
عرض نص صغير بوضوح أكبر.
تكبير صورة أو رسومات لرؤية التفاصيل الدقيقة.
تكبير جزء من شاشة التطبيق لمزيد من التركيز.
يمكن أن يكون RawMagnifier مفيدًا أيضًا للأشخاص الذين يعانون من إعاقات بصرية. يمكن أن يساعدهم على رؤية المحتوى بوضوح أكبر.
لإنشاء RawMagnifier في Flutter، يمكنك استخدام Widget التالي:
في هذا المثال، يتم تكبير النص الأصلي بمقدار 2.0. يمكنك أيضًا استخدام معلمة focalPoint لتحديد نقطة التركيز للتكبير.
مثال اخر حول انشاء صورة ووضع عدسة مكبره عليها
ui.dart
مثال الشفرة بعد المراجعة
اقرأ التعليقات ومتطلبات الإعداد قبل النقل إلى مشروعك. أمثلة الواجهات ذات main مستقلة، أما العقود والمقاطع الأصلية وملفات الإعداد فموضح نطاقها داخل المثال.
import 'package:flutter/material.dart';
void main() => runApp(const MaterialApp(home: DemoPage()));
class DemoPage extends StatefulWidget {
const DemoPage({super.key});
@override
State<DemoPage> createState() => _DemoPageState();
}
class _DemoPageState extends State<DemoPage> {
Offset? _point;
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: const Text('Flutter lesson')),
body: LayoutBuilder(builder:(context,c)=>GestureDetector(behavior:HitTestBehavior.opaque,onPanStart:(d)=>setState(()=>_point=d.localPosition),onPanUpdate:(d)=>setState(()=>_point=d.localPosition), onPanEnd:(_)=>setState(()=>_point=null), onPanCancel:()=>setState(()=>_point=null), child: Stack(fit:StackFit.expand,children:[const Center(child:FlutterLogo(size:180)),if(_point!=null) Positioned(left:(_point!.dx-50).clamp(0.0,(c.maxWidth-100).clamp(0.0,double.infinity)).toDouble(), top:(_point!.dy-50).clamp(0.0,(c.maxHeight-100).clamp(0.0,double.infinity)).toDouble(),child:const IgnorePointer(child:RawMagnifier(decoration:MagnifierDecoration(shape:CircleBorder(side:BorderSide(color:Colors.teal,width:2))),size:Size(100,100),magnificationScale:2)))]))));
}
مرجع للتنفيذ
راجع التوثيق الخاص بهذا الموضوع وطابق إعداداته مع إصدار أدوات مشروعك. اختبر السلوك المستهدف وحالة الفشل قبل إدماج المثال في تطبيق منشور.






