From db06b962d941513afb8ff939d9c8ca3b66ce1ba2 Mon Sep 17 00:00:00 2001
From: jxl <2759203284@qq.com>
Date: Thu, 12 Jun 2025 01:06:42 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E7=AC=A6=E6=95=B0=E7=BB=9F=E8=AE=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.idea/deploymentTargetSelector.xml | 8 -
.../net/micode/notes/ui/NoteEditText.java | 145 +++++++++++++++---
2 files changed, 121 insertions(+), 32 deletions(-)
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index bb53c87..b268ef3 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,14 +4,6 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/app/src/main/java/net/micode/notes/ui/NoteEditText.java
index 2afe2a8..22f42ec 100644
--- a/app/src/main/java/net/micode/notes/ui/NoteEditText.java
+++ b/app/src/main/java/net/micode/notes/ui/NoteEditText.java
@@ -17,7 +17,10 @@
package net.micode.notes.ui;
import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.Rect;
+import android.graphics.Typeface;
import android.text.Layout;
import android.text.Selection;
import android.text.Spanned;
@@ -30,21 +33,35 @@ import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
-import android.widget.EditText;
+import android.text.TextWatcher;
+import android.text.Editable;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import androidx.appcompat.widget.AppCompatEditText;
import net.micode.notes.R;
import java.util.HashMap;
import java.util.Map;
-public class NoteEditText extends EditText {
+public class NoteEditText extends AppCompatEditText {
private static final String TAG = "NoteEditText";
private int mIndex;
private int mSelectionStartBeforeDelete;
- private static final String SCHEME_TEL = "tel:" ;
- private static final String SCHEME_HTTP = "http:" ;
- private static final String SCHEME_EMAIL = "mailto:" ;
+ // 字数显示相关变量
+ private Paint mPaint;
+ private String mCharacterCountText = "字符数:0";
+ private int mTextColor = 0xFF333333; // 深灰色
+ private float mTextSize = 16f; // sp,字体放大
+ private int mPadding = 12; // dp,边距调整
+ private boolean mIsBold = true; // 字体加粗标志
+
+ private static final String SCHEME_TEL = "tel:";
+ private static final String SCHEME_HTTP = "http:";
+ private static final String SCHEME_EMAIL = "mailto:";
private static final Map sSchemaActionResMap = new HashMap();
static {
@@ -57,29 +74,21 @@ public class NoteEditText extends EditText {
* Call by the {@link NoteEditActivity} to delete or add edit text
*/
public interface OnTextViewChangeListener {
- /**
- * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens
- * and the text is null
- */
void onEditTextDelete(int index, String text);
-
- /**
- * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER}
- * happen
- */
void onEditTextEnter(int index, String text);
-
- /**
- * Hide or show item option when text change
- */
void onTextChange(int index, boolean hasText);
}
private OnTextViewChangeListener mOnTextViewChangeListener;
+ // 用于计算字数
+ private int mCharacterCount = 0;
+
public NoteEditText(Context context) {
super(context, null);
mIndex = 0;
+ initPaint();
+ initTextWatcher();
}
public void setIndex(int index) {
@@ -92,18 +101,60 @@ public class NoteEditText extends EditText {
public NoteEditText(Context context, AttributeSet attrs) {
super(context, attrs, android.R.attr.editTextStyle);
+ initPaint();
+ initTextWatcher();
}
public NoteEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
- // TODO Auto-generated constructor stub
+ initPaint();
+ initTextWatcher();
+ }
+
+ // 初始化画笔用于绘制字数
+ private void initPaint() {
+ mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ mPaint.setTextSize(sp2px(mTextSize)); // 设置更大的字体大小
+ mPaint.setColor(mTextColor);
+
+ // 设置字体加粗
+ if (mIsBold) {
+ // 方法1:使用Typeface设置粗体
+ mPaint.setTypeface(Typeface.DEFAULT_BOLD);
+
+ // 方法2:如果需要使用原始字体但加粗,可以这样设置
+ // mPaint.setTypeface(Typeface.create(mPaint.getTypeface(), Typeface.BOLD));
+
+ // 方法3:使用Fake Bold,注意这与setTypeface是不同的方法
+ // mPaint.setFakeBoldText(true);
+ }
+ }
+
+ // 初始化文本变化监听器
+ private void initTextWatcher() {
+ this.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ String processedText = cutOfimage(operateText(s.toString()));
+ mCharacterCount = processedText.length();
+ mCharacterCountText = "字符数:" + mCharacterCount;
+ invalidate(); // 刷新视图以重绘字数
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+ });
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
-
int x = (int) event.getX();
int y = (int) event.getY();
x -= getTotalPaddingLeft();
@@ -117,7 +168,6 @@ public class NoteEditText extends EditText {
Selection.setSelection(getText(), off);
break;
}
-
return super.onTouchEvent(event);
}
@@ -148,7 +198,7 @@ public class NoteEditText extends EditText {
return true;
}
} else {
- Log.d(TAG, "OnTextViewChangeListener was not seted");
+ Log.d(TAG, "OnTextViewChangeListener was not set");
}
break;
case KeyEvent.KEYCODE_ENTER:
@@ -158,7 +208,7 @@ public class NoteEditText extends EditText {
setText(getText().subSequence(0, selectionStart));
mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text);
} else {
- Log.d(TAG, "OnTextViewChangeListener was not seted");
+ Log.d(TAG, "OnTextViewChangeListener was not set");
}
break;
default:
@@ -214,4 +264,51 @@ public class NoteEditText extends EditText {
}
super.onCreateContextMenu(menu);
}
-}
+
+ public String operateText(String str) {
+ Pattern p = Pattern.compile("\\s+"); // 简化正则表达式
+ Matcher m = p.matcher(str);
+ return m.replaceAll("");
+ }
+
+ public String cutOfimage(String str) {
+ String dest = str;
+ int index1 = dest.indexOf("[local]");
+ int index2 = dest.indexOf("[/local]");
+ while (index1 != -1 && index2 != -1) {
+ dest = dest.substring(0, index1) + dest.substring(index2 + 8);
+ index1 = dest.indexOf("[local]");
+ index2 = dest.indexOf("[/local]");
+ }
+ return dest;
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ }
+
+ // 重写onDraw方法,在右下角绘制字数
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // 计算绘制位置:右下角,调整边距
+ float x = getWidth() - mPaint.measureText(mCharacterCountText) - dp2px(mPadding);
+ float y = getHeight() - dp2px(mPadding);
+
+ canvas.drawText(mCharacterCountText, x, y, mPaint);
+ }
+
+ // dp转px工具方法
+ private int dp2px(float dpValue) {
+ float scale = getContext().getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
+
+ // sp转px工具方法
+ private int sp2px(float spValue) {
+ float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;
+ return (int) (spValue * fontScale + 0.5f);
+ }
+}
\ No newline at end of file
--
2.34.1