diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 6232069..bf3d115 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -139,6 +139,13 @@
android:theme="@android:style/Theme.Holo.Light" >
+
+
+
diff --git a/src/main/java/net/micode/notes/PaintView.java b/src/main/java/net/micode/notes/PaintView.java
new file mode 100644
index 0000000..12ca9b5
--- /dev/null
+++ b/src/main/java/net/micode/notes/PaintView.java
@@ -0,0 +1,271 @@
+package net.micode.notes;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ *
+ * @category: View实现涂鸦、撤销以及重做功能
+ * @author: dingruihua
+ * @date: 2022.10.10
+ *
+ */
+
+public class PaintView extends View {
+
+ private Canvas mCanvas;
+ private Path mPath;
+ private Paint mBitmapPaint;
+ private Bitmap mBitmap;
+ private Paint mPaint;
+
+ private ArrayList savePath;
+ private ArrayList deletePath;
+ private DrawPath dp;
+
+ private float mX, mY;
+ private static final float TOUCH_TOLERANCE = 4;
+
+ private int bitmapWidth;
+ private int bitmapHeight;
+
+ public PaintView(Context c) {
+ super(c);
+ //得到屏幕的分辨率
+ DisplayMetrics dm = new DisplayMetrics();
+ ((Activity) c).getWindowManager().getDefaultDisplay().getMetrics(dm);
+
+ bitmapWidth = dm.widthPixels;
+ bitmapHeight = dm.heightPixels - 2 * 45;
+
+ initCanvas();
+ savePath = new ArrayList();
+ deletePath = new ArrayList();
+
+ }
+ public PaintView(Context c, AttributeSet attrs) {
+ super(c,attrs);
+ //得到屏幕的分辨率
+ DisplayMetrics dm = new DisplayMetrics();
+ ((Activity) c).getWindowManager().getDefaultDisplay().getMetrics(dm);
+
+ bitmapWidth = dm.widthPixels;
+ bitmapHeight = dm.heightPixels - 2 * 45;
+
+ initCanvas();
+ savePath = new ArrayList();
+ deletePath = new ArrayList();
+ }
+ //初始化画布
+ public void initCanvas(){
+
+ mPaint = new Paint();
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+ mPaint.setColor(0xFF00FF00);
+ mPaint.setStyle(Paint.Style.STROKE);
+ mPaint.setStrokeJoin(Paint.Join.ROUND);
+ mPaint.setStrokeCap(Paint.Cap.ROUND);
+ mPaint.setStrokeWidth(10);
+
+ mBitmapPaint = new Paint(Paint.DITHER_FLAG);
+
+
+
+ //画布大小
+ mBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight,
+ Bitmap.Config.RGB_565);
+ mCanvas = new Canvas(mBitmap); //所有mCanvas画的东西都被保存在了mBitmap中
+
+ mCanvas.drawColor(Color.WHITE);
+ mPath = new Path();
+ mBitmapPaint = new Paint(Paint.DITHER_FLAG);
+
+ }
+
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+
+ canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); //显示旧的画布
+ if (mPath != null) {
+ // 实时的显示
+ canvas.drawPath(mPath, mPaint);
+ }
+ }
+ //路径对象
+ class DrawPath{
+ Path path;
+ Paint paint;
+ }
+
+ /**
+ * 撤销的核心思想就是将画布清空,
+ * 将保存下来的Path路径最后一个移除掉,
+ * 重新将路径画在画布上面。
+ */
+ public void undo(){
+
+ System.out.println(savePath.size()+"--------------");
+ if(savePath != null && savePath.size() > 0){
+ //调用初始化画布函数以清空画布
+ initCanvas();
+
+ //将路径保存列表中的最后一个元素删除 ,并将其保存在路径删除列表中
+ DrawPath drawPath = savePath.get(savePath.size() - 1);
+ deletePath.add(drawPath);
+ savePath.remove(savePath.size() - 1);
+
+ //将路径保存列表中的路径重绘在画布上
+ Iterator iter = savePath.iterator(); //重复保存
+ while (iter.hasNext()) {
+ DrawPath dp = iter.next();
+ mCanvas.drawPath(dp.path, dp.paint);
+
+ }
+ invalidate();// 刷新
+ }
+ }
+ /**
+ * 恢复的核心思想就是将撤销的路径保存到另外一个列表里面(栈),
+ * 然后从redo的列表里面取出最顶端对象,
+ * 画在画布上面即可
+ */
+ public void redo(){
+ if(deletePath.size() > 0){
+ //将删除的路径列表中的最后一个,也就是最顶端路径取出(栈),并加入路径保存列表中
+ DrawPath dp = deletePath.get(deletePath.size() - 1);
+ savePath.add(dp);
+ //将取出的路径重绘在画布上
+ mCanvas.drawPath(dp.path, dp.paint);
+ //将该路径从删除的路径列表中去除
+ deletePath.remove(deletePath.size() - 1);
+ invalidate();
+ }
+ }
+ /*
+ * 清空的主要思想就是初始化画布
+ * 将保存路径的两个List清空
+ * */
+ public void removeAllPaint(){
+ //调用初始化画布函数以清空画布
+ initCanvas();
+ invalidate();//刷新
+ savePath.clear();
+ deletePath.clear();
+ }
+
+/*
+ * 保存所绘图形
+ * 返回绘图文件的存储路径
+ *
+ public String saveBitmap(){
+ //获得系统当前时间,并以该时间作为文件名
+ SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMMddHHmmss");
+ Date curDate = new Date(System.currentTimeMillis());//获取当前时间
+ String str = formatter.format(curDate);
+ String paintPath = "";
+ str = str + "paint.png";
+ File dir = new File("/sdcard/notes/");
+ File file = new File("/sdcard/notes/",str);
+ if (!dir.exists()) {
+ dir.mkdir();
+ }
+ else{
+ if(file.exists()){
+ file.delete();
+ }
+ }
+
+ try {
+ FileOutputStream out = new FileOutputStream(file);
+ mBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
+ out.flush();
+ out.close();
+ //保存绘图文件路径
+ paintPath = "/sdcard/notes/" + str;
+
+
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return paintPath;
+ }*/
+
+
+ private void touch_start(float x, float y) {
+ mPath.reset();//清空path
+ mPath.moveTo(x, y);
+ mX = x;
+ mY = y;
+ }
+ private void touch_move(float x, float y) {
+ float dx = Math.abs(x - mX);
+ float dy = Math.abs(y - mY);
+ if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
+ //mPath.quadTo(mX, mY, x, y);
+ mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);//源代码是这样写的,可是我没有弄明白,为什么要这样?
+ mX = x;
+ mY = y;
+ }
+ }
+ private void touch_up() {
+ mPath.lineTo(mX, mY);
+ mCanvas.drawPath(mPath, mPaint);
+ savePath.add(dp);
+ mPath = null;
+
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX();
+ float y = event.getY();
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+
+ mPath = new Path();
+ dp = new DrawPath();
+ dp.path = mPath;
+ dp.paint = mPaint;
+
+ touch_start(x, y);
+ invalidate(); //清屏
+ break;
+ case MotionEvent.ACTION_MOVE:
+ touch_move(x, y);
+ invalidate();
+ break;
+ case MotionEvent.ACTION_UP:
+ touch_up();
+ invalidate();
+ break;
+ }
+ return true;
+ }
+
+}
diff --git a/src/main/java/net/micode/notes/ui/BoardActivity.java b/src/main/java/net/micode/notes/ui/BoardActivity.java
new file mode 100644
index 0000000..4098554
--- /dev/null
+++ b/src/main/java/net/micode/notes/ui/BoardActivity.java
@@ -0,0 +1,46 @@
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageButton;
+
+import net.micode.notes.PaintView;
+import net.micode.notes.R;
+
+public class BoardActivity extends Activity {
+ private PaintView paintView;
+
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState); //调用父类的功能
+ this.setContentView(R.layout.activity_paint);
+ //根据id获取添加图片按钮
+ final ImageButton undo = (ImageButton) findViewById(R.id.undo);
+ //为点击图片按钮设置监听器
+ undo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ paintView.undo();
+ }
+ });
+
+ final ImageButton paint_reset = (ImageButton) findViewById(R.id.paint_reset);
+ //为点击图片按钮设置监听器
+ paint_reset.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ paintView.redo();
+ }
+ });
+
+ final ImageButton paint_delete = (ImageButton) findViewById(R.id.paint_delete);
+ //为点击图片按钮设置监听器
+ paint_delete.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ paintView.removeAllPaint();
+ }
+ });
+ paintView = (PaintView)findViewById(R.id.paint_layout);
+ }
+}
diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java
index 2ecc671..ebff64d 100644
--- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java
+++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java
@@ -1002,23 +1002,23 @@ public class NoteEditActivity extends Activity implements OnClickListener,
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
-// if (isExternalStorageDocument(uri)) {
-// final String docId = DocumentsContract.getDocumentId(uri);
-// final String[] split = docId.split(":");
-// final String type = split[0];
-//
-// if ("primary".equalsIgnoreCase(type)) {
-// return Environment.getExternalStorageDirectory() + "/" + split[1];
-// }
-// }
-// // DownloadsProvider
-// else if (isDownloadsDocument(uri)) {
-// final String id = DocumentsContract.getDocumentId(uri);
-// final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
-// return getDataColumn(context, contentUri, null, null);
-// }
+ if (isExternalStorageDocument(uri)) {
+ final String docId = DocumentsContract.getDocumentId(uri);
+ final String[] split = docId.split(":");
+ final String type = split[0];
+
+ if ("primary".equalsIgnoreCase(type)) {
+ return Environment.getExternalStorageDirectory() + "/" + split[1];
+ }
+ }
+ // DownloadsProvider
+ else if (isDownloadsDocument(uri)) {
+ final String id = DocumentsContract.getDocumentId(uri);
+ final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
+ return getDataColumn(context, contentUri, null, null);
+ }
// MediaProvider
-// else
+ else
if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
@@ -1069,14 +1069,14 @@ public class NoteEditActivity extends Activity implements OnClickListener,
//是否为外部存储文件
-// public boolean isExternalStorageDocument(Uri uri) {
-// return "com.android.externalstorage.documents".equals(uri.getAuthority());
-// }
-//
-// //是否为下载文件
-// public boolean isDownloadsDocument(Uri uri) {
-// return "com.android.providers.downloads.documents".equals(uri.getAuthority());
-// }
+ public boolean isExternalStorageDocument(Uri uri) {
+ return "com.android.externalstorage.documents".equals(uri.getAuthority());
+ }
+
+ //是否为下载文件
+ public boolean isDownloadsDocument(Uri uri) {
+ return "com.android.providers.downloads.documents".equals(uri.getAuthority());
+ }
//是否为媒体文件
public boolean isMediaDocument(Uri uri) {
diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java
index 6169405..cbc96eb 100644
--- a/src/main/java/net/micode/notes/ui/NotesListActivity.java
+++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java
@@ -55,11 +55,13 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.GridView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
+import net.micode.notes.PaintView;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
@@ -80,6 +82,7 @@ import java.util.HashSet;
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
private int mode = -1;
+
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
private static final int FOLDER_LIST_QUERY_TOKEN = 1;
@@ -120,6 +123,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private ModeCallback mModeCallBack;
+ private PaintView paintView;
+
+ private GridView paint_bottomMenu;
+
private static final String TAG = "NotesListActivity";
public static final int NOTES_LISTVIEW_SCROLL_RATE = 30;
@@ -140,7 +147,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_list);
- getWindow().setBackgroundDrawableResource(R.drawable.menu_lover);
initResources();
/**
@@ -833,6 +839,18 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
case R.id.menu_search:
onSearchRequested();
break;
+ case R.id.menu_board: {
+
+ /* 新建一个Intent对象 */
+ Intent intent = new Intent();
+ /* 指定intent要启动的类 */
+ intent.setClass(NotesListActivity.this, BoardActivity.class);
+ /* 启动一个新的Activity */
+ startActivity(intent);
+ /* 关闭当前的Activity */
+ NotesListActivity.this.finish();
+ break;
+ }
default:
break;
}
diff --git a/src/main/res/drawable-hdpi/.idea/.gitignore b/src/main/res/drawable-hdpi/.idea/.gitignore
deleted file mode 100644
index 26d3352..0000000
--- a/src/main/res/drawable-hdpi/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/src/main/res/drawable-hdpi/.idea/drawable-hdpi.iml b/src/main/res/drawable-hdpi/.idea/drawable-hdpi.iml
deleted file mode 100644
index d6ebd48..0000000
--- a/src/main/res/drawable-hdpi/.idea/drawable-hdpi.iml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/res/drawable-hdpi/.idea/misc.xml b/src/main/res/drawable-hdpi/.idea/misc.xml
deleted file mode 100644
index 639900d..0000000
--- a/src/main/res/drawable-hdpi/.idea/misc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/res/drawable-hdpi/.idea/modules.xml b/src/main/res/drawable-hdpi/.idea/modules.xml
deleted file mode 100644
index 370b9c9..0000000
--- a/src/main/res/drawable-hdpi/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/res/drawable-hdpi/menu_lover.png b/src/main/res/drawable-hdpi/menu_lover.png
index a0e8a2c..95a3652 100644
Binary files a/src/main/res/drawable-hdpi/menu_lover.png and b/src/main/res/drawable-hdpi/menu_lover.png differ
diff --git a/src/main/res/drawable-hdpi/menu_young.png b/src/main/res/drawable-hdpi/menu_young.png
index 3ecaa3d..6d5be85 100644
Binary files a/src/main/res/drawable-hdpi/menu_young.png and b/src/main/res/drawable-hdpi/menu_young.png differ
diff --git a/src/main/res/drawable-hdpi/navigationbar_bg.png b/src/main/res/drawable-hdpi/navigationbar_bg.png
new file mode 100644
index 0000000..2ea3923
Binary files /dev/null and b/src/main/res/drawable-hdpi/navigationbar_bg.png differ
diff --git a/src/main/res/drawable-hdpi/paint.png b/src/main/res/drawable-hdpi/paint.png
new file mode 100644
index 0000000..9ff3f18
Binary files /dev/null and b/src/main/res/drawable-hdpi/paint.png differ
diff --git a/src/main/res/drawable-hdpi/paint_clor.png b/src/main/res/drawable-hdpi/paint_clor.png
new file mode 100644
index 0000000..9cdcae9
Binary files /dev/null and b/src/main/res/drawable-hdpi/paint_clor.png differ
diff --git a/src/main/res/drawable-hdpi/paint_delete.png b/src/main/res/drawable-hdpi/paint_delete.png
new file mode 100644
index 0000000..88de254
Binary files /dev/null and b/src/main/res/drawable-hdpi/paint_delete.png differ
diff --git a/src/main/res/drawable-hdpi/paint_reset.png b/src/main/res/drawable-hdpi/paint_reset.png
new file mode 100644
index 0000000..5733e54
Binary files /dev/null and b/src/main/res/drawable-hdpi/paint_reset.png differ
diff --git a/src/main/res/drawable-hdpi/undo.png b/src/main/res/drawable-hdpi/undo.png
new file mode 100644
index 0000000..d410837
Binary files /dev/null and b/src/main/res/drawable-hdpi/undo.png differ
diff --git a/src/main/res/layout/activity_paint.xml b/src/main/res/layout/activity_paint.xml
new file mode 100644
index 0000000..3c178eb
--- /dev/null
+++ b/src/main/res/layout/activity_paint.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/res/menu/note_list.xml b/src/main/res/menu/note_list.xml
index 948f41b..2b73e9f 100644
--- a/src/main/res/menu/note_list.xml
+++ b/src/main/res/menu/note_list.xml
@@ -39,9 +39,13 @@
+ android:title="Background:lover"/>
+ android:title="Background:young"/>
+
+
diff --git a/src/main/res/values/ids.xml b/src/main/res/values/ids.xml
deleted file mode 100644
index 6e79f82..0000000
--- a/src/main/res/values/ids.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- - menu_young
-
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index ae2b092..55df868 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -36,10 +36,10 @@
Browse web
Open map
- /MIUI/notes/
- notes_%s.txt
+ /MIUI/notes/
+ notes_%s.txt
- (%d)
+ (%d)
New Folder
Export text
Sync
@@ -101,7 +101,7 @@
Sync account
Sync notes with google task
Last sync time %1$s
- yyyy-MM-dd hh:mm:ss
+ yyyy-MM-dd hh:mm:ss
Add account
Change sync account
Remove sync account
@@ -126,8 +126,6 @@
Notes
set
cancel
- Background:lover
- Background:young
- %1$s result for \"%2$s\"