android换肤动画,Android-换肤ThemeSkinning使用
1.png
2.png
3.png
1.集成步骤:
1、添加依赖 compile 'com.solid.skin:skinlibrary:1.4.3' 参考源码版本
2、让你的 Application 继承于 SkinBaseApplication
3、让你的 Activity 继承于 SkinBaseActivity,如果使用了 Fragment 则继承于 SkinBaseFragment
4、在需要换肤的根布局上添加 xmlns:skin="http://schemas.android.com/android/skin"
,然后在需要换肤的View上加上skin:enable="true"
5、新建一个项目模块(只包含有资源文件,例如本项目的 skinpackage 模块),其中包含的资源文件的 name 一定要和原项目中有换肤需求的 View 所使用的资源name一致。
6、拿到上一步生成的文件( ×××.apk ),改名为 ×××.skin,放入 assets 中的 skin 目录下( skin 目录是自己新建的)
7、调用换肤
在 assets/skin
文件夹中的皮肤
SkinManager.getInstance().loadSkin("Your skin file name in assets(eg:theme.skin)",
new ILoaderListener() {
@Override
public void onStart() {
Toast.makeText(getApplicationContext(), "正在切换中", Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess() {
Toast.makeText(getApplicationContext(), "切换成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed() {
Toast.makeText(getApplicationContext(), "切换失败", Toast.LENGTH_SHORT).show();
}
}
);
皮肤来源于网络
SkinManager.getInstance().loadSkinFromUrl(skinUrl, new ILoaderListener() {
@Override
public void onStart() {
Log.i("ILoaderListener", "正在切换中");
dialog.setContent("正在从网络下载皮肤文件");
dialog.show();
}
@Override
public void onSuccess() {
Log.i("ILoaderListener", "切换成功");
dialog.dismiss();
}
@Override
public void onFailed(String errMsg) {
Log.i("ILoaderListener", "切换失败:" + errMsg);
dialog.setContent("换肤失败:" + errMsg);
}
@Override
public void onProgress(int progress) {
Log.i("ILoaderListener", "皮肤文件下载中:" + progress);
dialog.setProgress(progress);
}
});
详细的使用,请到示例项目中查看
2.换肤属性的扩展
本开源库默认支持 textColor 和 background 的换肤。如果你还需要对其他属性进行换肤,那么就需要去自定义了。
那么如何自定义呢?看下面这个例子:
TabLayout大家应该都用过吧。它下面会有一个指示器,当我们换肤的时候也希望这个指示器的颜色也跟着更改。
新建一个 TabLayoutIndicatorAttr 继承于 SkinAttr,然后重写 apply 方法。apply 方法在换肤的时候就会被调用
代码的详细实现
public class TabLayoutIndicatorAttr extends SkinAttr {
@Override
public void apply(View view) {
if (view instanceof TabLayout) {
TabLayout tl = (TabLayout) view;
if (RES_TYPE_NAME_COLOR.equals(attrValueTypeName)) {
int color = SkinResourcesUtils.getColor(attrValueRefId);
tl.setSelectedTabIndicatorColor(color);
}
}
}
}
注:attrValueRefId:就是资源 id。SkinResourcesUtils 是用来获取皮肤包里的资源,这里设置color或者drawable一定要使用本工具类。
当上面的工作完成之后,就到我们自己的 Application 的 onCreate 方法中加入 SkinConfig.addSupportAttr("tabLayoutIndicator", new TabLayoutIndicatorAttr());
最后我们就可以正常使用了,dynamicAddSkinEnableView(tablayout, "tabLayoutIndicator", R.color.colorPrimaryDark);
3. 关于字体切换
还是遵守本项目的约定大于配置的原则,所有的字体都放到 assets/fonts 文件夹下
如何切换字体:
SkinManager.getInstance().loadFont("xx.ttf")
关于切换字体需要配置的东西:
如果只是单纯的想要字体切换这个功能。只需集成步骤
中的前三步就行了。
注:字体切换功能默认不开启,需要字体切换功能请在你的Application中加入SkinConfig.setCanChangeFont(true);
4. 其他一些重要的api
SkinConfig.isDefaultSkin(context):判断当前皮肤是否是默认皮肤
SkinManager.getInstance().restoreDefaultTheme(): 重置默认皮肤
dynamicAddView:当动态创建的View也需要换肤的时候,就可以调用 dynamicAddView
5. 使用注意事项:
换肤默认只支持 android 的常用控件,对于支持库的控件和自定义控件的换肤需要动态添加(例如: dynamicAddSkinEnableView(toolbar, "background", R.color.colorPrimaryDark);
),在布局文件中使用skin:enable="true"
是无效的。
默认不支持状态栏颜色的更改,如果需要换肤的同时也要更改状态栏颜色,请到您的Application文件中加入SkinConfig.setCanChangeStatusColor(true);
,状态栏的颜色值来源于colorPrimaryDark
本开源库使用的 Activity 是 AppCompatActivity,使用的 Fragment 是 android.support.v4.app.Fragment
有换肤需求 View 所使用的资源一定要是引用值,例如:@color/red,而不是 #ff0000
补充:支持库控件的皮肤修改
1.FloatingActionButton修改backgroundTint
需要自定义:
public class FabButtonAttr extends SkinAttr {
@Override
public void apply(View view) {
if (view instanceof FloatingActionButton) {
FloatingActionButton fb = (FloatingActionButton) view;
if (RES_TYPE_NAME_COLOR.equals(attrValueTypeName)) {
int color = SkinManager.getInstance().getColor(attrValueRefId);
fb.setBackgroundTintList(ColorStateList.valueOf(color));
} else if (RES_TYPE_NAME_DRAWABLE.equals(attrValueTypeName)) {
// tv.setDivider(SkinManager.getInstance().getDrawable(attrValueRefId));
}
}
}
}
Application中添加:
SkinConfig.addSupportAttr("backgroundTint",new FabButtonAttr());
使用:
//添加改变的组件
dynamicAddView(fab, "backgroundTint", R.color.colorPrimary);
2.NavigationView 修改点击时的item颜色
需要自定义:
public class NavigationViewAttr extends SkinAttr {
@Override
public void apply(View view) {
if (view instanceof NavigationView) {
Log.i("TabLayoutAttr", "apply");
NavigationView nv = (NavigationView) view;
if (RES_TYPE_NAME_COLOR.equals(attrValueTypeName)) {
Log.i("TabLayoutAttr", "apply color");
int color = SkinManager.getInstance().getColor(attrValueRefId);
nv.setItemTextColor(createSelector(color));
nv.setItemIconTintList(createSelector(color));
} else if (RES_TYPE_NAME_DRAWABLE.equals(attrValueTypeName)) {
Log.i("TabLayoutAttr", "apply drawable");
// tv.setDivider(SkinManager.getInstance().getDrawable(attrValueRefId));
}
}
}
private ColorStateList createSelector(int color) {
int statePressed = android.R.attr.state_checked;
int stateChecked = android.R.attr.state_checked;
int[][] state = {{statePressed}, {-statePressed}, {stateChecked}, {-stateChecked}};
int color1 = color;
int color2 = Color.parseColor("#6E6E6E");
int color3 = color;
int color4 = Color.parseColor("#6E6E6E");
int[] colors = {color1, color2, color3, color4};
ColorStateList colorStateList = new ColorStateList(state, colors);
return colorStateList;
}
}
Application中添加:
SkinConfig.addSupportAttr("navigationViewMenu",new NavigationViewAttr());
使用:
//添加改变的组件
dynamicAddView(navigationView.getHeaderView(0), "background", R.color.colorPrimary);
dynamicAddView(navigationView, "navigationViewMenu", R.color.colorPrimary);
android换肤动画,Android-换肤ThemeSkinning使用相关推荐
- android换肤动画,Android动态换肤框架-实现换肤
1.换肤流程 1 2.采集流程 2 3.Android资源查找流程 3 4.采集需要换肤的控件 换肤我们需要换所有可能需要换的页面控件,所以我们不可能在每个页面重新findviewById,这时就需要 ...
- Android实现白天黑夜动画,android 实现【夜晚模式】的另外一种思路
源码地址 在一切开始之前,我只想用正当的方式,跪求各位的一个star 预览 序 在写SegmentFault for Android 4.0的过程中,因为原先采用的夜间模式,代码着实不好看,于是我又开 ...
- android 缩放透明动画,Android之高仿QQ6.6.0侧滑效果(背景动画、透明+沉浸式状态栏、渐变效果)...
根据需求实现类似QQ侧滑效果,之前看到过很多实现方式通过SlidingMenu,但是既然官方推出了自己的专属控件,那么使用DrawerLayout就是不二选择.且看下文. 一.先来看看官方文档解释 D ...
- android 属性翻牌动画,android scale实现翻牌动画效果
简单流程: 这个翻牌其实并不是立体那种翻转,而是通过收缩和伸展来完成的. 有两张图片,一张为背面: 一张为正面: 以扑克牌本身的中心点为轴,两边像中心收缩: 当背面收缩到完全没有后,通过对动画的监听器 ...
- android progressbar 水平动画,Android ProgressBar 自定义样式(三),动画模式
果: 和之前的一样,在布局文件中: android:id="@+id/progressBar3" android:layout_width="wrap_content&q ...
- android appwidget 空间动画,Android学习之AppWidget笔记分享
什么是AppWidget?AppWidget就是我们平常在桌面上见到的那种一个个的小窗口,利用这个小窗口可以给用户提供一些方便快捷的操作. 今天的目标就是怎么创建一个简单的AppWidget. 首先我 ...
- android 图片查看动画,Android 共享动画实现点击列表图片跳转查看大图页面
主要内容使用系统提供的 API 实现共享动画 在实现过程中遇到的问题图片点击和关闭之后会出现短暂的黑屏问题实现的动画效果如下: 共享动画.gif 具体实现这个效果是在两个页面之间的切换动画,既然是两个 ...
- Android实现蝴蝶动画,Android中的动画具体解释系列——飞舞的蝴蝶
这一篇来使用逐帧动画和补间动画来实现一个小样例,首先我们来看看Android中的补间动画. Android中使用Animation代表抽象的动画类,该类包含以下几个子类: AlphaAnimation ...
- android 上下扫描动画,Android扫描雷达动画
很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...
- android 缩放透明动画,Android旋转、平移、缩放和透明度渐变的补间动画
android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透 ...
最新文章
- 如何使用 Python 创建一名可操控的角色玩家
- php is_null、empty、isset的区别
- 【语义分割】ICCV21_Mining Contextual Information Beyond Image for Semantic Segmentation
- pcf8523_PCF上的Spring Cloud合同和Spring Cloud Services
- 导师推荐 | 第 4 期临床基因组家系分析,同时解决科研和临床问题
- php-cli和php-fpm FastCgi与PHP-fpm之间的关系
- AdminLTE的介绍与使用(详细流程)-----前端框架
- 浅谈OA办公系统与钉钉的区别
- 如何用linux系统进行远程控制windows服务器
- Git的安装步骤、配置(解决Git官网下载速度慢、无法下载,需要授权)
- c语言二进制转换方式,c语言二进制怎么转换十进制
- 皮皮高清影视播放器2015官方版
- androrid按键事件
- Dubbo系列(二)源码分析之SPI机制
- easyexcel使用教程-导出篇
- android 分享二维码图片到微信QQ(url地址字符串生成二维码图片、分享二维码图片到微信QQ)
- ActionScript 3.0 - MVC模式
- 一成电计算机考研国家线2O 9,【九〇六 | 打卡】考研“国家线”只是起点,我们要挑战骇浪惊涛!...
- 【微信小程序】如何搭积木式开发?
- 一个神奇的开源项目:让照片快速 3D 化!
热门文章
- 海南大学2020年申请考核博士研究生招生工作办法
- ISME:高手开杠-‘1%的微生物可培养’到底为哪般?
- 这篇文章说出了研究生和导师的相处真谛……
- Nature:拟南芥微生物组功能研究3人工重组微生物群落
- R语言ggplot2可视化:置信区间与分组具有相同色彩、自定义置信区间带的色彩、Make confidence intervals the same color as line by group
- R语言ggplot2可视化:可视化多个图像并组合起来(如果没有对齐,看着丑陋))、保证组合的图像图像区域对齐或者图像整体对齐(Align plot areas in ggplot)
- 为多模型寻找模型最优参数、多模型交叉验证、可视化、指标计算、多模型对比可视化(系数图、误差图、混淆矩阵、校正曲线、ROC曲线、AUC、Accuracy、特异度、灵敏度、PPV、NPV)、结果数据保存
- R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示均值、标准偏差)实战
- R语言使用ggplot2包使用geom_density()函数绘制分组密度图(添加直方图、分组颜色配置)实战(density plot)
- Python将彩色图转换为灰度图