Android创建外部lib库及自定义View的图文教程
前言
随着插件化/组件化的快速发展,现在大部分的项目开发中都会提取公共的代码制作成 library module,根据具体的业务需求进行拆分。小菜也学习一下如何拆分 lib 包,实际操作很简单,整理一下操作步骤。
拆分创建 library
在当前 project 下,file -> new module,选择 android library,进行下一步;
设置具体的 library/module/package 等名称,注意:module 名称与 library 相匹配默认为小写,需要的话手动调整,进行下一步;
此时在当前 project 中就已经创建好 library;
在当前 project 的 settings.gradle 中就会自动生成创建的 module;
tips: :myview 中的 : 代表的与 app 同级目录下的 module。
在当前 app 的 build.gradle 中 dependencies{} 中添加 implementation project(':myview') 即可正常接入。
自定义 view
小菜在新建的 library 中添加一个自定义按钮,可以添加配置图标和文字以及背景样式。因为只是为了测试 library module,所以功能很简单,实现方式也很简单,只是几个基本控件的组合。小菜只是简单的整理一下。
1、新建一个 myview 继承自 relativelayout,实现基本的构造方法;
2、在构造方法中实现对布局的添加,控件的绑定以及一些基本的 setxx 方法;
3、至此 myview 就可以应用,但所有但属性都需要通过 setxx 方法来设置;这当然是不合理的,于是小菜新建一个 attrs 文件,在资源文件中设置基本的样式,并在 myview 的 obtainattributes 方法中逐一绑定即可;
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <declare-styleable name="my_view" tools:ignore="missingdefaultresource"> <!-- 中间文字颜色 --> <attr name="tv_color" format="color" /> <!-- 中间文字显隐性 --> <attr name="tv_show" format="boolean" /> <!-- 中间文字内容 --> <attr name="tv_str" format="string" /> <!-- 中间文字大小 --> <attr name="tv_size" format="float" /> <!-- 右侧文字颜色 --> <attr name="right_tv_color" format="color" /> <!-- 右侧文字显隐性 --> <attr name="right_tv_show" format="boolean" /> <!-- 右侧文字内容 --> <attr name="right_tv_str" format="string" /> <!-- 右侧文字大小 --> <attr name="right_tv_size" format="float" /> <!-- 整体背景颜色 --> <attr name="bg_color" format="color" /> <!-- 整体边框颜色 --> <attr name="strok_color" format="color" /> <!-- 整体边框圆角 --> <attr name="bg_radius" format="float" /> <!-- 中间图片显隐性 --> <attr name="iv_show" format="boolean" /> <!-- 中间图片资源 --> <attr name="iv_src" format="reference" /> </declare-styleable> </resources>
4、至此,myview 自定义按钮以及完成,在 app 中也是正常调用即可。
public class myview extends relativelayout { private context mcontext; private relativelayout mrlay; private imageview miv; private textview mtv, mrighttv; gradientdrawable drawable = new gradientdrawable(); int mtvcolor, mrighttvcolor, mrlaybgcolor, mstrokecolor, mivsrc; boolean istvshow, isrighttvshow, isivshow; float mtvsize, mrighttvsize, mradiussize; string mtvstr, mrighttvstr; public myview(context context) { super(context); mcontext = context; initview(); } public myview(context context, attributeset attrs) { super(context, attrs); mcontext = context; initview(); obtainattributes(context,attrs); } private void initview() { layoutinflater.from(mcontext).inflate(r.layout.my_view_btn, this,true); mrlay = findviewbyid(r.id.my_view_rly); miv = findviewbyid(r.id.my_view_iv); mtv = findviewbyid(r.id.my_view_tv); mrighttv = findviewbyid(r.id.my_view_rtv); } private void obtainattributes(context context, attributeset attrs) { typedarray ta = context.obtainstyledattributes(attrs, r.styleable.my_view); mtvcolor = ta.getcolor(r.styleable.my_view_tv_color, color.black); mtv.settextcolor(mtvcolor); mrighttvcolor = ta.getcolor(r.styleable.my_view_right_tv_color, color.black); mrighttv.settextcolor(mrighttvcolor); mrlaybgcolor = ta.getcolor(r.styleable.my_view_bg_color, color.white); mrlay.setbackgroundcolor(mrlaybgcolor); mstrokecolor = ta.getcolor(r.styleable.my_view_strok_color, color.black); isivshow = ta.getboolean(r.styleable.my_view_iv_show, true); miv.setvisibility(isivshow?view.visible:view.gone); isrighttvshow = ta.getboolean(r.styleable.my_view_right_tv_show, true); mrighttv.setvisibility(isrighttvshow?view.visible:view.gone); istvshow = ta.getboolean(r.styleable.my_view_tv_show, true); mtv.setvisibility(istvshow?view.visible:view.gone); mtvsize = ta.getfloat(r.styleable.my_view_tv_size, 16.0f); mtv.settextsize(mtvsize); mrighttvsize = ta.getfloat(r.styleable.my_view_right_tv_size, 14.0f); mrighttv.settextsize(mrighttvsize); mradiussize = ta.getfloat(r.styleable.my_view_bg_color, 80.0f); drawable = (gradientdrawable) getresources().getdrawable(r.drawable.user_login_corner_qq); drawable.setcornerradius(mradiussize); drawable.setstroke(1, mstrokecolor); drawable.setcolor(mrlaybgcolor); mrlay.setbackground(drawable); mtvstr = ta.getstring(r.styleable.my_view_tv_str); mtv.settext(mtvstr); mrighttvstr = ta.getstring(r.styleable.my_view_right_tv_str); mrighttv.settext(mrighttvstr); mivsrc = ta.getresourceid(r.styleable.my_view_iv_src, r.mipmap.user_login_icon_qq); miv.setimageresource(mivsrc); ta.recycle(); } public void setmyviewtv(string textstr) { mtv.settext(textstr); } public void setmyviewtvcolor(int color) { mtv.settextcolor(color); } public void setmyviewtvsize(float size) { mtv.settextsize(size); } public void ismyviewtvshow(boolean state) { mtv.setvisibility(state ? view.visible : view.gone); } public void setmyviewiv(drawable drawable) { miv.setimagedrawable(drawable); } public void ismyviewivshow(boolean state) { miv.setvisibility(state ? view.visible : view.gone); } public void ismyviewrighttvshow(boolean state) { mrighttv.setvisibility(state ? view.visible : view.gone); } public void setmyviewrighttvtext(string textstr) { mrighttv.settext(textstr); } public void setmyviewrighttvsize(float size) { mrighttv.settextsize(size); } public void setmyviewrighttvcolor(int color) { mrighttv.settextcolor(color); } public void setmyviewbgcolor(int color) { drawable.setcolor(color); mrlay.setbackground(drawable); } public void setmyviewbgradius(float radius) { drawable.setcornerradius(radius); mrlay.setbackground(drawable); } public void setmyviewbgstrokecolor(int color) { drawable.setstroke(1, color); mrlay.setbackground(drawable); } public void setmyviewbgdrawable(drawable drawable) { mrlay.setbackground(drawable); } }
tips: attrs.xml 中如果需要用到资源文件,可以使用 format="reference",代表某一个资源id。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
上一篇: JNI方法实现图片压缩(压缩率极高)