Android 图解创建外部 lib 库及自定义 View

简介: 初识 Library Module~

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

拆分创建 Library

(1) 在当前 Project 下,File -> New Module,选择 Android Library,进行下一步;

(2) 设置具体的 Library/Module/Package 等名称,注意:Module 名称与 Library 相匹配默认为小写,需要的话手动调整,进行下一步;

(3) 此时在当前 Project 中就已经创建好 Library

(4) 在当前 Projectsettings.gradle 中就会自动生成创建的 Module

Tips: :myview 中的 : 代表的与 app 同级目录下的 Module

  1. 在当前 appbuild.gradledependencies{} 中添加 implementation project(':myview') 即可正常接入。

自定义 View

      小菜在新建的 Library 中添加一个自定义按钮,可以添加配置图标和文字以及背景样式。因为只是为了测试 Library Module,所以功能很简单,实现方式也很简单,只是几个基本控件的组合。小菜只是简单的整理一下。

  1. 新建一个 MyView 继承自 RelativeLayout,实现基本的构造方法;
  2. 在构造方法中实现对布局的添加,控件的绑定以及一些基本的 setXX 方法;
  3. 至此 MyView 就可以应用,但所有但属性都需要通过 setXX 方法来设置;这当然是不合理的,于是小菜新建一个 attrs 文件,在资源文件中设置基本的样式,并在 MyViewobtainAttributes 方法中逐一绑定即可;
<?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>
  1. 至此,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。


      小菜也是初步尝试,有不对的地方烦请提醒。以下是小菜公众号,欢迎闲来吐槽~
公众号.jpg

目录
相关文章
|
2月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
14天前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
38 10
|
19天前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
30 3
|
20天前
|
前端开发 Android开发 开发者
安卓应用开发中的自定义视图基础
【9月更文挑战第13天】在安卓开发的广阔天地中,自定义视图是一块神奇的画布,它允许开发者将想象力转化为用户界面的创新元素。本文将带你一探究竟,了解如何从零开始构建自定义视图,包括绘图基础、触摸事件处理,以及性能优化的实用技巧。无论你是想提升应用的视觉吸引力,还是追求更流畅的交互体验,这里都有你需要的金钥匙。
|
23天前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。
|
25天前
|
Android开发
Android中SurfaceView的双缓冲机制和普通View叠加问题解决办法
本文介绍了 Android 平台上的 SurfaceView,这是一种高效的图形渲染控件,尤其适用于视频播放、游戏和图形动画等场景。文章详细解释了其双缓冲机制,该机制通过前后缓冲区交换来减少图像闪烁,提升视觉体验。然而,SurfaceView 与普通 View 叠加时可能存在 Z-Order 不一致、同步问题及混合渲染难题。文中提供了使用 TextureView、调整 Z-Order 和创建自定义组合控件等多种解决方案。
56 9
|
29天前
|
Android开发 容器
Android经典实战之如何获取View和ViewGroup的中心点
本文介绍了在Android中如何获取`View`和`ViewGroup`的中心点坐标,包括计算相对坐标和屏幕上的绝对坐标,并提供了示例代码。特别注意在视图未完成测量时可能出现的宽高为0的问题及解决方案。
26 7
|
2月前
|
XML 搜索推荐 Android开发
安卓开发中的自定义View组件实践
【8月更文挑战第30天】探索Android世界,自定义View是提升应用界面的关键。本文以简洁的语言带你了解如何创建自定义View,从基础到高级技巧,一步步打造个性化的UI组件。
|
26天前
|
前端开发 搜索推荐 Android开发
探索安卓开发中的自定义视图##
【9月更文挑战第6天】 在安卓应用开发的世界里,自定义视图如同绘画艺术中的色彩,它们为界面设计增添了无限可能。通过掌握自定义视图的绘制技巧,开发者能够创造出既符合品牌形象又提升用户体验的独特界面元素。本文将深入浅出地介绍如何从零开始构建一个自定义视图,包括基础框架搭建、关键绘图方法实现、事件处理机制以及性能优化策略。准备好让你的安卓应用与众不同了吗?让我们开始吧! ##
|
6天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
下一篇
无影云桌面