محرر النص الغني
بالنظر إلى أن تحرير النص الغني يحتاج إلى دعم أنواع النصوص الطويلة ، لا يمكن لمعظم النصوص الغنية إعادة استخدام المشاهدات باستخدام EditText المخصصة المخصصة. لذلك ، فإن محرر النصوص الغني الذي تم تنفيذه بناءً على Recycleview قيد التطوير حاليًا.
لتنفيذ محرري النص الأثرياء ، سنفكر بالتأكيد في العديد من الميزات اللازمة التي يحتاجها المحرر المنفذ لدعمه:
1. يتضمن عرض وتحرير عدد كبير من النصوص والصور وأنماط النص.
2. يتضمن تفاعلات المستخدم المعقدة للغاية .
يتم تنفيذ محرر النصوص الغني الذي أعرفه على Github بشكل أساسي على أساس نوعين:
فيما يلي بعض الآراء الشخصية حول هذين الحلين.
بادئ ذي بدء ، هناك عيب واحد لأداء تقديم WebView. ثانياً ، عندما يتضمن تفاعلات معقدة للغاية للحاسوب البشرية ، سيكون من الصعب تنفيذ عرض الويب. نقطة أخرى هي أن توافق WebView هو أيضًا نقطة يجب مراعاتها.
لإعادة كتابة edittext واحدة ، يكون بالفعل قابلاً للتطوير للغاية للتفاعل ، وتقديم النص ، ودعم الأسلوب. ومع ذلك ، بالنظر إلى أنه سيكون هناك عدد كبير من الصور ، يجب أخذ حالة الذاكرة في الاعتبار هنا. بالنسبة إلى EditText ، لا يوجد بالتأكيد عرض عرض. في الأساس ، بقدر الذاكرة التي توجد بها صور ، تتطلب ذلك. من ناحية أخرى ، تم انتقاد TextView الأصليين دائمًا لتقديم كمية كبيرة من النص ، وهناك العديد من الحلول لتحسين أداء TextView.
لذلك انتهى بي الأمر باختيار استخدام RecyClerview كحل تنفيذ لتنفيذ محرر نصية غني. على الرغم من وجود عيوب ، إلا أنه حل ممكن أيضًا. (يتم تنفيذ محرر Douban باستخدام RecyClerview)
المزايا : أولاً وقبل كل شيء ، يتمتع Recyclervie ، كمكون أصلي ، بأداء جيد للغاية لعرض عدد كبير من مكونات واجهة المستخدم. ثانياً ، توفر آلية تعدد الإرسال الخاصة بـ RecyClerview دعمًا جيدًا للتحكم في استهلاك الذاكرة.
العيوب :: بالطبع ، ليس هذا هو الخيار الأول لتنفيذ محرري النص الغني. لقد واجهت العديد من المزالق الكبيرة في عملية التنفيذ. هنا عدد قليل:
1. السيطرة على التركيز
2. الربط البيانات
3. تخزين النمط
4. موقف المؤشر
وأكثر من ذلك بكثير ...
لحسن الحظ ، تم العثور على الحل في النهاية ، لذلك سأشارك حل التنفيذ هذا هنا ، وأقدم حل تنفيذ للأشخاص المحتاجين.
1. BOLD ، مائل ، تسطير ، midscore ، strikethrough ، الارتباط التشعبي ، النمط المرجعي ، H1 ، H2 ، H3 ، H4 من النص.
2. أدخل وحذف الصور
3. حدد نصًا لتغيير النمط في الوقت الحقيقي
4. الحفاظ على النمط في خط الالتفاف في أي مكان.
5. حذف سطرين في سطر واحد للحفاظ على النمط.
6. عرض أنماط النص في الوقت الفعلي مع المؤشر إلى لوحة التحكم.
7. أدخل الأنماط في أي موقف
8. يتم نقل نص التحرير النهائي إلى مولد (هناك أخطاء ~ ...)
انتظر. . .
بالنسبة لتطبيق RecyClerview ، فإن التشغيل المقابل لإرجاع النقل هو إضافة نموذج ، لذلك يتطلب تغليف خط الإرجاع وحذفه الكثير من المعالجة المنطقية ، ويتضمن أيضًا ربط وتجزئة فهارس الأنماط. باختصار ، إنها حفرة كبيرة.
بعد الاختيار ، تحتاج إلى فهرسة المؤشر ، والأناقة ، ومسح وتقسيم النمط ، وإعادة إنشاء وتعيين النمط. حفرة كبيرة ، حفرة كبيرة.
عندما يتوافق المؤشر مع سلسلة النمط المقابل ، فإن اللوحة أدناه تغير النمط الحالي في الوقت الفعلي. من الضروري استخدام الحكم المنطقي للفاصل الزمني لإصدار أحكام منطقية على فترات المؤشر والأناقة ، وهناك المزيد والمزيد من المزالق. . .
هناك أيضًا العديد من المعالجة التفاعلية المعقدة ، والتي لم يتم عرضها هنا. يمكنك التحقق من الرمز المصدر للحصول على التفاصيل.
ريتورتور
لم يتم نشر المشروع إلى Jitpack هنا ، لأنه كمحرر نصفي غني ، كل شخص لديه احتياجاتهم الفريدة وطرق التفاعل الخاصة بهم ، ولا توجد طريقة لتحقيق نص غني يمكن أن يلبي جميع الاحتياجات. ونظرًا لأن منطق التفاعل بين محرري النص الأثرياء معقد بالفعل ، فمن المستحيل ضمان التوافق مع جميع التفاعلات والمواقف ، لذلك نحن هنا بذل قصارى جهدنا لتنفيذ وضع التفاعل.
1.
<com.study.xuan.editor.widget.Editor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
سيتم استخدامه بشكل طبيعي.
إنه بسيط للغاية لدرجة أنه مغلف واستخدامه لاستخدام Richhelper
//绑定xml中的Editor
public void attach(Editor editor);
//new 一个Editor
public Editor buildEditor(Context context)
//部分事件回调
public void setCallBack(onEditorEventListener callBack)
//操作面板右侧空白增加自定义布局
public void setMoreOperateLayout(View view)
//异步转义MarkDown
public void toMarkDown()
public interface onEditorCallback {
//行数量变化时
void onLineNumChange(List<RichModel> data);
//点击操作面板的图片添加图片,可以使用自己项目中的图片框架,选中后对应调用editor.addPhoto(List<String> data);方法即可
void onPhotoEvent();
//转义MarkDown的进度回调
void onMarkDownTaskDoing(int progress, int max);
//转义MarkDown成功
void onMarkDownTaskFinished(String markdown);
}
تساعد Global Singleton ، وهي العمارة الأساسية ، على تنفيذ الوظائف الشاملة لـ Richeditor.
يحتوي Panelbuilder من فئة التنفيذ على فئتين للتنفيذ. يمثل FontParambuilder نمط نوع الحرف ويمثل ParagraphBuilder نمط نوع الفقرة. طريقة الاتصال بين Panle و Editor هي عبر Ipanel في Richbuilder Singleton الأساسي.
فئة الهندسة التجريدية ، تستخدم لإنشاء أنواع الامتداد في الطبقة الخارجية. من بينها ، تنقسم المصانع المجردة إلى ثلاثة مصانع سباحة: Icharacterstylefactory ، IParagraphFactory ، و iupdateappearanceFactory ، والتي تتوافق مع الحرف (مصنع نمط الحرف) ، ParagraphFactory (مصنع نمط الفقرة) ، و (حقوق مخصصة لم يتم تنفيذها).
تُستخدم استراتيجية البحث لاجتياز الأنماط والمعالجة في فقرة معينة. تنفذ Normalmearch IsearchStrategy ويستخدم معالجة اجتياز منتظمة (يمكن تخصيص الفرز السريع أو غيرها من طرق الفرز الفعالة للمعالجة)
واجهة إدارة المعلمات ، تنفذ ParamManager المقابلة للفئة ، والتي يتم استخدامها لمقارنة ومعالجة النمط الحالي وأسلوب ما قبل المدخلات.
يتوافق فئة تنفيذ المحرر ، الموروثة من Recyclerview ، مع Richadapter ، ويتوافق النموذج مع RichModel.
مرشح الإدخال لمعالجة النمط عند الإدخال والحذف.
spanstep1filter
يتم استخدام مرشح المستوى الأول للتعامل مع معالجة SPAN_EXCLUSIVE_INCLUSIVE و SPAN_EXCLUSIVE_EXCLUSIVE عند التعامل مع الإلهات والارتباكات.
spanstep2filter
يتم استخدام مرشح المستوى الثاني للتعامل مع إنشاء أنماط وصيانتها ، للحصول على جميع مجموعات الأنماط للنص الحالي ، ولتسجيل الفهرس المقابل للنمط ، ولصياغةه في RichModel المقابلة.
المعالجة غير المتزامنة ، تستخدم لمعالجة تحويل البيانات إلى نوع التحويل المقابل.
تحليل
تحويل واجهة
MarmdownParse
تم تحويل المعالجة المنطقية إلى بناء جملة مبرر ، باستخدام تعبيرات منتظمة.
فئة معالجة البيانات ، باستخدام معالجة البيانات المتعلقة بأنماط دمج ، أنماط المعالجة ، إلخ.
تمثل اللوحة لوحة التشغيل ، وتستخدم اللوحة Editorpanelalpha افتراضيًا. يتم تنفيذ اللوحة من خلال Ipanel في Richbuilder لربط المحرر.
[2018.3.17]: تحرير النص الغني داخل سطر النص.
[2018.3.19]: أكمل حذف خطوط نص متعددة ، وإضافة سطر واحد ، وحذف السطر التالي إلى السطر السابق. والحفاظ على الأسلوب.
[2018.
[2018.3.24]: تزامن كامل لشريط التشغيل بعد النقر ، والحفاظ على نمط النص الحالي ونمط شريط التشغيل الموحد.
[2018.3.29]: أكمل وظيفة إدخال أنماط جديدة وإكمال الوظائف الأساسية للتحرير في البداية.
[2018.4.09]: وظيفة نمط الفقرة الكاملة.
[2018.4.11]: الانتهاء الأولي للهروب من بناء الجملة.
Copyright 2017 [DrownCoder]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.