android自定義鍵盤(解決彈出提示的字體顏色問題)

最近準備要作一個項目,須要用到自定義小鍵盤來確保安全,並且還須要精確得到用戶點擊鍵盤時的落點位置、力度、指尖接觸屏幕的面積等參數。html

在寫自定義鍵盤的時候,用到了國內網上的一些代碼,出處是java

 

向先人致敬!android

 

而後發現down下來的代碼用到個人項目時,出現了各類問題:安全

1.首先,是一打開應用,就會出現彈出的是系統的輸入法鍵盤,而是不自定義鍵盤,這個問題是因爲EditText會在應用打開的使用得到焦點,致使直接彈出系統輸入法,而不是自定義輸入法。解決的辦法是使EditText在應用打開時不獲取焦點,因而我在activity對應的佈局文件的全局Layout標籤中加入ide

 

?
1
2
android:focusable= true  
android:focusableInTouchMode= true

 

 

那麼在activity運行時,EditText就失去了焦點,系統輸入法也不會彈出。而後對EditText加入觸摸監聽器,當點擊EditText控件時,就響應彈出咱們的鍵盤函數

 

?
1
2
3
4
5
6
7
8
9
10
11
12
et.setOnTouchListener( new View.OnTouchListener(){
             @Override
             public boolean onTouch(View v, MotionEvent event) {
                 int inputback = et.getInputType();
                 et.setInputType(InputType.TYPE_NULL);
                 AdvantageKeyboard kb = new AdvantageKeyboard(act,ctx,et);
                 kb.showKeyboard();
                 et.setInputType(inputback);
                 v.performClick();
                 return false ;
             }
         });



 

2.點擊時,鍵盤彈出的提示框裏面沒有字體。例如這樣佈局

加載中...

 

這是因爲顯示的字體時白色,而背景也是白色致使的。後來各類百度,有人說是由於theme的問題,由於我用的是android5.0.1的API,自動生成項目時,生成的activity是直接繼承ActionBarActivity的,直接改theme會致使應該出現秒退現象。若是要改theme就要先改繼承ActionBarActivity爲Activity,而後再去改theme,可是我很不喜歡這樣,由於這樣沒有通用性,後來在google了一下外國人的貼子,才瞭解到這個彈出的東西叫preview,咱們能夠修改它的佈局的。字體

在咱們自定義的KeyboardView中加入android:keyPreviewLayout標籤,加入後以下:網站

 

而後在layout文件夾中,新建一個key_preview_layout.xml文件,裏面這樣寫ui

?
1
2
<!--?xml version= 1.0 encoding=utf- 8 ?-->
<textview android:background= "#ff8888ff/" android:gravity= "center" android:layout_height= "wrap_content" android:layout_width= "wrap_content" android:textcolor= "@android:color/white" android:textsize= "40sp" xmlns:android= "http://schemas.android.com/apk/res/android" ></textview>

其中android:background就是咱們的提示框的背景顏色,android:textColor是字體顏色,改爲你喜歡的就OK了。

加載中...

 

3.加入鍵盤的觸摸響應,並記錄點擊的相關信息(力度,接觸面積,落點座標等)。

咱們能夠在自定義鍵盤中的構造函數中對keyboardView加入觸摸監聽器,例如這樣寫構造方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public AdvantageKeyboard(Activity act, Context ctx, EditText edit) {
         this .act = act;
         this .ctx = ctx;
         this .ed = edit;
         kb_letter = new Keyboard( this .ctx, R.xml.qwerty);
         kb_number = new Keyboard( this .ctx, R.xml.symbols);
         keyboardView = (KeyboardView) this .act.findViewById(R.id.keyboard_view);
         keyboardView.setKeyboard(kb_number);
         is_nun = true ;
         keyboardView.setEnabled( true );
         keyboardView.setPreviewEnabled( true );
         keyboardView.setOnKeyboardActionListener(action_listener);
         keyboardView.setOnTouchListener(touch_listener); //加入觸摸監聽器
}

而後new一個咱們處理這些數據的監聽器,須要咱們「重載」(可能叫「覆蓋」比較合適)OnTouch函數,把採集的數據顯示到Locat上。須要注意的是,這個OnTouch函數假如返回值爲true,就表明這個動做已被處理,爲false就表明沒被處理,因爲後面還有其餘函數須要得到此動做,因此這裏返回false,不然,接下來的對按鍵動做的響應(字體輸出等)將不會發生。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private OnTouchListener touch_listener = new OnTouchListener(){
         @Override
         public boolean onTouch(View v, android.view.MotionEvent event) {
             float pressure, size, rx, ry, x, y, interval;
             long time, down_time;
             int action = event.getAction();
             switch (action) {
                 case (MotionEvent.ACTION_DOWN):
                     pressure = event.getPressure();
                     size = event.getSize();
                     time = event.getEventTime();
                     down_time = event.getDownTime();
                     x = event.getX();
                     y = event.getY();
                     rx = event.getRawX();
                     ry = event.getRawY();
                     interval = ( float ) 0.0 ;
                     if (is_first_press){
                         interval = down_time - last_down_time;
                     }
                     is_first_press = true ;
                     last_down_time = down_time;
                     
                     Log.i(!!!!!!!!!,pressure:+String.valueOf(pressure)+
 
                             +size:+String.valueOf(size)+
 
                             +time:+String.valueOf(time)+
 
                             +downtime:+String.valueOf(down_time)+
 
                             +x:+String.valueOf(x)+  y:+String.valueOf(y)+
 
                             +rx:+String.valueOf(rx)+  ry:+String.valueOf(ry)+
 
                             +interval:+String.valueOf(interval)+
);
                     break ;
                 case (MotionEvent.ACTION_UP):
                     
                     v.performClick();
                 break ;
                 case (MotionEvent.ACTION_MOVE):
                 break ;
             }
             return false ;
         }
     };
 

結伴旅遊,一個免費的交友網站:www.jieberu.com

推推族,免費得門票,遊景區:www.tuituizu.com

相關文章
相關標籤/搜索