本周我首先在上周的键盘基础上进行了改进,增加了字母键盘,基本完成了自定义键盘,包括数字键盘和字母键盘之间的转换,以及字母键盘的大小写等功能。其次开始着手用户手写字体的输入保存,通过查阅资料后我决定使用SQLite数据库对用户的手写字图片进行保存。
字母键盘的xml文件,用来对键盘的排列键盘布局:
<?xml version="1.0" encoding="UTF-8"?> <Keyboard android:keyWidth="10%p" android:keyHeight="60dp" android:horizontalGap="0.0px" android:verticalGap="0.0px" xmlns:android="http://schemas.android.com/apk/res/android"> <Row> <Key android:codes="113" android:keyEdgeFlags="left" android:keyLabel="q" /> <Key android:codes="119" android:keyLabel="w" /> <Key android:codes="101" android:keyLabel="e" /> <Key android:codes="114" android:keyLabel="r" /> <Key android:codes="116" android:keyLabel="t" /> <Key android:codes="121" android:keyLabel="y" /> <Key android:codes="117" android:keyLabel="u" /> <Key android:codes="105" android:keyLabel="i" /> <Key android:codes="111" android:keyLabel="o" /> <Key android:codes="112" android:keyEdgeFlags="right" android:keyLabel="p" /> </Row> <Row> <Key android:horizontalGap="4.999995%p" android:codes="97" android:keyEdgeFlags="left" android:keyLabel="a" /> <Key android:codes="115" android:keyLabel="s" /> <Key android:codes="100" android:keyLabel="d" /> <Key android:codes="102" android:keyLabel="f" /> <Key android:codes="103" android:keyLabel="g" /> <Key android:codes="104" android:keyLabel="h" /> <Key android:codes="106" android:keyLabel="j" /> <Key android:codes="107" android:keyLabel="k" /> <Key android:codes="108" android:keyEdgeFlags="right" android:keyLabel="l" /> </Row> <Row> <Key android:keyWidth="14.999998%p" android:codes="-1" android:keyEdgeFlags="left" android:isModifier="true" android:isSticky="true" android:keyIcon="@drawable/keyboard_shift" /> <Key android:codes="122" android:keyLabel="z" /> <Key android:codes="120" android:keyLabel="x" /> <Key android:codes="99" android:keyLabel="c" /> <Key android:codes="118" android:keyLabel="v" /> <Key android:codes="98" android:keyLabel="b" /> <Key android:codes="110" android:keyLabel="n" /> <Key android:codes="109" android:keyLabel="m" /> <Key android:keyWidth="14.999998%p" android:codes="-5" android:keyEdgeFlags="right" android:isRepeatable="true" android:keyIcon="@drawable/keyboard_delete" /> </Row> <Row android:rowEdgeFlags="bottom"> <Key android:keyWidth="20.000004%p" android:codes="-2" android:keyLabel="12#" /> <Key android:keyWidth="14.999998%p" android:codes="44" android:keyLabel="," /> <Key android:keyWidth="29.999996%p" android:codes="32" android:isRepeatable="true" android:keyIcon="@drawable/keyboard_space" /> <Key android:keyWidth="14.999998%p" android:codes="46" android:keyLabel="." /> <Key android:keyWidth="20.000004%p" android:codes="-3" android:keyEdgeFlags="right" android:keyLabel="完成" /> </Row> </Keyboard>
然后是对上周的自定义键盘类的改进,下面为为了实现大小写转换定义的方法,isupper是一个布尔变量,来决定大小写,然后通过对key的label的重写和codes的重定义来完成大小写切换。
private void changeKey() { List<Keyboard.Key> keylist = k1.getKeys(); if (isupper) {//大写切换小写 isupper = false; for(Keyboard.Key key:keylist){ if (key.label!=null && isword(key.label.toString())) { key.label = key.label.toString().toLowerCase(); key.codes[0] = key.codes[0]+32; } } } else {//小写切换大写 isupper = true; for(Keyboard.Key key:keylist){ if (key.label!=null && isword(key.label.toString())) { key.label = key.label.toString().toUpperCase(); key.codes[0] = key.codes[0]-32; } } } }
在继承自OnKeyboardActionListener的键盘监听器中,主要对OnKey方法进行了重写,实现了键盘的退格、切换大小写以及数字键盘和字母键盘切换的功能,都是通过对按键的codes值的判断实现的。在将对应的字母输入到文本框中时,我仍然是用图片代替的,未来这些键盘对应的图片将被替换为保存的用户字体图片。
public void onKey(int primaryCode, int[] keyCodes) { Editable editable = ed.getText(); int start = ed.getSelectionStart(); if (primaryCode == Keyboard.KEYCODE_CANCEL) {// 输入完成,隐藏键盘 hideKeyboard(); } else if (primaryCode == Keyboard.KEYCODE_DELETE) {// 退格 if (editable != null && editable.length() > 0) { if (start > 0) { editable.delete(start - 1, start); } } } else if (primaryCode == Keyboard.KEYCODE_SHIFT) {// 大小写切换 changeKey(); keyboardView.setKeyboard(k1); } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE) {// 数字键盘切换 if (isnun) { isnun = false; keyboardView.setKeyboard(k1); } else { isnun = true; keyboardView.setKeyboard(k2); } } else if (primaryCode == 57419) { // go left if (start > 0) { ed.setSelection(start - 1); } } else if (primaryCode == 57421) { // go right if (start < ed.length()) { ed.setSelection(start + 1); } } else { /*editable.insert(start, Character.toString((char) primaryCode));*/ //将要输入的数字现在编辑框中 Drawable drawable = res.getDrawable(R.drawable.letter_up_a); 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); } }
基本完成键盘工作后,我对SQLite数据库进行了学习,了解了SQLiteOpenHelper的功能以及数据库的创建、插入、更新、查询、删除的功能的实现方法,为接下来实现用户手写字体图片的存储建立了前提。
首先实现一个类继承自SQLiteOpenHelper,在其中编写类的构造方法以及OnCreate和OnUpgrade功能。
public class DatabaseHelper extends SQLiteOpenHelper { private static final int VERSION = 1; public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public DatabaseHelper(Context context,String name,int version){ this(context,name,null,version); } public DatabaseHelper(Context context,String name){ this(context,name,VERSION); } @Override //第一次新建数据可以时调用 public void onCreate(SQLiteDatabase sqLiteDatabase) { //构建表的键值对,一列为id,是int类型,一列为name,是varchar类型,20为字符个数 sqLiteDatabase.execSQL("create table user(id int, name varchar(20))"); System.out.println("create a tableBase!"); } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { System.out.println("update a tableBase!"); } }
然后在Activity中通过自定义类对数据库进行创建和操作即可。
创建(在名为"my_first_database"的表第一次被创建时调用了DatabaseHelper中的OnCreate方法,构建了一个id为int类型,name为varchar(20)的表):
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,"my_first_database"); SQLiteDatabase db = dbHelper.getReadableDatabase();
升级(从1升到2):
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,"my_first_database",2); SQLiteDatabase db = dbHelper.getReadableDatabase();
插入(new一个values对象,将id=1,name=Joy的条目放入values中,调用insert方法向表中插入条目):
ContentValues values = new ContentValues(); values.put("id",1); values.put("name","Joy"); DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,"my_first_database",2); SQLiteDatabase db = dbHelper.getWritableDatabase(); db.insert("user",null,values);
更新(new一个values对象,name=Benny,调用update方法把id=1的name更新为Benny):
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,"my_first_database",2); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name","Benny"); db.update("user",values,"id=?",new String[]{"1"});
查询(其中cursor是表的一个游标,通过对游标的移动获得表中每个条目的内容):
DatabaseHelper dbHelper = new DatabaseHelper(MainActivity.this,"my_first_database",2); SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,"id",null); while (cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); String id = cursor.getString(cursor.getColumnIndex("id")); System.out.println("query--------------------->"+name+"------------"+id);
删除(删除id=1的条目):
ImageSQLiteHelper dbHelper = new ImageSQLiteHelper(MainActivity.this,"my_first_database"); SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete("user","id=?",new String[]{"1"});