前提条件:39Go的代码,智能功能机(smart feature phone)
[售后反馈] 下拉菜单图标对比度弱
可以看下面这张图片:
首先我们需要知道焦点在哪里
通过工具可以看到当类为android.widget.Switch是 focused = true
Switch 就是打开下拉的菜单的按钮,通过Switch找到QSTileBaseView
public QSTileBaseView(Context context, QSIconView icon, boolean collapsedView) {
super(context);
// Default to Quick Tile padding, and QSTileView will specify its own padding.
int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding);
mIconFrame = new FrameLayout(context);
mIconFrame.setForegroundGravity(Gravity.CENTER);
int size = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
addView(mIconFrame, new LayoutParams(size, size));
mIcon = icon;
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0, padding, 0, padding);
mIconFrame.addView(mIcon, params); //这里就是添加所有menu的图标
mTileBackground = newTileBackground();//这里是把背景图片转换成了圆形
if (mTileBackground instanceof RippleDrawable) {
setRipple((RippleDrawable) mTileBackground);
}
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setBackground(mTileBackground);//这里是添加背景图片
setPadding(0, 0, 0, 0);
setClipChildren(false);
setClipToPadding(false);
mCollapsedView = collapsedView;
setFocusable(true);//这里是设置焦点的地方
}
修改之后的代码:
public QSTileBaseView(Context context, QSIconView icon, boolean collapsedView) {
super(context);
// Default to Quick Tile padding, and QSTileView will specify its own padding.
int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding);
mIconFrame = new FrameLayout(context);
mIconFrame.setForegroundGravity(Gravity.CENTER);
int size = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size);
addView(mIconFrame, new LayoutParams(size, size));
mIcon = icon;
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0, padding, 0, padding);
mIconFrame.addView(mIcon, params);
mTileBackground = newTileBackground();
if (mTileBackground instanceof RippleDrawable) {
setRipple((RippleDrawable) mTileBackground);
}
setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
//Redmine189508 Drop-down menu background 2019/9/23 begin
//setBackground(mTileBackground);
setPadding(0, -4, 0, 0);
//Redmine189508 Drop-down menu background 2019/9/23 end
setClipChildren(false);
setClipToPadding(false);
mCollapsedView = collapsedView;
setFocusable(true);
//Redmine189508 Drop-down menu background 2019/9/23 begin
setDefaultFocusHighlightEnabled(false);
this.setOnFocusChangeListener(new MenuBgOnFocusChanageListener());
}
private class MenuBgOnFocusChanageListener implements OnFocusChangeListener{
@Override
public void onFocusChange(View view ,boolean hasFocus){
if(hasFocus){
setBackgroundResource(R.drawable.ic_qs_bg_focused_ok);
}else{
setBackground(null);
}
}
}
//Redmine189508 Drop-down menu background 2019/9/23 end
通过焦点的获取来进行设置背景图。
/Anrdroid8.1/frameworks/base/core/java/android/view/View.java
boolean mDefaultFocusHighlightEnabled = true;
该变量的含义:是否该视图获取焦点后,应该使用一个默认焦点高亮;而此高亮并非在背景中定义的state_facused,也就是说不是用户自己定义的View的background里设置的。系统将设置一个默认的高亮
@Override
public void setClickable(boolean clickable) {
super.setClickable(clickable);
//Redmine189508 Drop-down menu background 2019/9/23 begin
//setBackground(clickable ? mRipple : null);
//Redmine189508 Drop-down menu background 2019/9/23 end
}
这里也得注释掉
最后区分一下这两个方法:
1、SetBackground(Drawable background)其参数为一个Drawable对象,目的是设置view的背景图片,Drawable对象可以这样获取getResources().getDrawable(R.drawable.xx),还可以是Context.getResource().getColor(R.color.white)
2、setBackgroundResource(int resid)它也是设置一个view的背景图片,只不过传入的是一个drawable的id值或者color颜色值