android的按钮获取了focus焦点改变背景色 与 手指触摸按钮点击改变背景色 的兼容并触发事件

最近在做android手机连接手柄,通过手柄操作手机焦点来控制手机的项目,这里总结一下一些小细节,调试了好久才发现的一些坑。

首先,做一个drawable,这个没的说,看下drawable的代码:

就是一个通过是否获取了焦点来控制两种状态。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" >
    <shape android:shape="rectangle">
        <solid android:color="@color/whiteTranslate20" />
        <corners android:radius="16dp"
            />
        <size android:width="1dp"/>
        <padding
            android:left="16dp"
            android:right="16dp"/>
    </shape>
</item>

    <item android:state_focused="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorPrimary" />
            <corners android:radius="16dp"
                />
            <size android:width="1dp"/>
            <padding
                android:left="16dp"
                android:right="16dp"/>
        </shape>
    </item>
</selector>

用到的color

<!--20%不透明度-->
    <color name="whiteTranslate20">#33FFFFFF</color>
    <color name="colorPrimary">#ff00bfc6</color>

给按钮设置背景

<Button
.........
	android:background="@drawable/circle_rectangle_btn"/>

问题:手柄控制获取焦点和手指直接触摸屏幕都要控件改变背景色

经过以上的设置,只有通过手柄控制的时候按钮才会变色,但是使用手指直接触摸点击按钮的时候是并不会达到期望变色的效果。

解决

在布局中增加两句代码即可:

<Button
.........
	android:focusableInTouchMode="true"
    android:focusable="true"/>

也是很好理解,这两句代码就表示触摸时获取焦点。经过很多的测试,才发现这样两句即可解决问题,而不用在代码里判断各种状态然后再设置背景。
没错,就是这么简单。。。。

注意

增加了以上两句代码,给控件设置焦点改变监听setOnFocusChangeListener()public void onFocusChange(View v, boolean hasFocus)方法中才能监听到,该view并且hasFocustrue,否则是false

困惑

不加中两句代码,就会造成这个困惑,明明设置了焦点监听,明明应该获取到焦点,明明应该改变背景,但是情形时,并没有改变,移动焦点的时候,发现控件是默认的背景色,其实,就是因为没有设置上面两句代码导致hasFocus值是false

触发事件

按下手柄A按键触发事件的情形

对于触发事件,只需要在onclick中进行逻辑处理即可。因为手柄通过摇杆或者十字按键移动的是焦点,触发事件还是需要按下A按钮,当点击了这个按键,也就是触发了onclick回调事件了。

在不按下A按键也要出发事件的情形

在这种情形中需要进行手柄的十字按键监听,也简单,只需要在onKeyDown(int keyCode, KeyEvent event)方法中进行监听即可,判断向左按键,向右按键,向上按键,向下按键,并判断某个控件是否获取到了焦点来进行逻辑判断处理。方法最后返回true,表示消费了该事件,不再继续传递了。

	@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    
		if (keyCode==KeyEvent.KEYCODE_DPAD_LEFT&&item2_leftBtn.hasFocus()){
		            //左摇杆 逻辑处理
		            return true;
		        }else if (keyCode==KeyEvent.KEYCODE_DPAD_RIGHT&&item2_rightBtn.hasFocus()){
		            //右摇杆  逻辑处理
		            return true;
		        }else if(keyCode==KeyEvent.KEYCODE_DPAD_UP&&item2_upBtn.hasFocus()){
		        	//上摇杆  逻辑处理
		        	return true;
		        }else if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN&&item2_downBtn.hasFocus()){
					//下摇杆  逻辑处理
					return true;
				}
		 return super.onKeyDown(keyCode, event);
	}

欢迎留言讨论。

发布了117 篇原创文章 · 获赞 129 · 访问量 24万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览