Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android自定義鍵盤(解決彈出提示的字體顏色問題)

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

編輯:關於Android編程

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

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

 

向先人致敬!

 

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

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

 

android:focusable=true   
android:focusableInTouchMode=true

 

 

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

 

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文件,裡面這樣寫


其中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(){
		@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;
		}
	};

 



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved