欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android创建外部lib库及自定义View的图文教程

程序员文章站 2022-05-16 12:34:25
前言 随着插件化/组件化的快速发展,现在大部分的项目开发中都会提取公共的代码制作成 library module,根据具体的业务需求进行拆分。小菜也学习一下如何拆分 li...

前言

随着插件化/组件化的快速发展,现在大部分的项目开发中都会提取公共的代码制作成 library module,根据具体的业务需求进行拆分。小菜也学习一下如何拆分 lib 包,实际操作很简单,整理一下操作步骤。

拆分创建 library

在当前 project 下,file -> new module,选择 android library,进行下一步;

Android创建外部lib库及自定义View的图文教程

设置具体的 library/module/package 等名称,注意:module 名称与 library 相匹配默认为小写,需要的话手动调整,进行下一步;

Android创建外部lib库及自定义View的图文教程

此时在当前 project 中就已经创建好 library;

Android创建外部lib库及自定义View的图文教程

在当前 project 的 settings.gradle 中就会自动生成创建的 module;

tips: :myview 中的 : 代表的与 app 同级目录下的 module。

Android创建外部lib库及自定义View的图文教程

在当前 app 的 build.gradle 中 dependencies{} 中添加 implementation project(':myview') 即可正常接入。

Android创建外部lib库及自定义View的图文教程

自定义 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);
}
}

Android创建外部lib库及自定义View的图文教程

tips: attrs.xml 中如果需要用到资源文件,可以使用 format="reference",代表某一个资源id。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。