android 默认焦点高亮效果修改

最近做项目遇到以下问题:
现象:个别三方app出现,焦点选中某个view有绿框
分析:怀疑是某个view的默认焦点效果,百度了一下看到很多相同的现象(参考)
查看源码:frameworks/base/core/java/android/view/View.java
通过switchDefaultFocusHighlight 设置默认的高亮效果显示,而switchDefaultFocusHighlight 又是通过getDefaultFocusHighlightDrawable获取属性android.R.attr.selectableItemBackground 得到最终的显示效果。

    /*** When this view is focused, switches on/off the default focused highlight.* 

* This always happens when this view is focused, and only at this moment the default focus* highlight can be visible.*/private void switchDefaultFocusHighlight() {if (isFocused()) {final boolean needed = isDefaultFocusHighlightNeeded(mBackground,mForegroundInfo == null ? null : mForegroundInfo.mDrawable);final boolean active = mDefaultFocusHighlight != null;if (needed && !active) {setDefaultFocusHighlight(getDefaultFocusHighlightDrawable());} else if (!needed && active) {// The highlight is no longer needed, so tear it down.setDefaultFocusHighlight(null);}}}/*** Create a default focus highlight if it doesn't exist.* @return a default focus highlight.*/private Drawable getDefaultFocusHighlightDrawable() {if (mDefaultFocusHighlightCache == null) {if (mContext != null) {final int[] attrs = new int[] { android.R.attr.selectableItemBackground };final TypedArray ta = mContext.obtainStyledAttributes(attrs);mDefaultFocusHighlightCache = ta.getDrawable(0);ta.recycle();}}return mDefaultFocusHighlightCache;}

继续往下追,在frameworks/base/core/res/res/values/ 搜索 selectableItemBackground

// grep -irn "selectableItemBackground" android/frameworks/base/core/res/res/values/
android/frameworks/base/core/res/res/values/themes_material.xml:114:        <item name="selectableItemBackground">@drawable/item_background_material</item>
android/frameworks/base/core/res/res/values/themes_material.xml:115:        <item name="selectableItemBackgroundBorderless">@drawable/item_background_borderless_material</item>
android/frameworks/base/core/res/res/values/themes_material.xml:489:        <item name="selectableItemBackground">@drawable/item_background_material</item>
android/frameworks/base/core/res/res/values/themes_material.xml:490:        <item name="selectableItemBackgroundBorderless">@drawable/item_background_borderless_material</item>
android/frameworks/base/core/res/res/values/attrs.xml:1040:        <attr name="selectableItemBackground" format="reference" />
android/frameworks/base/core/res/res/values/attrs.xml:1043:        <attr name="selectableItemBackgroundBorderless" format="reference" />
android/frameworks/base/core/res/res/values/styles_holo.xml:325:        <item name="background">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/styles_holo.xml:435:        <item name="listSelector">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/styles_holo.xml:461:        <item name="virtualButtonPressedDrawable">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/styles_holo.xml:749:        <item name="background">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/styles_holo.xml:1158:        <item name="background">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/styles_material.xml:708:        <item name="virtualButtonPressedDrawable">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/themes_holo.xml:132:        <item name="selectableItemBackground">@drawable/item_background_holo_dark</item>
android/frameworks/base/core/res/res/values/themes_holo.xml:133:        <item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/themes_holo.xml:496:        <item name="selectableItemBackground">@drawable/item_background_holo_light</item>
android/frameworks/base/core/res/res/values/themes_holo.xml:497:        <item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/public.xml:1365:  <public type="attr" name="selectableItemBackground" id="0x0101030e" />
android/frameworks/base/core/res/res/values/public.xml:2199:    <public type="attr" name="selectableItemBackgroundBorderless" id="0x0101045c" />
android/frameworks/base/core/res/res/values/styles.xml:1272:        <item name="background">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/styles.xml:1440:        <item name="background">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/themes.xml:122:        <item name="selectableItemBackground">@drawable/item_background</item>
android/frameworks/base/core/res/res/values/themes.xml:123:        <item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/themes.xml:371:        <item name="actionBarItemBackground">?attr/selectableItemBackground</item>
android/frameworks/base/core/res/res/values/themes.xml:852:        <item name="itemBackground">?attr/selectableItemBackground</item>

可以看到themes.xml 里面定义了selectableItemBackground 对应的是theme默认主题
在这里插入图片描述
在android/frameworks/base/core/res/res/drawable/ 找到对应的item_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_window_focused="false" android:drawable="@color/transparent" /><!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --><item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_disabled" /><item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/list_selector_background_disabled" /><item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" /><item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" /><item android:state_focused="true"                                                             android:drawable="@drawable/list_selector_background_focused" /><item android:drawable="@color/transparent" /></selector>

找到对应的资源
在这里插入图片描述
修改成红色框
在这里插入图片描述
在这里插入图片描述
单独编译frameworks资源:
source build/envsetup.sh
lunch 对应平台
mmm frameworks/base/core/res/
将out/target/product/对应平台/system/framework/framework-res.apk
push到机器的/system/framework/验证

效果如下:
在这里插入图片描述
解决方法:
将默认的高亮效果改为透明即可


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部