android自定义键盘(解决弹出提示的字体颜色问题)

        最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置、力度、指尖接触屏幕的面积等参数。

        在写自定义键盘的时候,用到了国内网上的一些代码,出处是

        http://blog.csdn.net/hfsu0419/article/details/7924673

        向先人致敬!

 

        然后发现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.1API,自动生成项目时,生成的activity是直接继承ActionBarActivity的,直接改theme会导致应该出现秒退现象。如果要改theme就要先改继承ActionBarActivityActivity,然后再去改theme,但是我很不喜欢这样,因为这样没有通用性,后来在google了一下外国人的贴子,才了解到这个弹出的东西叫preview,我们可以修改它的布局的。

    在我们自定义的KeyboardView中加入androidkeyPreviewLayout标签,加入后如下:

    

<pre name="code" class="html"> <android.inputmethodservice.KeyboardView  
            android:id="@+id/keyboard_view"  
            android:layout_width="fill_parent"  
            android:layout_height="wrap_content"  
            android:layout_alignParentBottom="true"  
            android:focusable="true"  
            android:focusableInTouchMode="true"  
            android:background="@color/black"  
            android:keyBackground="@drawable/btn_keyboard_key"
            android:keyPreviewLayout="@layout/key_preview_layout"
            android:keyTextColor="@color/white"
    android:visibility="gone" />  



    然后在layout文件夹中,新建一个key_preview_layout.xml文件,里面这样写

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:textColor="@android:color/white"
android:gravity="center"
android:background="#ff8888ff"/>

   其中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上。

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)+"\n"
		            		+"size:"+String.valueOf(size)+"\n"
		            		+"time:"+String.valueOf(time)+"\n"
		            		+"downtime:"+String.valueOf(down_time)+"\n"
		            		+"x:"+String.valueOf(x)+"  y:"+String.valueOf(y)+"\n"
		            		+"rx:"+String.valueOf(rx)+"  ry:"+String.valueOf(ry)+"\n"
		            		+"interval:"+String.valueOf(interval)+"\n");
		        	break;
		        case (MotionEvent.ACTION_UP):
		        	
		        	v.performClick();
		        break;
		        case (MotionEvent.ACTION_MOVE):
		        break;
		    }
			return false;
		}
	};

然后搞定了...

源码下载:http://download.csdn.net/detail/arrow2013/8414521




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。