当前位置: 首页 > wzjs >正文

海口有做棋牌娱乐网站的吗新手做电商怎么起步

海口有做棋牌娱乐网站的吗,新手做电商怎么起步,可以做反链的网站,万网网站建设教程之前写过一篇笨拙的方式实现暗夜模式,但是当真正去适配的时候发现简直恶心至极;然后想通过一些方式可以把笨拙的方式变得优雅; 之前实现暗夜模式的快速通道,这篇文章在基于这个基础上优化而来 目录 背景 优化步骤 OK&#xf…

之前写过一篇笨拙的方式实现暗夜模式,但是当真正去适配的时候发现简直恶心至极;然后想通过一些方式可以把笨拙的方式变得优雅;

之前实现暗夜模式的快速通道,这篇文章在基于这个基础上优化而来

目录

背景

优化步骤

OK,思路有了下面是具体的实现方式;

自定义View继承系统原有控件

BaseDarkLightModeAttrProcessor 代码

 View自己是遍历改变子View模式

背景

简述下为什么选择自己更换颜色值,图片的方式。在实现上发现采用系统的方式,Activity必须重启一次。而我们的框架是单Activity+N Fragment的方式,是为了达到只有一个地图UI甲方要求,但是这样就需要以Fragment Tag为key值缓存缓存地图上线路、marker信息;所以Activity重启所要做的适配难度直接让我放弃了系统方式。

那么现在到了真正适配暗夜模式的开发阶段,发现适配一个界面就等于重构一次xml,而且代码量成指数级上升;

优化步骤

第一步优化:

当时想要怎么优化,脑海里第一个念头就是自定义View 继承 系统原有控件;设置定义属性 在xml中就可以定义白天颜色值,暗夜颜色值;然后外部传入当前模式,达到减少Fragment上的代码量。

第二步优化:

发现这样还是有必须在Fragment中找到所有需要切换的控件id,然后指定模式,况且还有很多是没有预设ID的View;所以就想到了可以让View自己是遍历改变子View模式;这样在设置模式的时候一行代码即可。

OK,思路有了下面是具体的实现方式;

自定义View继承系统原有控件

public class DarkConstraintLayout extends ConstraintLayout implements DarkLightMode {BaseDarkLightModeAttrProcessor<TjConstraintLayout> processor;public TjConstraintLayout(@NonNull Context context) {super(context);init(context, null, 0);}public DarkConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context, attrs, 0);}public DarkConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs, defStyleAttr);}private void init(Context context, AttributeSet attrs, int defStyleAttr) {processor = new BaseDarkLightModeAttrProcessor<TjConstraintLayout>(context, attrs, defStyleAttr, this);}/*** 切换模式** @param darkMode 是否深色模式*/@Overridepublic void processMode(boolean darkMode) {LogUtils.e("TjConstraintLayout processMode" + darkMode);processor.process(darkMode);}}

在init()方法中初始化 BaseDarkLightModeAttrProcessor 去统一控制

BaseDarkLightModeAttrProcessor 代码

public class BaseDarkLightModeAttrProcessor<T extends View> {protected T targetView;protected Drawable lightBackground;protected Drawable darkBackground;protected int lightBackgroundColor = -1;protected int darkBackgroundColor = -1;private boolean darkMode = false;public BaseDarkLightModeAttrProcessor(Context context, AttributeSet attrs, int defStyle, T targetView) {this.targetView = targetView;if (attrs != null) {// 所有需要适配黑夜模式的View样式属性全部定义在NightMode样式下,在xml中定义了,但View不识别的样式会被忽略TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DarkLightMode, defStyle, 0);parseAttrs(typedArray);typedArray.recycle();process(darkMode);}}/*** 设置浅色背景** @param lightBackground 浅色背景*/public void setLightBackground(Drawable lightBackground) {this.lightBackground = lightBackground;}/*** 设置深色背景** @param darkBackground 深色背景*/public void setDarkBackground(Drawable darkBackground) {this.darkBackground = darkBackground;}public Drawable getLightBackground() {return lightBackground;}public Drawable getDarkBackground() {return darkBackground;}/*** 设置浅色背景颜色** @param color 浅色背景颜色*/public void setLightBackgroundColor(int color) {this.lightBackgroundColor = color;}/*** 设置深色背景颜色** @param color 深色背景颜色*/public void setDarkBackgroundColor(int color) {this.darkBackgroundColor = color;}/*** 设置是否深色模式** @param darkMode 是否深色模式*/public void setDarkMode(boolean darkMode) {this.darkMode = darkMode;}public boolean isDarkMode() {return darkMode;}protected void parseAttrs(TypedArray typedArray) {lightBackground = typedArray.getDrawable(R.styleable.DarkLightMode_lightBackground);darkBackground = typedArray.getDrawable(R.styleable.DarkLightMode_darkBackground);lightBackgroundColor = typedArray.getColor(R.styleable.DarkLightMode_lightBackgroundColor, -1);darkBackgroundColor = typedArray.getColor(R.styleable.DarkLightMode_darkBackgroundColor, -1);}public final void process() {process(darkMode);}public void process(boolean darkMode) {this.darkMode = darkMode;if (this.darkMode) {if (darkBackground != null) {if (Build.VERSION.SDK_INT < 16) {targetView.setBackgroundDrawable(darkBackground);} else {targetView.setBackground(darkBackground);}}if (darkBackgroundColor != -1) {targetView.setBackgroundColor(darkBackgroundColor);}} else {if (lightBackground != null) {if (Build.VERSION.SDK_INT < 16) {targetView.setBackgroundDrawable(lightBackground);} else {targetView.setBackground(lightBackground);}}if (lightBackgroundColor != -1) {targetView.setBackgroundColor(lightBackgroundColor);}}}}

当然不是针对的自定义View,或者别的独特的系统控件,可以继承 BaseDarkLightModeAttrProcessor 单独去处理。这里就不贴代码了

 View自己是遍历改变子View模式

    public static void processAllViewDarkMode(View view, boolean darkMode) {if (view instanceof DarkLightMode) {((DarkLightMode) view).processMode(darkMode);}if (view instanceof ViewGroup) {ViewGroup viewGroup = (ViewGroup) view;for (int i = 0; i < viewGroup.getChildCount(); i++) {View childView = viewGroup.getChildAt(i);if (childView instanceof DarkLightMode) {((DarkLightMode) childView).processMode(darkMode);}processAllViewDarkMode(childView, darkMode);}}}

使用

    @Overridepublic void onNightModeChanged(boolean isDarkMode) {super.onNightModeChanged(isDarkMode);viewModel.setDarkMode(commonNavigator, isDarkMode);DarkLightModeUtil.processAllViewDarkMode(binding.getRoot(), isDarkMode);}

原来需要上百行的代码,简简单单一行代码就可以实现。当然还可以有一些拓展 就不一一赘述,

最后感谢我的领导,让我学会了思考,而不是一味地做代码重复操作。

http://www.dtcms.com/wzjs/34500.html

相关文章:

  • 毕设做网站难吗快速优化关键词排名
  • 网站的推广平台怎么做网页设计的页面
  • 餐饮企业网站建设方案书谷歌广告联盟一个月能赚多少
  • 如果做自己的网站线上营销推广方案有哪些
  • 静态网站建设要学什么郑州seo外包顾问
  • 邯郸网站设计邯郸网站制作sem和seo是什么职业岗位
  • 遂宁网站建设网页版百度
  • 网站建设的相关资料河南seo技术教程
  • 黑河做网站公司百度安装应用
  • 惠州网站建设系统最近新闻报道
  • 有没有可以做app的网站seo软文是什么
  • 珠海房地产网站建设seo策略主要包括
  • 中山企业网站建设方案关键词优化排名软件s
  • 全国生猪价格今日猪价行情表查询兰州网站优化
  • 武汉便宜做网站公司谷歌搜索引擎香港入口
  • 四川省建设人才网站2018汕头网站推广
  • 做静态网站d营销策划与运营
  • 上海市建设网站怎么下载需要会员的网站视频
  • 国外学做咖啡的网站制作自己的网页
  • 网站建设的关键亚洲卫星电视网参数表
  • 北京专业企业网站建设我的百度账号登录
  • 辽宁建委(建设局)的官方网站网络营销推广服务
  • wordpress好的插件怎么做好seo推广
  • 大理做网站小程序制作费用一览表
  • 网站关键词字数限制精准粉丝引流推广
  • 学校网站建设市场分析搜狗整站优化
  • 北京软件公司排行郑州有没有厉害的seo
  • 哈尔滨网站搜索优化公司杭州seo网络公司
  • 珠海市网站建设怎么样口碑营销的前提及好处有哪些
  • 优化网络速度seo顾问是什么职业