创新实训——第三周

    本周我首先在上周的键盘基础上进行了改进,增加了字母键盘,基本完成了自定义键盘,包括数字键盘和字母键盘之间的转换,以及字母键盘的大小写等功能。其次开始着手用户手写字体的输入保存,通过查阅资料后我决定使用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"});


猜你喜欢

转载自blog.csdn.net/weixin_38307753/article/details/80144812
今日推荐