Android自定义实现图片加文字功能

发布时间 - 2026-01-11 00:59:40    点击率:

Android自定义实现图片加文字功能

分四步来写:

1,组合控件的xml;
2,自定义组合控件的属性;
3,自定义继承组合布局的class类,实现带两参数的构造器;
4,在xml中展示组合控件。

具体实现过程:

一、组合控件的xml

我接触的有两种方式,一种是普通的Activity的xml;一种是父节点为merge的xml。我项目中用的是第一种,但个人感觉第二种好,因为第一种多了相对或者绝对布局层。

我写的 custom_pictext.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">

  <ImageView
    android:id="@+id/custom_pic_iv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@mipmap/a" />

  <TextView
    android:id="@+id/custom_date_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@id/custom_pic_iv"
    android:layout_marginBottom="5dp"
    android:layout_marginLeft="8dp"
    android:text="2017" />

  <TextView
    android:id="@+id/custom_text_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/custom_pic_iv"
    android:layout_marginLeft="4dp"
    android:layout_marginTop="4dp"
    android:text="题目" />
</RelativeLayout>

这里展示一个merge的例子,有时间,大家可以自己体会下。

<merge xmlns:android="http://schemas.android.com/apk/res/android">

  <Button
    android:id="@+id/title_bar_left"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="5dp"
    android:background="@null"
    android:minHeight="45dp"
    android:minWidth="45dp"
    android:textSize="14sp" />

  <TextView
    android:id="@+id/title_bar_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:singleLine="true"
    android:textSize="17sp" />

  <Button
    android:id="@+id/title_bar_right"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="7dp"
    android:background="@null"
    android:minHeight="45dp"
    android:minWidth="45dp"
    android:textSize="14sp" />

</merge>

这两个xml,都是写在layout中的。

二、自定义组合控件的属性

这步是我们自定义的重要部分之一,自定义组件的私有特性全显示在这。

首先在values中创建attrs.xml

然后定义属性,如下代码

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
  <declare-styleable name="CustomPicText">
    <attr name="pic_backgroud" format="reference"/>
    <attr name="pic_backgroud_width" format="dimension"/>
    <attr name="pic_backgroud_height" format="dimension"/>
    <attr name="pic_text" format="string"/>
    <attr name="pic_text_color" format="color"/>
    <attr name="pic_text_size" format="integer"/>
    <attr name="pic_date" format="string"/>
    <attr name="pic_date_color" format="color"/>
    <attr name="pic_date_size" format="integer"/>
  </declare-styleable>

</resources>

这里有几点需要注意的,第一:属性名为name,第二:属性单位为fromat。这单位包含的值可以查看这里。

三、自定义继承组合布局的class类,实现带两参数的构造器

我实现的CustomPicText.Java

/**
 * Created by Hman on 2017/5/4.
 * 为了测试自定义组合控件
 */
public class CustomPicText extends RelativeLayout {

  private ImageView customPicIv;
  private TextView customDateTv;
  private TextView customTextTv;

  public CustomPicText(Context context, AttributeSet attrs) {
    super(context, attrs);
    // 加载layout
    View view = LayoutInflater.from(context).inflate(R.layout.custom_pictext,this);
    customPicIv = (ImageView) view.findViewById(R.id.custom_pic_iv);
    customDateTv = (TextView) view.findViewById(R.id.custom_date_tv);
    customTextTv = (TextView) view.findViewById(R.id.custom_text_tv);

    // 加载自定义属性配置
    TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CustomPicText);
    // 为自定义属性添加特性
    if (typedArray != null) {
      // 为图片添加特性
      int picBackgroud = typedArray.getResourceId(R.styleable.CustomPicText_pic_backgroud, 0);
      float picWidth = typedArray.getDimension(R.styleable.CustomPicText_pic_backgroud_width,25);
      float picHeight = typedArray.getDimension(R.styleable.CustomPicText_pic_backgroud_height,25);
      customPicIv.setBackgroundResource(picBackgroud);
//      customPicIv.setMinimumWidth(picWidth);

      // 为标题设置属性
      String picText = typedArray.getString(R.styleable.CustomPicText_pic_text);
      int picTextColor = typedArray.getColor(R.styleable.CustomPicText_pic_text_color,16);
      int picTextSize = typedArray.getResourceId(R.styleable.CustomPicText_pic_date_size, 16);
      customTextTv.setText(picText);
      customTextTv.setTextColor(picTextColor);
      customTextTv.setTextSize(picTextSize);

      // 为日期设置属性
      String picDate = typedArray.getString(R.styleable.CustomPicText_pic_date);
      int picDateColor = typedArray.getColor(R.styleable.CustomPicText_pic_date_color, 0);
      int picDateSize = typedArray.getResourceId(R.styleable.CustomPicText_pic_date_size, 12);
      customDateTv.setText(picDate);
      customDateTv.setTextColor(picDateColor);
      customDateTv.setTextSize(picDateSize);

      typedArray.recycle();


    }


  }
}

在这里,我们也可以给控件添加一些监听器,大家自己去加上;这里值得注意的是一个加载配置的类TypeArray

4,在xml中展示组合控件

这个随便写到一个xml中去就行

代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  xmlns:hman="http://schemas.android.com/apk/res-auto"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">

  <com.eastsun.widget.CustomPicText
    android:id="@+id/first"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    hman:pic_backgroud="@mipmap/b"
    hman:pic_date="2017/5/6"
    hman:pic_date_color="@color/white"
    hman:pic_text="第一张图片"
    hman:pic_text_color="@color/red"
    hman:pic_text_size="18"></com.eastsun.widget.CustomPicText>

</LinearLayout>

这里有一点别忘记,添加xmlns:hman=”http://schemas.Android.com/apk/res-auto”

总结

程序基本上到这就结束了。

看下效果截图

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android自定义实现图片加  # Android  # 自定义控件实现图文  # Android实现异步加载图片  # android图片文件的路径地址与Uri的相互转换方法  # Android异步下载图片并且缓存图片到本地DEMO详解  # Android中RecyclerView 滑动时图片加载的优化  # Android仿微信朋友圈点击加号添加图片功能  # Android常用的图片加载库  # Android 实现获取手机里面的所有图片详解及实例  # 自定义  # 的是  # 加载  # 第一种  # 都是  # 在这里  # 在这  # 这两个  # 这就  # 就行  # 希望能  # 几点  # 写到  # 中去  # 有两种  # 谢谢大家  # 写在  # 我写  # 第一张  # 需要注意 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  🚀拖拽式CMS建站能否实现高效与个性化并存?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  米侠浏览器网页背景异常怎么办 米侠显示修复  如何快速搭建高效服务器建站系统?  中山网站推广排名,中山信息港登录入口?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  Swift开发中switch语句值绑定模式  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  新三国志曹操传主线渭水交兵攻略  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  文字头像制作网站推荐软件,醒图能自动配文字吗?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何实现javascript表单验证_正则表达式有哪些实用技巧  用yum安装MySQLdb模块的步骤方法  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何用IIS7快速搭建并优化网站站点?  如何在万网ECS上快速搭建专属网站?  Swift中循环语句中的转移语句 break 和 continue  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  BootStrap整体框架之基础布局组件  如何在新浪SAE免费搭建个人博客?  如何在云主机快速搭建网站站点?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  如何在宝塔面板中修改默认建站目录?  详解Oracle修改字段类型方法总结  如何在万网利用已有域名快速建站?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  详解MySQL数据库的安装与密码配置  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel如何为API生成Swagger或OpenAPI文档  进行网站优化必须要坚持的四大原则  清除minerd进程的简单方法  如何制作一个表白网站视频,关于勇敢表白的小标题?  原生JS实现图片轮播切换效果  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Android滚轮选择时间控件使用详解