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。

总结

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

(0)

相关推荐

  • android studio library 模块中正确引用aar的实例讲解

    今天对接一个海康监控的sdk,其中sdk 是以aar的形式提供的,并且我需要用到此aar的模块是个library.所以按照正常的在application模块中引入aar的方式一致报错,首先提示要关闭offline ,然后关闭了还是会提示错误.想了很久不明白.最终通过公司前辈的指导,正确的引入了aar. 1.除了和正常的aar的引入方式外,我们还需要在application所在模块的build.gradle文件中加入如下一段: repositories { flatDir { dirs 'libs

  • Android Studio多工程引用同一个library项目配置的解决方法

    在使用Android Studio开发的时候,如遇到多个项目引用同一个library的情况时,会遇到在每个项目中都要有一套library的代码的情况,对于还在开发和维护中的Library需要频繁的修改,这对同步就很麻烦,为了解决这个问题,出现了下面的解决方案. 首先:新建一个类库工程,工程名为AppLibs.Dev. 在该类库中包含一个公共的类库appLibs的Module,Module下面的build.gradle配置如下: /** 声明是Android类库 */ apply plugin:

  • Android 自定义View的使用介绍

    在项目开发中,可能系统自带的一些widget不能满足我们的需求,这时就需要自定义View. 通过查看系统中的常用widget如Button,TextView,EditText,他们都继承自View,所以我们在继承自定义View的时候也自然的需要继承View.1.首先新建一个类LView继承自View 复制代码 代码如下: public class LView extends View { private Paint paint; public LView(Context context) {  

  • Android将项目导出为Library并在项目中使用教程

    将Android项目导出为Library 1.修改build.gradle中的Module:app文件 最终如下: 2. 进入到项目文件夹目录,保留app文件夹,其余删除 3.  进入到app文件夹下,修改app.iml为你的库名,即是外层文件名 4. 5. 打开 xxx.iml文件,并替换里面的app为Library名 导入Library 6. 点击File菜单 7.选择Model即library的文件路径(没有截图) 8. 将Model与当前项目关联 观察下 gradle app中 总结 以

  • Android 详解Studio引用Library与导入jar

    在Android项目开发过程中,Android Studio是一款非常强大的开发工具.到底有多强大,用了你就知道了. 本文我将介绍Studio引用Library开源项目与导入jar方法. 一.引用Library 1:选择你的项目,点击导航栏File -->New -->Import Module... 根据提示Import你的Library即可 此时展开你的项目即可发现你导入的Library(我导入的是IOS_Dialog_Library) 到这工作还未结束. 2:再次选择你的项目,点击Fil

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

    前言 随着插件化/组件化的快速发展,现在大部分的项目开发中都会提取公共的代码制作成 Library module,根据具体的业务需求进行拆分.小菜也学习一下如何拆分 lib 包,实际操作很简单,整理一下操作步骤. 拆分创建 Library 在当前 Project 下,File -> New Module,选择 Android Library,进行下一步: 设置具体的 Library/Module/Package 等名称,注意:Module 名称与 Library 相匹配默认为小写,需要的话手动调

  • 利用Android实现比较炫酷的自定义View

    目录 一.背景 1.1.控件效果 1.2.从功能上分析一下这个控件,大致有以下特点 1.3.从结构上分析 二. 背景圆实现 2.1.实现粒子运动 2.2.实现渐变色圆 2.3.展示背景圆的扇形区域 2.4.实现指针变色 2.5.实现背景圆颜色随扇形角度变化 三.跳动数字动画实现 3.1.属性动画+2个TextView实现数字上下切换动画 四.项目源码 总结 一.背景 1.1.控件效果 要实现的自定义控件效果大致如下,实现过程中用到了比较多的自定义View的API,觉得比较有代表性,就分享出来也当

  • Android嵌套RecyclerView左右滑动替代自定义view

    以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求就是要么一个独立的左右滑动效果,要么在一个列表里的中间部分一个左右滑动效果 而列表里面也容易,只是需要解决一点小问题,个人认为值得一提的就是高度问题,一般的人采用固定死的高度,可是在列表里面展示和机型的不同,固定死的话很难保证美观,动态的高度才能解决问题的所在 首先在一个列表控件布局上添加一个recyclerview控件 <android.support.v

  • Win10 系统下VisualStudio2019 配置点云库 PCL1.11.0的图文教程

    一.下载PCL1.11.0 Github下载地址:https://github.com/PointCloudLibrary/pcl/releases 下载红框内的两个文件 二.安装PCL1.11.0 2.1 安装"PCL-1.11.0-AllInOne-msvc2019-win64.exe". (1)选择第二个,自动添加系统变量 (2)安装路径选择D盘,系统会自动新建PCL 1.11.0文件夹. 2.2 安装完成之后打开文件夹 D:\PCL 1.11.0\3rdParty\OpenNI

  • 使用IDEA创建Java Web项目并部署访问的图文教程

    idea (java语言开发的集成环境) IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主. idea基本概念给大家普及完了,大家开始看正

  • idea中创建maven的Javaweb工程并进行配置(图文教程)

    学完maven后,可以创建maven的javaweb工程,在创建完成后还需要一些配置,下面来说下具体步骤,在这里我创建的是一个模块,创建web项目的方式和创建模块一样 1.创建一个模块,点new-Module 2.选择maven,然后把对勾打上,选骨架,一定要选择第二个webapp骨架,如图 3.设置GroupId和ArtifactId,ArtifactId最好设置的和模块名称一样 4.设置maven的相关信息,如图 5.设置模块的名称和存储位置 6.点击完成,当出现红框中的内容的时候表示创建成

  • IDEA社区版创建spring boot项目的安装插件的图文教程

    由于最近idea的官方查的有点严,pojie的企业版idea总失效,现在给大家说一下社区版idea创建spring项目的一个方法!!! 在项目实战中了解到的IDEA创建springboot项目,我找了下我的IDEA没有spring Initializr,网上的说法我试过搜不到spring boot插件,经过一番折腾发现社区版的不是springboot插件,而是spring Assistant插件,在settings中plugins中搜索 如果有就勾选,没有选择安装即可(会提示重启工具) 然后ne

  • Android 使用Kotlin自定义View的方法教程

    前言 随着google宣布kotlin作为官方开发语言,在Android中使用kotlin的趋势也越来越明显,最近被kotlin的文章轰炸了,所以决定上手试一下,试过之后,感觉靠它灵简直有魔性.特别是一句话写出一个复杂的循环的时候,简直被惊呆.而且使用AS,Java代码可以直接转成Kotlin. 效果图如下: 首先是这次自定义View的效果图,是一张饼图.如果是用java写的话也就几十行,觉得换成Kotlin的话可能会更少. 示例代码 主要的功能是可以任设定数据的个数,我这里是4个数据,可以任意

  • Android自定义View仿微博运动积分动画效果

    自定义View一直是自己的短板,趁着公司项目不紧张的时候,多加强这方面的练习.这一系列文章主要记录自己在自定义View的学习过程中的心得与体会. 刷微博的时候,发现微博运动界面,运动积分的显示有一个很好看的动画效果.OK,就从这个开始我的自定义view之路! 看一下最后的效果图: 分数颜色,分数大小,外圆的颜色,圆弧的颜色都支持自己设置,整体还是和微博那个挺像的.一起看看自定义View是怎样一步一步实现的: 1.自定义view的属性: 在res/values/ 下建立一个attrs.xml ,

  • Android自定义View实现开关按钮

    前言:Android自定义View对于刚入门乃至工作几年的程序员来说都是非常恐惧的,但也是Android进阶学习的必经之路,平时项目中经常会有一些苛刻的需求,我们可以在GitHub上找到各种各样的效果,能用则用,不能用自己花功夫改改也能草草了事.不过随着工作经验和工作性质,越来越觉得自定义View是时候有必要自己花点功夫研究一下. 一.经过这两天的努力,自己也尝试着写了一个Demo,效果很简单,就是开关按钮的实现. 可能有的人会说这效果so easy,找UI切三张图就完事了,何必大费周折自定义.

随机推荐