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/验证
效果如下:

解决方法:
将默认的高亮效果改为透明即可
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
