android自訂鍵盤(解決彈出提示的字型顏色問題)

來源:互聯網
上載者:User

android自訂鍵盤(解決彈出提示的字型顏色問題)

最近準備要做一個項目,需要用到自訂小鍵盤來確保安全,而且還需要精確獲得使用者點擊鍵盤時的落點位置、力度、指尖接觸螢幕的面積等參數。

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

 

向先人致敬!

 

然後發現down下來的代碼用到我的項目時,出現了各種問題:

1.首先,是一開啟應用,就會出現彈出的是系統的IME鍵盤,而是不自訂鍵盤,這個問題是由於EditText會在應用開啟的使用獲得焦點,導致直接彈出系統IME,而不是自訂IME。解決的辦法是使EditText在應用開啟時不擷取焦點,於是我在activity對應的布局檔案的全域Layout標籤中加入

 

android:focusable=true   android:focusableInTouchMode=true

 

 

那麼在activity運行時,EditText就失去了焦點,系統IME也不會彈出。然後對EditText加入觸摸監聽器,當點擊EditText控制項時,就響應彈出我們的鍵盤

 

et.setOnTouchListener(new View.OnTouchListener(){@Overridepublic 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檔案,裡面這樣寫


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


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

我們可以在自訂鍵盤中的建構函式中對keyboardView加入觸摸監聽器,例如這樣寫構造方法。

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,否則,接下來的對按鍵動作的響應(字型輸出等)將不會發生。

private OnTouchListener touch_listener = new OnTouchListener(){@Overridepublic 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;}};

 



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.