Android 自定义View时使用TypedArray配置样式属性详细介绍

Android 自定义View时使用TypedArray配置样式属性详细介绍

在自定义view时为了提高复用性和扩展性,可以为自定义的view添加样式属性的配置,比如自定义图片资源、文字大小、控件属性等,就这需要用到TypedArray类,下面以一个自定义的可点击扩展和收缩的TextView为例记录下这个类的简单使用。

先上效果图:

点击以后为

再贴代码:

1.自定义view类;

/** * @title ExpandTextView * @description 可扩展TextView,可以通过设置ExpandTextViewStyle来自定义展开图片、收起图片和最小展示的行数 */ public class ExpandTextView extends LinearLayout implements OnClickListener { /** * 默认最少展示的行数 */ private int defaultMinLines; /** * 是否展开 */ private boolean mCollapsed = true; /** * 是否重新布局 */ private boolean mRelayout = false; private View expandView; private TextView expandText; private ImageView expandImg; private Drawable mExpandDrawable; private Drawable mCollapseDrawable; public ExpandTextView(Context context) { this(context, null); } public ExpandTextView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs); } private void init(AttributeSet attrs) { expandView = LayoutInflater.from(getContext()).inflate( R.layout.pt__expand_textview, null); expandText = (TextView) expandView.findViewById(R.id.expand_text); expandText.setOnClickListener(this); expandImg = (ImageView) expandView.findViewById(R.id.expand_img); expandImg.setOnClickListener(this); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ExpandTextViewStyle); // 自定义图片资源 mExpandDrawable = getResources().getDrawable( a.getResourceId(R.styleable.ExpandTextViewStyle_expand, R.drawable.pt__ic_expand)); expandImg.setBackgroundDrawable(mExpandDrawable); mCollapseDrawable = getResources().getDrawable( a.getResourceId(R.styleable.ExpandTextViewStyle_collapse, R.drawable.pt__ic_collapse)); // 自定义最小行数 defaultMinLines = a.getInt( R.styleable.ExpandTextViewStyle_default_min_lines, 2); a.recycle(); LinearLayout.LayoutParams params = new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); params.gravity = Gravity.CENTER; addView(expandView, params); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (!mRelayout) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; } mRelayout = false; expandText.setMaxLines(Integer.MAX_VALUE); expandImg.setVisibility(View.GONE); super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (expandText.getLineCount() <= defaultMinLines) { return; } if (mCollapsed) { expandText.setMaxLines(defaultMinLines); } expandImg.setVisibility(View.VISIBLE); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public void setText(CharSequence text) { mRelayout = true; expandText.setText(text); } public void setText(int resId) { this.setText(getContext().getString(resId)); } @Override public void onClick(View view) { if (expandImg.getVisibility() != View.VISIBLE) { return; } mCollapsed = !mCollapsed; expandImg.setBackgroundDrawable(mCollapsed ? mExpandDrawable : mCollapseDrawable); expandText .setMaxLines(mCollapsed ? defaultMinLines : Integer.MAX_VALUE); } }

2.在res/values下添加的attrs.xml文件中定义样式属性;

<resources> <!-- ******************************可扩展ExpandTextView样式******************************* --> <declare-styleable name="ExpandTextViewStyle"> <!-- 展开图片 --> <attr name="expand" format="reference" /> <!-- 关闭图片 --> <attr name="collapse" format="reference" /> <!-- 最小行数 --> <attr name="default_min_lines" format="integer" /> </declare-styleable> </resources>

3.在res/values下的style.xml文件中定义样式,可替换图片资源;

<!-- 可扩展ExpandTextView样式 --> <style name="ExpandTextViewStyle"> <item name="expand">@drawable/pt__ic_expand</item> <item name="collapse">@drawable/pt__ic_collapse</item> <item name="default_min_lines">3</item> </style>

4.布局文件;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res/com.example.typedarraytest" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" > <com.example.typedarraytest.ExpandTextView android:id="@+id/expand_text_view" style="@style/ExpandTextViewStyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="8dp" custom:default_min_lines="2" /> </RelativeLayout>

下面简单描述下实现步骤:

1.先定义好attrs.xml文件;

2.在自定义view类中获取定义的样式属性,下面这几行代码是关键:

TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ExpandTextViewStyle); // 自定义图片资源 mExpandDrawable = getResources().getDrawable( a.getResourceId(R.styleable.ExpandTextViewStyle_expand, R.drawable.pt__ic_expand)); expandImg.setBackgroundDrawable(mExpandDrawable); mCollapseDrawable = getResources().getDrawable( a.getResourceId(R.styleable.ExpandTextViewStyle_collapse, R.drawable.pt__ic_collapse)); // 自定义最小行数 defaultMinLines = a.getInt( R.styleable.ExpandTextViewStyle_default_min_lines, 2); a.recycle();

3.既可以直接在style.xml中定义样式然后使用,也可以在布局文件中配置属性:

custom:default_min_lines="2"

要使用上面的属性,需要在布局文件的根节点中添加如下属性:

xmlns:custom=http://schemas.android.com/apk/res/com.example.typedarraytest

格式:xmlns:自定义关键字(用于在控件中使用属性,同android)=http://schemas.android.com/apk/res/包名

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

时间: 2024-08-02 01:36:00

Android 自定义View时使用TypedArray配置样式属性详细介绍的相关文章

Android 自定义View时使用TypedArray配置样式属性详细介绍_Android

 Android 自定义View时使用TypedArray配置样式属性详细介绍       在自定义view时为了提高复用性和扩展性,可以为自定义的view添加样式属性的配置,比如自定义图片资源.文字大小.控件属性等,就这需要用到TypedArray类,下面以一个自定义的可点击扩展和收缩的TextView为例记录下这个类的简单使用. 先上效果图: 点击以后为 再贴代码: 1.自定义view类: /** * @title ExpandTextView * @description 可扩展TextV

Android自定义View之圆形进度条总结

最近撸了一个圆形进度条的开源项目,算是第一次完完整整的使用自定义 View .在此对项目开发思路做个小结,欢迎大家 Star 和 Fork. 该项目总共实现了三种圆形进度条效果 CircleProgress:圆形进度条,可以实现仿 QQ 健康计步器的效果,支持配置进度条背景色.宽度.起始角度,支持进度条渐变 DialProgress:类似 CircleProgress,但是支持刻度 WaveProgress:实现了水波纹效果的圆形进度条,不支持渐变和起始角度配置,如需此功能可参考 CircleP

Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题

这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐标相关问题 我们自定义了View,但是有没想过一个问题,就是View中的(0,0)坐标,也就是原点坐标在哪??我们是不是有时候很困惑,接下来我们就来研究View中的原点坐标相关的问题. 一.new DuView时View的原点 我们通过从View中绘制一条从原点到右下角的线来看看这个View中的原点

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

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

Android自定义View实现开关按钮

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

Android 自定义View步骤_Android

例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能够有效地使用CPU和内存,并且十分开放的.但是,除了开始一个设计良好的类之外,一个自定义view应该: l 符合安卓标准 l 提供能够在Android XML布局中工作的自定义样式属性 l 发送可访问的事件 l 与多个Android平台兼容. Android框架提供了一套基本的类和XML标签来帮您创

Android 自定义view和属性动画实现充电进度条效果_Android

近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和自定义view的方式来完成这个功能,将它开源出来,供有需要的人了解一下相关的内容. 本次实现的功能类似下面的效果: 接下来便详细解析一下如何完成这个功能,了解其中的原理,这样就能举一反三,实现其他类似的动画效果了. 详细代码请看大屏幕 https://github.com/crazyandcoder

Android自定义View实现验证码_Android

本文章是基于鸿洋的Android 自定义View (一) 的一些扩展,以及对Android自定义View构造函数详解里面内容的一些转载. 首先我们定义一个declare-styleable标签declare-styleable标签的作用是给自定义控件添加自定义属性用的例如这样 (我们定义了文字的颜色,大小,长度,跟背景的颜色) <declare-styleable name="CustomTitleView"> <attr name="titleColor&

Android 自定义 view 控件实例

Android自定义view通过继承系统的View并重写部分方法来满足自己的特定需要.首先我们来看一下都有哪些方法可能需要被重写: onMeasure() 检测View组件及其子组件的大小 onLayout() 当该组件需要分配其子组件的位置.大小时 onTouchEvent 当发生触屏事件时 onDraw() 当组件将要绘制它的内容时 onKeyDown 当按下某个键盘时 onKeyUp  当松开某个键盘时 onTrackballEvent 当发生轨迹球事件时 onSizeChange() 当