本周我实现了向SQLite数据库存储用户手写的字符图片的矩阵,因为没有查到关于向SQLite数据库中存二维数组的方法的资料,所以我将这个过程实现为了先将二维数组连接成字符串,然后存入数据库中,取出后再将其转换为二维数组。此外还实现了触键对自定义符号图片的调用以及存储界面和键盘界面的切换。目前仅完成了一个字母A的存储,在接下来一周中我会对工作进行完善。
1首先将字符图片按比例缩小,然后获得缩小后的字符图片的矩阵
private Bitmap scaleBitmap(Bitmap origin, float ratio) { if (origin == null) { return null; } int width = origin.getWidth(); int height = origin.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(ratio, ratio); Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false); if (newBM.equals(origin)) { return newBM; } origin.recycle(); return newBM; } protected int[][] saveBitmapArray(Bitmap bmp) { Bitmap new_bmp = scaleBitmap(bmp,0.15f); int width = new_bmp.getWidth(); int height = new_bmp.getHeight(); //bmp.getPixels(pixels,0,width,0,0,width,height); int[][] ps = new int[height][width];//存成一个长*宽的矩阵 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { int p = new_bmp.getPixel(j, i);//p是-1是白色,p是-16777216是黑色 if (p == -1) ps[i][j] = 1; else ps[i][j] = 0; } } return ps; }
2保存时将数组连接成一个字符串s,然后将id设为对应的字母保存到数据库中
class insertListener implements View.OnClickListener{ @Override public void onClick(View view) { int[][] pixel = saveBitmapArray(baseBitmap); int row = pixel.length; int col = pixel[0].length; for(int i = 0; i<row;i++) { for(int j = 0;j<col;j++) { s += pixel[i][j]+","; } } ContentValues values = new ContentValues(); values.put("id","A"); values.put("content",s); ImageSQLiteHelper dbHelper = new ImageSQLiteHelper(CreateActivity.this,"my_nigh_database"); SQLiteDatabase db = dbHelper.getWritableDatabase(); db.insert("array",null,values); } }
3在键盘页面将数据库中字符对应的字符串取出,保存到一个新的二维数组中,然后调用已写的方法paintNewImage实现字符的重新绘制,并在自定义键盘传入的参数中加入一个Bitmap类型的参数(未来将改为一个Bitmap类型的一维数组,传入所有的字符对应的图片),可以将绘制的图片传入到键盘中,在键盘上按键后显示对应的图片,这里以A为例。
public void getImageArry() { ImageSQLiteHelper dbHelper = new ImageSQLiteHelper(MainActivity.this, "my_nigh_database"); SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("array", new String[]{"id", "content"}, "id=?", new String[]{"A"}, null, null, "id", null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("content")); String id = cursor.getString(cursor.getColumnIndex("id")); System.out.println("" + name + "------------" + id); if(id.equals("A")) imageStr = name.split("[,]"); myImageArray = new int[MY_ROW][MY_COL]; for(int j = 0;j<MY_ROW;j++) { for(int k = 0;k<MY_COL;k++) { myImageArray[j][k] = Integer.parseInt(imageStr[MY_COL*j+k]); } } paintNewImage(myImageArray,myImageArray.length,myImageArray[0].length); } }
numboardUtil = new KeyboardUtil(this, editText,keyboardView,getResources(),showBitmap);
下图中的大A是自己绘制后保存到数据库中的,文本框中的小A是从数据库中读出并在触键后显示在文本输入框中的。通过判断触键的codes来选择对应的图片。
if(primaryCode == 65)//是大写A {Drawable drawable = new BitmapDrawable(bmp); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); SpannableString spannable = new SpannableString(editable .toString() + " "); ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); spannable.setSpan(span,editable.length(), editable.length() + " ".length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); ed.append(spannable);}
字符存储界面和键盘界面通过Intent进行切换,在AndroidMainfest中进行注册
class finishListener implements View.OnClickListener{ @Override public void onClick(View view) { Intent intent = new Intent(CreateActivity.this,MainActivity.class); CreateActivity.this.startActivity(intent); } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mykeyboard01"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".CreateActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:theme="@style/Theme.Transparent" /> </application> </manifest>