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”

总结

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

看下效果截图

时间: 2024-10-17 20:40:00

Android自定义组合控件--图片加文字,类似视频播放软件的列表的相关文章

Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装为面向对象的类,而并非讨论如何继承自SDK提供的控件类(比如TextView),对其进行自定义扩展的问题. 进入正题前,我们先来看一组功能需求 假设在手机需求上,那么如上三个界面我们可以使用三个Activity,每个Activity一个布局文件,实现起来比较独立,但是假设在Android pad上要

Android自定义组合控件--底部多按钮切换

效果图: 现在市场上大多数软件都是类似于上面的结构,底部有几个按钮用于切换到不同的界面.基于OOP思想,我想把下面的一整块布局封装成一个类,也就是我们的自定义组合控件-底部多按钮切换布局,我把它叫做BottomLayout 看上面的布局,几个按钮横向排列,我们先看一下布局 最外面LinearLayout 方向 horizontal,然后5个weight相同的RelativeLayout,每个RelativeLayout里面有一个Button(用了显示选中状态)个ImageView(用来显示红点)

android 自定义组合控件

自定义控件是一些android程序员感觉很难攻破的难点,起码对我来说是这样的,但是我们可以在网上找一些好的博客关于自定义控件好好拿过来学习研究下,多练,多写点也能找到感觉,把一些原理弄懂,今天就讲下自定义组合控件,这个特别适合在标题栏或者设置界面,看下面图: 就非常适合使用组合控件了,现在写一个玩玩: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android自定义组合控件的实现

需求:在黑马做安全卫士的时候,功能9设置中心界面如下: 在点击item的时候,复选框会反转状态,同时"自动更新已经关闭"会变换内容和颜色. 可以发现这个界面类似ListView,但又不是ListView,因为它的item数量是固定的,且最后一 item和之前的都不一样.虽然这个看着像是标准的List结构,实则每个item不是完全一样,因为 每个item的提示文本(如"自动更新已经关闭")的内容并不完全一样. 假如用一般方式来布局的话,4个item就会有3*4 = 1

Android自定义组合控件---教你如何自定义下拉刷新和左滑删除

绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一个,做完了和QQ的对比了一下,并没有太大区别,今天分享给大家,其实并不难,但是不知道为什么网上没有比较好的Demo,当你的项目真的很急的时候,又没有比较好的Demo,那么"那条友谊的小船儿真是说翻就翻啊",好了,下面先来具体看一下实现后的效果吧: 代码已经上传到Github上了,小伙伴们记

Android自定义组合控件

今天和大家分享下组合控件的使用.很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法.今天就来介绍下如何使用组合控件,将通过两个实例来介绍.第一个实现一个带图片和文字的按钮,如图所示: 整个过程可以分四步走.第一步,定义一个layout,实现按钮内部的布局.代码如下: <?xml version="1.0" encoding="utf-8&quo

Android自定义组合控件内子控件无法显示问题

今天自定义了一个组合控件,与到了个奇葩问题: 我自定义了一个RelativeLayout,这个layout内有多个子控件.但奇怪的是这些子控件一直显示不出来.调试了一下午,竟然是因为在获取(inflate)布局时没有添加到Root.

android 自定义组合控件 顶部导航栏

在软件开发过程中,经常见到,就是APP 的标题栏样式几乎都是一样的,只是文字不同而已,两边图标不同.为了减少重复代码,提高效率, 方便大家使用,我们把标题栏通过组合的方式定义成一个控件. 例下图: 点击: 如不设置左边,右边图片: 下面说一下具体实现步骤: 步骤一: 导航栏包括:* 返回按钮* 标题* 右侧按钮(功能不确定) 首先是布局文件,如下: </pre><p></p><pre name="code" class="java&q

(转)android自定义组合控件

原文地址:http://mypyg.iteye.com/blog/968646 目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性. 1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton. Xml代码   <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://