服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android创建外部lib库及自定义View的图文教程

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

2022-08-17 10:48阿策神奇 Android

这篇文章主要给大家介绍了关于Android创建外部lib库及自定义View的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

随着插件化/组件化的快速发展,现在大部分的项目开发中都会提取公共的代码制作成 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 方法中逐一绑定即可;

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
  3. <declare-styleable name="my_view" tools:ignore="MissingDefaultResource">
  4. <!-- 中间文字颜色 -->
  5. <attr name="tv_color" format="color" />
  6. <!-- 中间文字显隐性 -->
  7. <attr name="tv_show" format="boolean" />
  8. <!-- 中间文字内容 -->
  9. <attr name="tv_str" format="string" />
  10. <!-- 中间文字大小 -->
  11. <attr name="tv_size" format="float" />
  12. <!-- 右侧文字颜色 -->
  13. <attr name="right_tv_color" format="color" />
  14. <!-- 右侧文字显隐性 -->
  15. <attr name="right_tv_show" format="boolean" />
  16. <!-- 右侧文字内容 -->
  17. <attr name="right_tv_str" format="string" />
  18. <!-- 右侧文字大小 -->
  19. <attr name="right_tv_size" format="float" />
  20. <!-- 整体背景颜色 -->
  21. <attr name="bg_color" format="color" />
  22. <!-- 整体边框颜色 -->
  23. <attr name="strok_color" format="color" />
  24. <!-- 整体边框圆角 -->
  25. <attr name="bg_radius" format="float" />
  26. <!-- 中间图片显隐性 -->
  27. <attr name="iv_show" format="boolean" />
  28. <!-- 中间图片资源 -->
  29. <attr name="iv_src" format="reference" />
  30. </declare-styleable>
  31. </resources>

4、至此,MyView 自定义按钮以及完成,在 app 中也是正常调用即可。

  1. public class MyView extends RelativeLayout {
  2.  
  3. private Context mContext;
  4. private RelativeLayout mRlay;
  5. private ImageView mIv;
  6. private TextView mTv, mRightTv;
  7. GradientDrawable drawable = new GradientDrawable();
  8.  
  9. int mTvColor, mRightTvColor, mRlayBgColor, mStrokeColor, mIvSrc;
  10. boolean isTvShow, isRightTvShow, isIvShow;
  11. float mTvSize, mRightTvSize, mRadiusSize;
  12. String mTvStr, mRightTvStr;
  13.  
  14. public MyView(Context context) {
  15. super(context);
  16. mContext = context;
  17. initView();
  18. }
  19.  
  20. public MyView(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. mContext = context;
  23. initView();
  24. obtainAttributes(context,attrs);
  25. }
  26.  
  27. private void initView() {
  28. LayoutInflater.from(mContext).inflate(R.layout.my_view_btn, this,true);
  29. mRlay = findViewById(R.id.my_view_rly);
  30. mIv = findViewById(R.id.my_view_iv);
  31. mTv = findViewById(R.id.my_view_tv);
  32. mRightTv = findViewById(R.id.my_view_rtv);
  33. }
  34.  
  35. private void obtainAttributes(Context context, AttributeSet attrs) {
  36. TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.my_view);
  37.  
  38. mTvColor = ta.getColor(R.styleable.my_view_tv_color, Color.BLACK);
  39. mTv.setTextColor(mTvColor);
  40. mRightTvColor = ta.getColor(R.styleable.my_view_right_tv_color, Color.BLACK);
  41. mRightTv.setTextColor(mRightTvColor);
  42. mRlayBgColor = ta.getColor(R.styleable.my_view_bg_color, Color.WHITE);
  43. mRlay.setBackgroundColor(mRlayBgColor);
  44. mStrokeColor = ta.getColor(R.styleable.my_view_strok_color, Color.BLACK);
  45. isIvShow = ta.getBoolean(R.styleable.my_view_iv_show, true);
  46. mIv.setVisibility(isIvShow?View.VISIBLE:View.GONE);
  47. isRightTvShow = ta.getBoolean(R.styleable.my_view_right_tv_show, true);
  48. mRightTv.setVisibility(isRightTvShow?View.VISIBLE:View.GONE);
  49. isTvShow = ta.getBoolean(R.styleable.my_view_tv_show, true);
  50. mTv.setVisibility(isTvShow?View.VISIBLE:View.GONE);
  51. mTvSize = ta.getFloat(R.styleable.my_view_tv_size, 16.0f);
  52. mTv.setTextSize(mTvSize);
  53. mRightTvSize = ta.getFloat(R.styleable.my_view_right_tv_size, 14.0f);
  54. mRightTv.setTextSize(mRightTvSize);
  55. mRadiusSize = ta.getFloat(R.styleable.my_view_bg_color, 80.0f);
  56. drawable = (GradientDrawable) getResources().getDrawable(R.drawable.user_login_corner_qq);
  57. drawable.setCornerRadius(mRadiusSize);
  58. drawable.setStroke(1, mStrokeColor);
  59. drawable.setColor(mRlayBgColor);
  60. mRlay.setBackground(drawable);
  61. mTvStr = ta.getString(R.styleable.my_view_tv_str);
  62. mTv.setText(mTvStr);
  63. mRightTvStr = ta.getString(R.styleable.my_view_right_tv_str);
  64. mRightTv.setText(mRightTvStr);
  65. mIvSrc = ta.getResourceId(R.styleable.my_view_iv_src, R.mipmap.user_login_icon_qq);
  66. mIv.setImageResource(mIvSrc);
  67.  
  68. ta.recycle();
  69. }
  70.  
  71. public void setMyViewTv(String textStr) {
  72. mTv.setText(textStr);
  73. }
  74.  
  75. public void setMyViewTvColor(int color) {
  76. mTv.setTextColor(color);
  77. }
  78.  
  79. public void setMyViewTvSize(float size) {
  80. mTv.setTextSize(size);
  81. }
  82.  
  83. public void isMyViewTvShow(boolean state) {
  84. mTv.setVisibility(state ? View.VISIBLE : View.GONE);
  85. }
  86.  
  87. public void setMyViewIv(Drawable drawable) {
  88. mIv.setImageDrawable(drawable);
  89. }
  90.  
  91. public void isMyViewIvShow(boolean state) {
  92. mIv.setVisibility(state ? View.VISIBLE : View.GONE);
  93. }
  94.  
  95. public void isMyViewRightTvShow(boolean state) {
  96. mRightTv.setVisibility(state ? View.VISIBLE : View.GONE);
  97. }
  98.  
  99. public void setMyViewRightTvText(String textStr) {
  100. mRightTv.setText(textStr);
  101. }
  102.  
  103. public void setMyViewRightTvSize(float size) {
  104. mRightTv.setTextSize(size);
  105. }
  106.  
  107. public void setMyViewRightTvColor(int color) {
  108. mRightTv.setTextColor(color);
  109. }
  110.  
  111. public void setMyViewBgColor(int color) {
  112. drawable.setColor(color);
  113. mRlay.setBackground(drawable);
  114. }
  115.  
  116. public void setMyViewBgRadius(float radius) {
  117. drawable.setCornerRadius(radius);
  118. mRlay.setBackground(drawable);
  119. }
  120.  
  121. public void setMyViewBgStrokeColor(int color) {
  122. drawable.setStroke(1, color);
  123. mRlay.setBackground(drawable);
  124. }
  125.  
  126. public void setMyViewBgDrawable(Drawable drawable) {
  127. mRlay.setBackground(drawable);
  128. }
  129. }

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.jianshu.com/p/911419b1adaf

延伸 · 阅读

精彩推荐