Top Related Projects
Android平台下的富文本解析器,支持Html和Markdown
RichEditor for Android is a beautiful Rich Text WYSIWYG Editor for Android.
Knife is a rich text editor component for writing documents in Android.
TextView to display simple HTML
Quick Overview
XRichText is a powerful and flexible rich text editor library for iOS and macOS, built using Swift. It provides a comprehensive set of features for creating and manipulating rich text content, including support for various text styles, inline images, and custom views.
Pros
- Extensive Feature Set: XRichText offers a wide range of features for rich text editing, including support for bold, italic, underline, strikethrough, font size, font family, text alignment, and more.
- Customizable: The library allows for a high degree of customization, enabling developers to tailor the editor to their specific needs.
- Cross-Platform: XRichText is available for both iOS and macOS, providing a consistent user experience across Apple's platforms.
- Active Development: The project is actively maintained, with regular updates and bug fixes.
Cons
- Learning Curve: The library has a relatively steep learning curve, especially for developers new to rich text editing.
- Performance: Depending on the complexity of the content being edited, the library may experience some performance issues, particularly on older devices.
- Limited Documentation: The project's documentation could be more comprehensive, making it challenging for new users to get started.
- Dependency on UIKit/AppKit: XRichText is tightly coupled with Apple's UIKit and AppKit frameworks, which may limit its portability to other platforms.
Code Examples
// Creating a new XRichTextView
let richTextView = XRichTextView()
richTextView.frame = view.bounds
view.addSubview(richTextView)
// Inserting text with formatting
let attributedString = NSMutableAttributedString(string: "Hello, World!")
attributedString.addAttribute(.font, value: UIFont.systemFont(ofSize: 18), range: NSRange(location: 0, length: 13))
attributedString.addAttribute(.foregroundColor, value: UIColor.blue, range: NSRange(location: 0, length: 13))
richTextView.attributedText = attributedString
// Inserting an image
let image = UIImage(named: "myImage")
let imageAttachment = NSTextAttachment()
imageAttachment.image = image
let imageString = NSAttributedString(attachment: imageAttachment)
richTextView.textStorage.insert(imageString, at: richTextView.selectedRange.location)
Getting Started
To get started with XRichText, follow these steps:
- Add the XRichText library to your project using a dependency manager like CocoaPods or Carthage.
# CocoaPods
pod 'XRichText'
- Import the XRichText framework in your Swift file.
import XRichText
- Create an instance of
XRichTextView
and add it to your view hierarchy.
let richTextView = XRichTextView()
richTextView.frame = view.bounds
view.addSubview(richTextView)
- Customize the rich text editor by setting various properties and attributes on the
XRichTextView
instance.
richTextView.font = UIFont.systemFont(ofSize: 16)
richTextView.textColor = .black
richTextView.backgroundColor = .white
richTextView.isEditable = true
- Interact with the rich text content using the provided APIs, such as setting the attributed text, inserting images, or handling user interactions.
let attributedString = NSAttributedString(string: "This is some rich text.")
richTextView.attributedText = attributedString
For more advanced usage and customization, refer to the project's documentation and sample code.
Competitor Comparisons
Android平台下的富文本解析器,支持Html和Markdown
Pros of RichText
- Supports a wide range of rich text formatting, including bold, italic, underline, strikethrough, and more.
- Provides a simple and easy-to-use API for integrating rich text into Android applications.
- Offers good performance and is optimized for large amounts of text.
Cons of RichText
- Limited support for custom styling and layout options compared to XRichText.
- May not be as feature-rich as some other rich text libraries, such as XRichText.
- Requires some boilerplate code to set up and configure.
Code Comparison
RichText:
RichTextView richTextView = findViewById(R.id.rich_text_view);
richTextView.setRichText("<b>Hello, World!</b> This is some <i>rich text</i>.");
XRichText:
val richTextView = findViewById<XRichTextView>(R.id.rich_text_view)
richTextView.setRichText(
XRichText.Builder()
.append("Hello, World!")
.bold()
.append(" This is some ")
.italic()
.append("rich text")
.build()
)
RichEditor for Android is a beautiful Rich Text WYSIWYG Editor for Android.
Pros of richeditor-android
- Provides a rich text editor with a wide range of formatting options, including bold, italic, underline, font size, and font color.
- Supports inserting images and links into the text.
- Includes a built-in toolbar for easy access to formatting options.
Cons of richeditor-android
- Requires more setup and configuration compared to XRichText.
- May have a larger footprint in terms of file size and dependencies.
- Lacks some of the advanced features and customization options available in XRichText.
Code Comparison
XRichText:
val richText = XRichText(context)
richText.setTextColor(Color.BLACK)
richText.setFontSize(16f)
richText.setHtml("<b>Hello, World!</b>")
richText.setOnTextChangeListener { text -> /* handle text changes */ }
richeditor-android:
val richEditor = RichEditor(context)
richEditor.setEditorHeight(200)
richEditor.setEditorFontSize(16)
richEditor.setEditorFontColor(Color.BLACK)
richEditor.setPlaceholder("Enter text...")
Knife is a rich text editor component for writing documents in Android.
Pros of Knife
- Knife provides a more comprehensive set of features, including support for tables, images, and code blocks, which are not available in XRichText.
- Knife has a more intuitive and user-friendly API, making it easier to integrate into your project.
- Knife has better performance and is more efficient in handling large amounts of text.
Cons of Knife
- Knife has a larger codebase and may be more complex to set up and configure compared to XRichText.
- Knife may have a steeper learning curve for developers who are new to the library.
- Knife may have fewer community resources and support compared to the more established XRichText.
Code Comparison
XRichText:
let richText = XRichText(frame: view.bounds)
richText.text = "This is a sample text with *bold*, _italic_, and [link](https://example.com)."
richText.font = UIFont.systemFont(ofSize: 16)
richText.textColor = .black
view.addSubview(richText)
Knife:
let knife = Knife(frame: view.bounds)
knife.attributedText = NSAttributedString(string: "This is a sample text with *bold*, _italic_, and [link](https://example.com).", attributes: [
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.black
])
view.addSubview(knife)
TextView to display simple HTML
Pros of html-textview
- Supports a wide range of HTML tags, including tables, lists, and images.
- Provides a simple and lightweight implementation for displaying HTML content.
- Includes built-in support for handling links and clickable elements.
Cons of html-textview
- Limited customization options compared to XRichText.
- May not offer the same level of performance and rendering quality as XRichText.
- Lacks some advanced features like custom styling and event handling.
Code Comparison
XRichText:
val richText = XRichText(context)
richText.setTextWithTags("<b>Bold</b> <i>Italic</i> <u>Underline</u>")
html-textview:
val htmlTextView = HtmlTextView(context)
htmlTextView.text = "<b>Bold</b> <i>Italic</i> <u>Underline</u>"
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
XRichText
ä¸ä¸ªAndroidå¯ææ¬ç±»åºï¼æ¯æå¾ææ··æï¼æ¯æç¼è¾åé¢è§ï¼æ¯ææå ¥åå é¤å¾çã
å®ç°çåçï¼
- 使ç¨ScrollViewä½ä¸ºæå¤å±å¸å±å å«LineaLayoutï¼éé¢å¡«å TextViewåImageViewã
- å é¤çæ¶åï¼æ ¹æ®å æ çä½ç½®ï¼å é¤TextViewåImageViewï¼ææ¬èªå¨å并ã
- çæçæ°æ®ä¸ºlistéåï¼å¯èªå®ä¹å¤çæ°æ®æ ¼å¼ã
注æäºé¡¹
- V1.4çæ¬å¼æ¾äºå¾çç¹å»äºä»¶æ¥å£åå é¤å¾çæ¥å£ï¼å ·ä½ä½¿ç¨æ¹å¼å¯ä»¥åèåé¢çæ档说æï¼ä¹å¯ä»¥åèDemoå®ç°ã
- V1.6çæ¬å级RxJavaå°2.2.3çæ¬ï¼RxAndroidå°2.1.0çæ¬ã设置åä½å¤§å°æ¶éè¦å¸¦çåä½ï¼å¦app:rt_editor_text_size="16sp"ã
- V1.9.3ååç»çæ¬ï¼xrichtextåºä¸å·²å»æGlideä¾èµï¼å¼æ¾æ¥å£å¯ä»¥èªå®ä¹å¾çå è½½å¨ãå ·ä½ä½¿ç¨æ¹å¼å¯ä»¥åèåé¢çæ档说æï¼ä¹å¯ä»¥åèDemoå®ç°ã
- Demoä¸å¾çéæ©å¨ä¸ºç¥ä¹å¼æºåºMatisseï¼éé Android 7.0ç³»ç»ä½¿ç¨FileProviderè·åå¾çè·¯å¾ã
- å¼åç¯å¢æ´æ°ä¸º AS 3.4.2 + Gradle 4.4 + compileSDK 28 + support library 28.0.0ï¼å¯¼å ¥é¡¹ç®æ¥çæ¬é误æ¶ï¼è¯·æå¨ä¿®æ¹ä¸ºèªå·±ççæ¬ã
- 请åèDemoçå®ç°ï¼è¿è¡äºè§£æ¬åºãå¯ä»¥ä½¿ç¨Gradleå¼å ¥ï¼ä¹å¯ä»¥ä¸è½½æºç è¿è¡ä¿®æ¹ã
- å¦æé®é¢ï¼æ¬¢è¿æåºã欢è¿å å ¥QQ群交æµï¼745215148ã
æªå¾é¢è§
使ç¨æ¹å¼
1. ä½ä¸ºmoduleå¯¼å ¥
æxrichtextä½ä¸ºä¸ä¸ªmoduleå¯¼å ¥ä½ çå·¥ç¨ã
2. gradleä¾èµ
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.sendtion:XRichText:1.9.4'
}
å¦æåºç°supportçæ¬ä¸ä¸è´é®é¢ï¼è¯·æé¤XRichTextä¸çsupportåºï¼æè å级èªå·±çsupportåºä¸º28.0.0çæ¬ã 使ç¨æ¹å¼ï¼
implementation ('com.github.sendtion:XRichText:1.9.4') {
exclude group: 'com.android.support'
}
å ·ä½ä½¿ç¨
å¨xmlå¸å±ä¸æ·»å åºäºEditTextç¼è¾å¨ï¼å¯ç¼è¾ï¼
<com.sendtion.xrichtext.RichTextEditor
android:id="@+id/et_new_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rt_editor_text_line_space="6dp"
app:rt_editor_image_height="500"
app:rt_editor_image_bottom="10"
app:rt_editor_text_init_hint="å¨è¿éè¾å
¥å
容"
app:rt_editor_text_size="16sp"
app:rt_editor_text_color="@color/grey_900"/>
å¨xmlå¸å±ä¸æ·»å åºäºTextViewç¼è¾å¨ï¼ä¸å¯ç¼è¾ï¼
<com.sendtion.xrichtext.RichTextView
android:id="@+id/tv_note_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rt_view_text_line_space="6dp"
app:rt_view_image_height="0"
app:rt_view_image_bottom="10"
app:rt_view_text_size="16sp"
app:rt_view_text_color="@color/grey_900"/>
èªå®ä¹å±æ§
å ·ä½åèDemo
- RichTextView
rt_view_image_height å¾çé«åº¦ï¼é»è®¤ä¸º0èªéåºï¼å¯ä»¥è®¾ç½®ä¸ºåºå®æ°å¼ï¼å¦500ã800ç
rt_view_image_bottom ä¸ä¸ä¸¤å¼ å¾ççé´éï¼é»è®¤10
rt_view_text_size æå大å°ï¼ä½¿ç¨spåä½ï¼å¦16sp
rt_view_text_color æåé¢è²ï¼ä½¿ç¨colorèµæºæ件
rt_view_text_line_space åä½è¡è·ï¼è·TextView使ç¨ä¸æ ·ï¼æ¯å¦6dp
- RichTextEditor
rt_editor_image_height å¾çé«åº¦ï¼é»è®¤ä¸º500ï¼å¯ä»¥è®¾ç½®ä¸ºåºå®æ°å¼ï¼å¦500ã800çï¼0为èªéåºé«åº¦
rt_editor_image_bottom ä¸ä¸ä¸¤å¼ å¾ççé´éï¼é»è®¤10
rt_editor_text_init_hint é»è®¤æ示æåï¼é»è®¤ä¸ºâ请è¾å
¥å
容â
rt_editor_text_size æå大å°ï¼ä½¿ç¨spåä½ï¼å¦16sp
rt_editor_text_color æåé¢è²ï¼ä½¿ç¨colorèµæºæ件
rt_editor_text_line_space åä½è¡è·ï¼è·TextView使ç¨ä¸æ ·ï¼æ¯å¦6dp
çææ°æ®
æææ°æ®ä¿å为äºhtmlæ ¼å¼ï¼çæå符串åå¨å°äºæ°æ®åºã
String noteContent = getEditData();
private String getEditData() {
List<RichTextEditor.EditData> editList = et_new_content.buildEditData();
StringBuffer content = new StringBuffer();
for (RichTextEditor.EditData itemData : editList) {
if (itemData.inputStr != null) {
content.append(itemData.inputStr);
} else if (itemData.imagePath != null) {
content.append("<img src=\"").append(itemData.imagePath).append("\"/>");
}
}
return content.toString();
}
æ¾ç¤ºæ°æ®
et_new_content.post(new Runnable() {
@Override
public void run() {
showEditData(content);
}
});
protected void showEditData(String content) {
et_new_content.clearAllLayout();
List<String> textList = StringUtils.cutStringByImgTag(content);
for (int i = 0; i < textList.size(); i++) {
String text = textList.get(i);
if (text.contains("<img")) {
String imagePath = StringUtils.getImgSrc(text);
int width = ScreenUtils.getScreenWidth(this);
int height = ScreenUtils.getScreenHeight(this);
et_new_content.measure(0,0);
Bitmap bitmap = ImageUtils.getSmallBitmap(imagePath, width, height);
if (bitmap != null){
et_new_content.addImageViewAtIndex(et_new_content.getLastIndex(), bitmap, imagePath);
} else {
et_new_content.addEditTextAtIndex(et_new_content.getLastIndex(), text);
}
et_new_content.addEditTextAtIndex(et_new_content.getLastIndex(), text);
}
}
}
å¾çç¹å»äºä»¶
tv_note_content.setOnRtImageClickListener(new RichTextView.OnRtImageClickListener() {
@Override
public void onRtImageClick(String imagePath) {
ArrayList<String> imageList = StringUtils.getTextFromHtml(myContent, true);
int currentPosition = imageList.indexOf(imagePath);
showToast("ç¹å»å¾çï¼"+currentPosition+"ï¼"+imagePath);
// TODO ç¹å»å¾çé¢è§
}
});
å¾çå è½½å¨ä½¿ç¨
请å¨Applicationä¸è®¾ç½®ï¼ç»æµè¯å¨é¦é¡µåå§åä¼åºç°é®é¢ãDemoä» ä¾åèï¼å ·ä½å®ç°æ ¹æ®æ¨ä½¿ç¨çå¾çå è½½å¨èååã
XRichText.getInstance().setImageLoader(new IImageLoader() {
@Override
public void loadImage(String imagePath, ImageView imageView, int imageHeight) {
//å¦ææ¯ç½ç»å¾ç
if (imagePath.startsWith("http://") || imagePath.startsWith("https://")){
Glide.with(getApplicationContext()).asBitmap().load(imagePath).dontAnimate()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
if (imageHeight > 0) {//åºå®é«åº¦
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, imageHeight);//åºå®å¾çé«åº¦ï¼è®°å¾è®¾ç½®è£åªå§ä¸
lp.bottomMargin = 10;//å¾ççåºè¾¹è·
imageView.setLayoutParams(lp);
Glide.with(getApplicationContext()).asBitmap().load(imagePath).centerCrop()
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(imageView);
} else {//èªéåºé«åº¦
Glide.with(getApplicationContext()).asBitmap().load(imagePath)
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(new TransformationScale(imageView));
}
}
});
} else { //å¦ææ¯æ¬å°å¾ç
if (imageHeight > 0) {//åºå®é«åº¦
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, imageHeight);//åºå®å¾çé«åº¦ï¼è®°å¾è®¾ç½®è£åªå§ä¸
lp.bottomMargin = 10;//å¾ççåºè¾¹è·
imageView.setLayoutParams(lp);
Glide.with(getApplicationContext()).asBitmap().load(imagePath).centerCrop()
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(imageView);
} else {//èªéåºé«åº¦
Glide.with(getApplicationContext()).asBitmap().load(imagePath)
.placeholder(R.mipmap.img_load_fail).error(R.mipmap.img_load_fail).into(new TransformationScale(imageView));
}
}
}
});
TransformationScale类请åèDemo
å ·ä½ç使ç¨æ¹å¼ï¼è¯·åèDemo代ç ã
æ´æ°åå²
v1.9.4 2019.11.05
- libï¼è§£å³ç½ç»å¾çä¸è½èªéåºé«åº¦çé®é¢ï¼
- demoï¼æä¾å è½½httpså¾çå®ç°æ¹å¼ï¼
- demoï¼XRichText设置å¾çå è½½å¨æ¾ç½®å¨Applicationä¸ã
v1.9.3 2019.10.19
- å»é¤ä¾èµçGlideï¼æ¹ä¸ºæ¥å£åè°ï¼å¯ä½¿ç¨èªå®ä¹å¾çå è½½å¨
- ä¼å代ç ç»æï¼æå稳å®æ§
v1.9.1 2019.04.30
- å¾çç¹å»äºä»¶æ¥å£è¿åç¹å»çView
- ä¿®å¤å¾çæ¾ç¤ºæ¶é«åº¦æ伸åå½¢é®é¢
- Demoä¸å®ç°äºç¹å»å¾çæ¾å¤§æµè§åè½
- Supportæ¯æåºå级为28.0.0
v1.9.0 2019.04.10
- ç¼è¾æ¶æ¯æå ³é®è¯é«äº®
- ä¿®å¤æå ¥å¾çæ¶ç©ºæéå¼å¸¸
- 代ç å¼å¸¸å¤ç
v1.8 2018.12.02
- ä¿®å¤ç¼è¾æ¶è®¾ç½®æåé¢è²æ æçé®é¢
- ç¼è¾æ¶æ·»å åå é¤å¾çå å ¥å¨ç»ææ
v1.6 2018.11.16
- RxJavaå级å°2.2.3çæ¬ï¼RxAndroidå级å°2.1.0çæ¬
- ç¼è¾å¾çæ¶æ¯æèªéåºé«åº¦ï¼é«åº¦è®¾ç½®ä¸º0å³èªéåºï¼æ¯å¦app:rt_editor_image_height="0"
- ä¿®æ¹åä½å¤§å°è®¾ç½®æ¹å¼ï¼åæ£å¸¸ä½¿ç¨å¸¦çåä½ï¼æ¯å¦app:rt_editor_text_size="16sp"
- æ¯æ设置åä½è¡é´è·ï¼æ¯å¦app:rt_editor_text_line_space="6dp"
- ä¿®å¤xrichtextåºåDemoä¸çåç§å´©æºå¼å¸¸
v1.5 2018.07.10
- ä¿®å¤è¯¦æ 页è¿ç»å è½½å¤å¼ å¾ç导è´åç»å¾çé½è·ç¬¬ä¸å¼ å¾çç¸åé«åº¦çé®é¢
- ä¿®å¤Demoæå ¥å¾çåç¹å»å¾ç导è´ç©ºæéå¼å¸¸çé®é¢
- å»æDemoæå ¥å¾çåä¼æå ¥ä¸å¼ ç½ç»å¾ççæµè¯ä»£ç
v1.4 2018.06.22
- æ·»å èªå®ä¹å±æ§ï¼å¯ä»¥è®¾ç½®å¾çé«åº¦ï¼ç¸é»å¾çé´éï¼æå大å°åé¢è²
- ä¿®å¤æ²¡æå®ç°å¾çå é¤æ¥å£å¯¼è´çå´©æºé®é¢ï¼å¼æ¾å¾çå é¤æ¥å£
- æ·»å ç¹å»å¾çæ¥ç大å¾çåè½ï¼å¼æ¾å¾çç¹å»æ¥å£
- å å ¥å´©æºæ¥å¿ä¿¡æ¯å±ç¤ºï¼å å ¥å´©æºæ¥å¿ä¿¡æ¯åéå°é®ä»¶
- ä¼åå¾çæå ¥ä»£ç ï¼å é¤å¤ä½çæ ç¨ä»£ç
v1.3 2018.05.05
- æ´æ°Glideä¾èµçæ¬ä¸º4.7.1ï¼Glide4使ç¨æ¹å¼ï¼http://bumptech.github.io/glide/doc/getting-started.html
- å¼åç¯å¢æ´æ°å°AS 3.1.2 + Gradle 4.4
- ä¼åå¾çæå ¥çé»è¾
- å¨Demoä¸å å ¥æå ¥ç½ç»å¾çç示ä¾ä»£ç
- å¨Demoä¸å¾çéæ©å¨æ´æ¢ä¸ºç¥ä¹matisse
v1.2 2018.04.05
- ç¼è¾ç¬è®°æ¶ï¼ä½¿ç¨æ¥å£åè°å¨å¤é¨å¤çå¾ççå é¤æä½ï¼å¯ä»¥èªè¡å®ç°å é¤æ¬å°å¾çè¿æ¯ç½ç»å¾ç
- å®ç°ç½ç»å¾ççå è½½ï¼æå ¥å¾çæ¶ï¼å¯ä»¥ä¼ å ¥æ¬å°å¾çSDå¡è·¯å¾ï¼ä¹å¯ä»¥ä¼ å ¥ç½ç»å¾çå°å
- å¨æ°å»ºæç¼è¾ç¬è®°æ¶ï¼è¿ç»å¤å¼ å¾çä¹é´æå ¥è¾å ¥æ¡ï¼æ¹ä¾¿å¨å¾çé´è¾å ¥ææ¬å 容
- ä¿®å¤å¨æ件ä¸é´æå ¥å¾çæ¶ï¼å¯¼è´çåé¢æå丢失çé®é¢
- ä¿®å¤è¿ç»æå ¥å¤å¼ å¾çæ¶ï¼ä¼åºç°å¾çååºæå ¥çé®é¢
v1.1 2017.03.27
- ä¼åå åå ç¨ï¼è§£å³å å溢åºé®é¢
- ç»åRxJava使ç¨ï¼åèDemoï¼
- æ¯æè¿ç»æå ¥å¤å¼ å¾çä¸å¡é¡¿ï¼åèDemoï¼
- 解å³æå ¥å¾ç导è´çå¡é¡¿åå´©æº
v1.0 2016.10.26
- å次æ交
- å®ç°æå ¥å¾ç
- å®ç°å¾ææ··æ
- å®ç°ç¼è¾åä¿å
æè°¢
æ¬åºåèäºä»¥ä¸é¡¹ç®ï¼æè°¢åä½å¤§ç¥çä¼ç§ä½åï¼
å ¶ä»
- 个人å客ï¼http://www.sendtion.cn
- CSDNï¼http://blog.csdn.net/shuyou612
- GitHubï¼https://github.com/sendtion
- 欢è¿å¤§å®¶forkãstarï¼ä¹æ¬¢è¿å¤§å®¶åä¸ä¿®æ¹ã
License
Copyright 2019 sendtion
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.
Top Related Projects
Android平台下的富文本解析器,支持Html和Markdown
RichEditor for Android is a beautiful Rich Text WYSIWYG Editor for Android.
Knife is a rich text editor component for writing documents in Android.
TextView to display simple HTML
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot