Skip to content

Commit 4510e5a

Browse files
committed
新增处理按钮(加粗、斜体、标题等)拥有文本的高亮情况
1 parent 39e40c0 commit 4510e5a

File tree

6 files changed

+290
-98
lines changed

6 files changed

+290
-98
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ dependencies {
4242

4343
implementation 'com.google.code.gson:gson:2.8.5'
4444

45-
// implementation 'com.github.yuruiyin:RichEditor:0.0.9'
45+
// implementation 'com.github.yuruiyin:RichEditor:0.1.9'
4646

4747
implementation 'com.google.android:flexbox:1.0.0'
4848
}

app/src/main/java/com/yuruiyin/richeditor/sample/MainActivity.kt

Lines changed: 103 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.yuruiyin.richeditor.sample
33
import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
6+
import android.support.v4.content.ContextCompat
67
import android.support.v7.app.AppCompatActivity
78
import android.text.TextUtils
89
import android.util.Log
@@ -77,6 +78,99 @@ class MainActivity : AppCompatActivity() {
7778
registerEvents()
7879
}
7980

81+
/**
82+
* 粗体
83+
*/
84+
private fun initBold() {
85+
val styleBtnVm = StyleBtnVm.Builder()
86+
.setType(RichTypeEnum.BOLD)
87+
.setIvIcon(ivBold)
88+
.setIconNormalResId(R.mipmap.icon_bold_normal)
89+
.setIconLightResId(R.mipmap.icon_bold_light)
90+
.setClickedView(ivBold)
91+
.build()
92+
93+
richEditText.initStyleButton(styleBtnVm)
94+
}
95+
96+
/**
97+
* 斜体
98+
*/
99+
private fun initItalic() {
100+
val styleBtnVm = StyleBtnVm.Builder()
101+
.setType(RichTypeEnum.ITALIC)
102+
.setIvIcon(ivItalic)
103+
.setIconNormalResId(R.mipmap.icon_italic_normal)
104+
.setIconLightResId(R.mipmap.icon_italic_light)
105+
.setClickedView(ivItalic)
106+
.build()
107+
108+
richEditText.initStyleButton(styleBtnVm)
109+
}
110+
111+
/**
112+
* 删除线
113+
*/
114+
private fun initStrikeThrough() {
115+
val styleBtnVm = StyleBtnVm.Builder()
116+
.setType(RichTypeEnum.STRIKE_THROUGH)
117+
.setIvIcon(ivStrikeThrough)
118+
.setIconNormalResId(R.mipmap.icon_strikethrough_normal)
119+
.setIconLightResId(R.mipmap.icon_strikethrough_light)
120+
.setClickedView(ivStrikeThrough)
121+
.build()
122+
123+
richEditText.initStyleButton(styleBtnVm)
124+
}
125+
126+
/**
127+
* 下划线
128+
*/
129+
private fun initUnderline() {
130+
val styleBtnVm = StyleBtnVm.Builder()
131+
.setType(RichTypeEnum.UNDERLINE)
132+
.setIvIcon(ivUnderline)
133+
.setIconNormalResId(R.mipmap.icon_underline_normal)
134+
.setIconLightResId(R.mipmap.icon_underline_light)
135+
.setClickedView(ivUnderline)
136+
.build()
137+
138+
richEditText.initStyleButton(styleBtnVm)
139+
}
140+
141+
/**
142+
* 标题
143+
*/
144+
private fun initHeadline() {
145+
val styleBtnVm = StyleBtnVm.Builder()
146+
.setType(RichTypeEnum.BLOCK_HEADLINE)
147+
.setIvIcon(ivHeadline)
148+
.setIconNormalResId(R.mipmap.icon_headline_normal)
149+
.setIconLightResId(R.mipmap.icon_headline_light)
150+
.setClickedView(vgHeadline)
151+
.setTvTitle(tvHeadline)
152+
.setTitleNormalColor(ContextCompat.getColor(this@MainActivity, R.color.headline_normal_text_color))
153+
.setTitleLightColor(ContextCompat.getColor(this@MainActivity, R.color.headline_light_text_color))
154+
.build()
155+
156+
richEditText.initStyleButton(styleBtnVm)
157+
}
158+
159+
/**
160+
* 下划线
161+
*/
162+
private fun initBlockQuote() {
163+
val styleBtnVm = StyleBtnVm.Builder()
164+
.setType(RichTypeEnum.BLOCK_QUOTE)
165+
.setIvIcon(ivBlockquote)
166+
.setIconNormalResId(R.mipmap.icon_blockquote_normal)
167+
.setIconLightResId(R.mipmap.icon_blockquote_light)
168+
.setClickedView(ivBlockquote)
169+
.build()
170+
171+
richEditText.initStyleButton(styleBtnVm)
172+
}
173+
80174
private fun registerEvents() {
81175
// 生成json数据,显示到TextView上
82176
btnCreateJson.setOnClickListener {
@@ -104,71 +198,23 @@ class MainActivity : AppCompatActivity() {
104198
handleClearDraft()
105199
}
106200

107-
// 加粗
108-
richEditText.initStyleButton(
109-
StyleBtnVm(
110-
RichTypeEnum.BOLD,
111-
ivBold,
112-
R.mipmap.icon_bold_normal,
113-
R.mipmap.icon_bold_light,
114-
ivBold
115-
)
116-
)
201+
// 粗体
202+
initBold()
117203

118204
// 斜体
119-
richEditText.initStyleButton(
120-
StyleBtnVm(
121-
RichTypeEnum.ITALIC,
122-
ivItalic,
123-
R.mipmap.icon_italic_normal,
124-
R.mipmap.icon_italic_light,
125-
ivItalic
126-
)
127-
)
205+
initItalic()
128206

129207
// 删除线
130-
richEditText.initStyleButton(
131-
StyleBtnVm(
132-
RichTypeEnum.STRIKE_THROUGH,
133-
ivStrikeThrough,
134-
R.mipmap.icon_strikethrough_normal,
135-
R.mipmap.icon_strikethrough_light,
136-
ivStrikeThrough
137-
)
138-
)
208+
initStrikeThrough()
139209

140210
// 下划线
141-
richEditText.initStyleButton(
142-
StyleBtnVm(
143-
RichTypeEnum.UNDERLINE,
144-
ivUnderline,
145-
R.mipmap.icon_underline_normal,
146-
R.mipmap.icon_underline_light,
147-
ivUnderline
148-
)
149-
)
211+
initUnderline()
150212

151213
// 标题
152-
richEditText.initStyleButton(
153-
StyleBtnVm(
154-
RichTypeEnum.BLOCK_HEADLINE,
155-
ivHeadline,
156-
R.mipmap.icon_headline_normal,
157-
R.mipmap.icon_headline_light,
158-
vgHeadline
159-
)
160-
)
214+
initHeadline()
161215

162216
// 引用
163-
richEditText.initStyleButton(
164-
StyleBtnVm(
165-
RichTypeEnum.BLOCK_QUOTE,
166-
ivBlockquote,
167-
R.mipmap.icon_blockquote_normal,
168-
R.mipmap.icon_blockquote_light,
169-
ivBlockquote
170-
)
171-
)
217+
initBlockQuote()
172218

173219
// 添加图片
174220
ivAddImage.setOnClickListener {
@@ -250,7 +296,7 @@ class MainActivity : AppCompatActivity() {
250296
}
251297
// 以下就是用户自定义的blockType,可能是图片、视频、自定义类型等
252298
BlockImageSpanType.IMAGE -> {
253-
val imageVm= it.image ?: return@forEach
299+
val imageVm = it.image ?: return@forEach
254300
doAddBlockImageSpan(imageVm.path, imageVm, true)
255301
}
256302
BlockImageSpanType.VIDEO -> {
@@ -294,7 +340,7 @@ class MainActivity : AppCompatActivity() {
294340
private fun handleSaveDraft() {
295341
val richEditorBlockList = richEditText.content
296342
// 先将对象进行转换,让里头blockImageSpanObtainObject具体到各自类型的实体上(如ImageVm)
297-
val draftEditorBlockList= convertEditorContent(richEditorBlockList)
343+
val draftEditorBlockList = convertEditorContent(richEditorBlockList)
298344

299345
val jsonContent = Gson().toJson(draftEditorBlockList)
300346
val sp = getSharedPreferences(SP_DRAFT_NAME, Context.MODE_PRIVATE)

app/src/main/res/layout/activity_main.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
android:id="@+id/vgHeadline"
5858
android:layout_width="wrap_content"
5959
android:layout_height="wrap_content"
60+
android:orientation="vertical"
61+
android:gravity="center"
6062
>
6163

6264
<ImageView
@@ -67,6 +69,15 @@
6769
android:src="@mipmap/icon_headline_normal"
6870
/>
6971

72+
<TextView
73+
android:id="@+id/tvHeadline"
74+
android:layout_width="wrap_content"
75+
android:layout_height="wrap_content"
76+
android:text="标题"
77+
android:textSize="10dp"
78+
android:textColor="@color/headline_normal_text_color"
79+
/>
80+
7081
</LinearLayout>
7182

7283
<ImageView

app/src/main/res/values/colors.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,7 @@
55
<color name="colorAccent">#D81B60</color>
66

77
<color name="base_white">#ffffffff</color>
8+
9+
<color name="headline_normal_text_color">#ff1c1c1c</color>
10+
<color name="headline_light_text_color">#ff0cc975</color>
811
</resources>

richeditor/src/main/java/com/yuruiyin/richeditor/RichUtils.java

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.yuruiyin.richeditor;
22

33
import android.app.Activity;
4+
import android.support.annotation.ColorInt;
45
import android.support.annotation.Nullable;
56
import android.text.Editable;
67
import android.text.ParcelableSpan;
@@ -9,8 +10,10 @@
910
import android.text.style.ImageSpan;
1011
import android.util.Log;
1112
import android.view.KeyEvent;
13+
import android.view.View;
1214
import android.widget.ImageView;
1315

16+
import android.widget.TextView;
1417
import com.yuruiyin.richeditor.enumtype.RichTypeEnum;
1518
import com.yuruiyin.richeditor.model.IBlockImageSpanObtainObject;
1619
import com.yuruiyin.richeditor.model.IInlineImageSpanObtainObject;
@@ -82,7 +85,13 @@ void initStyleButton(StyleBtnVm styleBtnVm) {
8285
String type = styleBtnVm.getType();
8386
styleBtnVm.setIsInlineType(isInlineType(type));
8487
mRichTypeToVmMap.put(type, styleBtnVm);
85-
styleBtnVm.getClickedView().setOnClickListener(v -> {
88+
89+
View clickedView = styleBtnVm.getClickedView();
90+
if (clickedView == null) {
91+
clickedView = styleBtnVm.getIvIcon();
92+
}
93+
94+
clickedView.setOnClickListener(v -> {
8695
if (mRichEditText.isFocused()) {
8796
// 若未聚焦,则不响应点击事件
8897
toggleStyle(type);
@@ -358,8 +367,26 @@ void insertStringIntoEditText(CharSequence content, int pos) {
358367
}
359368
}
360369

361-
private void changeStyleBtnImage(ImageView imageView, int resId) {
362-
imageView.setImageResource(resId);
370+
private void changeStyleBtnImage(StyleBtnVm styleBtnVm) {
371+
ImageView ivIcon = styleBtnVm.getIvIcon();
372+
if (ivIcon == null) {
373+
return;
374+
}
375+
376+
ivIcon.setImageResource(
377+
styleBtnVm.isLight() ? styleBtnVm.getLightResId() : styleBtnVm.getNormalResId()
378+
);
379+
}
380+
381+
private void changeStyleBtnText(StyleBtnVm styleBtnVm) {
382+
TextView tvTitle = styleBtnVm.getTvTitle();
383+
if (tvTitle == null) {
384+
return;
385+
}
386+
387+
tvTitle.setTextColor(
388+
styleBtnVm.isLight() ? styleBtnVm.getTitleLightColor() : styleBtnVm.getTitleNormalColor()
389+
);
363390
}
364391

365392
/**
@@ -625,8 +652,8 @@ private void toggleStyle(@RichTypeEnum String type) {
625652
}
626653

627654
styleBtnVm.setLight(!styleBtnVm.isLight()); // 状态取反
628-
changeStyleBtnImage(styleBtnVm.getIvButton(),
629-
styleBtnVm.isLight() ? styleBtnVm.getLightResId() : styleBtnVm.getNormalResId());
655+
changeStyleBtnImage(styleBtnVm);
656+
changeStyleBtnText(styleBtnVm);
630657

631658
if (!styleBtnVm.isInlineType()) {
632659
// 段落样式(标题、引用)
@@ -728,7 +755,8 @@ private void setOtherBlockStyleBtnDisable(@RichTypeEnum String curBlockType) {
728755
for (StyleBtnVm styleBtnVm : mRichTypeToVmMap.values()) {
729756
if (!styleBtnVm.isInlineType() && !styleBtnVm.getType().equals(curBlockType)) {
730757
styleBtnVm.setLight(false);
731-
changeStyleBtnImage(styleBtnVm.getIvButton(), styleBtnVm.getNormalResId());
758+
changeStyleBtnImage(styleBtnVm);
759+
changeStyleBtnText(styleBtnVm);
732760
}
733761
}
734762
}
@@ -853,7 +881,8 @@ private boolean handleInlineStyleButtonStatus(@RichTypeEnum String type) {
853881
private void clearStyleButtonsStatus() {
854882
for (StyleBtnVm styleBtnVm : mRichTypeToVmMap.values()) {
855883
styleBtnVm.setLight(false);
856-
changeStyleBtnImage(styleBtnVm.getIvButton(), styleBtnVm.getNormalResId());
884+
changeStyleBtnImage(styleBtnVm);
885+
changeStyleBtnText(styleBtnVm);
857886
}
858887
}
859888

@@ -878,7 +907,8 @@ private void handleStyleButtonsStatus() {
878907
continue;
879908
}
880909
styleBtnVm.setLight(true);
881-
changeStyleBtnImage(styleBtnVm.getIvButton(), styleBtnVm.getLightResId());
910+
changeStyleBtnImage(styleBtnVm);
911+
changeStyleBtnText(styleBtnVm);
882912
}
883913
}
884914
}

0 commit comments

Comments
 (0)