本文主要介紹在小米便簽APP原有功能的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了便簽添加圖片的功能,從開(kāi)發(fā)過(guò)程、運(yùn)行界面、源代碼三個(gè)方面進(jìn)行詳細(xì)介紹。
本文引用小米便簽社區(qū)開(kāi)源版代碼:https://github.com/MiCode/Notes
小米便簽APP維護(hù)開(kāi)發(fā)完整源代碼地址:https://download.csdn.net/download/weixin_47936614/85436044
開(kāi)發(fā)工具:Android Studio
開(kāi)發(fā)環(huán)境:操作系統(tǒng)win10、jdk1.8.0
一、開(kāi)發(fā)過(guò)程
- 首先在note_edit.xml文件中添加add_img_btn按鈕;
- 在NoteEditActivity.java文件的onCreate()方法中,為這個(gè)“添加圖片”按鈕設(shè)置監(jiān)聽(tīng)器,點(diǎn)擊添加圖片按鈕時(shí),會(huì)觸發(fā)點(diǎn)擊事件;
- 重寫(xiě)onActivityResult()來(lái)處理返回的數(shù)據(jù),并將圖片的路徑也寫(xiě)入到數(shù)據(jù)庫(kù);
- 點(diǎn)擊一個(gè)note后,會(huì)初始化note的內(nèi)容,并通過(guò)convertToImage()將路徑轉(zhuǎn)化為圖片;
- 在退出清單模式之后,仍應(yīng)該將圖片路徑的位置替換為圖片。
在編輯便簽界面添加圖片功能的程序流程圖如圖1所示。
二、運(yùn)行界面
在便簽編輯界面中,點(diǎn)擊“添加圖片”按鈕,選擇相應(yīng)的圖片,插入到便簽中,插入圖片過(guò)程如圖2所示。
在插入圖片后可以繼續(xù)編輯便簽,輸入相應(yīng)的文字或圖片,保存便簽后退出。當(dāng)用戶再次查看便簽時(shí),圖片和文字在相應(yīng)的位置展示出來(lái),如圖3所示。
用戶在編輯便簽界面選擇“進(jìn)入清單模式”,便簽進(jìn)入清單模式,圖片以路徑方式顯示,當(dāng)用戶選擇“退出清單模式”后,圖片將在相應(yīng)位置顯示出來(lái)。如圖4所示。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-431913.html
三、源代碼
- 添加圖片按鈕的xml代碼(FilePath: MiNotes\app\src\main\res\layout\note_edit.xml)
<ImageButton
android:id="@+id/add_img_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="7dp"
android:layout_marginTop="600dp"
android:layout_marginBottom="7dp"
android:src="@android:drawable/ic_menu_gallery" />
- onCreate()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.note_edit);
if (savedInstanceState == null && !initActivityState(getIntent())) {
finish();
return;
}
initResources();
//根據(jù)id獲取添加圖片按鈕
final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn);
//為點(diǎn)擊圖片按鈕設(shè)置監(jiān)聽(tīng)器
add_img_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "onClick: click add image button");
//ACTION_GET_CONTENT: 允許用戶選擇特殊種類的數(shù)據(jù),并返回(特殊種類的數(shù)據(jù):照一張相片或錄一段音)
Intent loadImage = new Intent(Intent.ACTION_GET_CONTENT);
//Category屬性用于指定當(dāng)前動(dòng)作(Action)被執(zhí)行的環(huán)境.
//CATEGORY_OPENABLE; 用來(lái)指示一個(gè)ACTION_GET_CONTENT的intent
loadImage.addCategory(Intent.CATEGORY_OPENABLE);
loadImage.setType("image/*");
startActivityForResult(loadImage, PHOTO_REQUEST);
}
});
}
- convertToImage()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
//路徑字符串格式 轉(zhuǎn)換為 圖片image格式
private void convertToImage() {
NoteEditText noteEditText = (NoteEditText) findViewById(R.id.note_edit_view); //獲取當(dāng)前的edit
Editable editable = noteEditText.getText();//1.獲取text
String noteText = editable.toString(); //2.將note內(nèi)容轉(zhuǎn)換為字符串
int length = editable.length(); //內(nèi)容的長(zhǎng)度
//3.截取img片段 [local]+uri+[local],提取uri
for(int i = 0; i < length; i++) {
for(int j = i; j < length; j++) {
String img_fragment = noteText.substring(i, j+1); //img_fragment:關(guān)于圖片路徑的片段
if(img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")){
int limit = 7; //[local]為7個(gè)字符
//[local][/local]共15個(gè)字符,剩下的為真正的path長(zhǎng)度
int len = img_fragment.length()-15;
//從[local]之后的len個(gè)字符就是path
String path = img_fragment.substring(limit,limit+len);//獲取到了圖片路徑
Bitmap bitmap = null;
Log.d(TAG, "圖片的路徑是:"+path);
try {
bitmap = BitmapFactory.decodeFile(path);//將圖片路徑解碼為圖片格式
} catch (Exception e) {
e.printStackTrace();
}
if(bitmap!=null){ //若圖片存在
Log.d(TAG, "圖片不為null");
ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap);
//4.創(chuàng)建一個(gè)SpannableString對(duì)象,以便插入用ImageSpan對(duì)象封裝的圖像
String ss = "[local]" + path + "[/local]";
SpannableString spannableString = new SpannableString(ss);
//5.將指定的標(biāo)記對(duì)象附加到文本的開(kāi)始...結(jié)束范圍
spannableString.setSpan(imageSpan, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d(TAG, "Create spannable string success!");
Editable edit_text = noteEditText.getEditableText();
edit_text.delete(i,i+len+15); //6.刪掉圖片路徑的文字
edit_text.insert(i, spannableString); //7.在路徑的起始位置插入圖片
}
}
}
}
}
- onActivityResult()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
//重寫(xiě)onActivityResult()來(lái)處理返回的數(shù)據(jù)
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
ContentResolver resolver = getContentResolver();
switch (requestCode) {
case PHOTO_REQUEST:
Uri originalUri = intent.getData(); //1.獲得圖片的真實(shí)路徑
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));//2.解碼圖片
} catch (FileNotFoundException e) {
Log.d(TAG, "onActivityResult: get file_exception");
e.printStackTrace();
}
if(bitmap != null){
//3.根據(jù)Bitmap對(duì)象創(chuàng)建ImageSpan對(duì)象
Log.d(TAG, "onActivityResult: bitmap is not null");
ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap);
String path = getPath(this,originalUri);
//4.使用[local][/local]將path括起來(lái),用于之后方便識(shí)別圖片路徑在note中的位置
String img_fragment= "[local]" + path + "[/local]";
//創(chuàng)建一個(gè)SpannableString對(duì)象,以便插入用ImageSpan對(duì)象封裝的圖像
SpannableString spannableString = new SpannableString(img_fragment);
spannableString.setSpan(imageSpan, 0, img_fragment.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//5.將選擇的圖片追加到EditText中光標(biāo)所在位置
NoteEditText e = (NoteEditText) findViewById(R.id.note_edit_view);
int index = e.getSelectionStart(); //獲取光標(biāo)所在位置
Log.d(TAG, "Index是: " + index);
Editable edit_text = e.getEditableText();
edit_text.insert(index, spannableString); //將圖片插入到光標(biāo)所在位置
mWorkingNote.mContent = e.getText().toString();
//6.把改動(dòng)提交到數(shù)據(jù)庫(kù)中,兩個(gè)數(shù)據(jù)庫(kù)表都要改的
ContentResolver contentResolver = getContentResolver();
ContentValues contentValues = new ContentValues();
final long id = mWorkingNote.getNoteId();
contentValues.put("snippet",mWorkingNote.mContent);
contentResolver.update(Uri.parse("content://micode_notes/note"), contentValues,"_id=?",new String[]{""+id});
ContentValues contentValues1 = new ContentValues();
contentValues1.put("content",mWorkingNote.mContent);
contentResolver.update(Uri.parse("content://micode_notes/data"), contentValues1,"mime_type=? and note_id=?", new String[]{"vnd.android.cursor.item/text_note",""+id});
}else{
Toast.makeText(NoteEditActivity.this, "獲取圖片失敗", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
- getPath()方法(FilePath: MiNotes\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java)
//獲取文件的real path
public String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// 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);
// }
// MediaProvider
// else
if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// Media
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
小米便簽APP維護(hù)開(kāi)發(fā)完整源代碼地址:https://download.csdn.net/download/weixin_47936614/85436044文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-431913.html
到了這里,關(guān)于【軟件應(yīng)用開(kāi)發(fā)】小米便簽APP維護(hù)開(kāi)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!