一个普通的自定义控件
2017-03-21 17:29
113 查看
一个普通的TitleView
可以自定义扩展,是一个相对布局,放置了一个ImageView 和一个TextView;
可以隐藏图片,可以设置图片大小,设置TextView 内容,设置字体大小;
简单使用
<TitleView xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="2000dp"
android:background="@color/colorRed"
app:hideIcon="true"
app:titleColor="#fff"
app:titleSize="18sp"
app:titleText="首页" />
高度已经顶死为 38dp 所以可以随便设置高度;
此文件是在src/values/attrs.xml 中自定义的属性
<declare-styleable name="TitleView">
<!--设置返回键中 靠左边距-->
<attr name="backPaddingLeft" format="dimension"/>
<!--设置Title显示的文字-->
<attr name="titleText" format="string|reference"/>
<!--设置Title显示的字体颜色-->
<attr name="titleColor" format="reference|color"/>
<!--设置Title的字体大小-->
<attr name="titleSize" format="dimension|reference"/>
<!--设置返回键中的图片-->
<attr name="iconSrc" format="reference"/>
<!--是否隐藏 返回按钮-->
<attr name="hideIcon" format="boolean"/>
</declare-styleable>
看一下自定义控件
public class TitleView extends RelativeLayout {
private static final int WIDGET_HEIGHT = 38;
private TextView tvTitle;
private ImageView ivBack;
private String titleText;
private int titleColor = Color.WHITE;
private int titleSize;
private int imgIconBackId;
private int imgPaddingLeft;
private boolean isHideIcon;
private int totalHeight;
public TitleView(Context context) {
super(context);
init(context, null, 0);
}
public TitleView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public TitleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
//将高度锁定,将dp 转成px;
totalHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, WIDGET_HEIGHT, getResources().getDisplayMetrics());
int iconPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
imgPaddingLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
titleSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics());
//初始化图片 话显示的图片
imgIconBackId = R.mipmap.ic_launcher;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TitleView, defStyleAttr, 0);
int count = ta.getIndexCount();
for (int i = 0; i < count; i++) {
int attr = ta.getIndex(i);
switch (attr) {
case R.styleable.TitleView_backPaddingLeft:
imgPaddingLeft = (int) ta.getDimension(attr, 0);
break;
case R.styleable.TitleView_titleColor:
titleColor = ta.getColor(attr, Color.WHITE);
break;
case R.styleable.TitleView_titleSize:
titleSize = (int) ta.getDimension(attr, titleSize);
break;
case R.styleable.TitleView_titleText:
titleText = ta.getString(attr);
break;
case R.styleable.TitleView_iconSrc:
imgIconBackId = ta.getResourceId(attr, imgIconBackId);
break;
case R.styleable.TitleView_hideIcon:
isHideIcon = ta.getBoolean(attr, false);
break;
}
}
/**
* 设置图片
*/
ivBack = new ImageView(getContext());
ivBack.setImageResource(imgIconBackId);
RelativeLayout.LayoutParams ivLp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ivLp.addRule(RelativeLayout.CENTER_VERTICAL);
ivBack.setPadding(imgPaddingLeft, iconPadding, iconPadding, iconPadding);
ivBack.setLayoutParams(ivLp);
if (isHideIcon) {
ivBack.setVisibility(GONE);
}
addView(ivBack);
/**
* 添加title 布局;
*/
tvTitle = new TextView(context);
RelativeLayout.LayoutParams tvLp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
/**
* 在相对布局中,设置当前TextView 在相对布局中的 位置;
*/
tvLp.addRule(CENTER_IN_PARENT);
tvTitle.setLayoutParams(tvLp);
tvTitle.setText(titleText);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
tvTitle.setTextColor(titleColor);
addView(tvTitle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//这里将当前控件的高度固定死,
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY));
}
public void setTitleText(String text) {
tvTitle.setText(text);
}
public void setTitleSize(float size) {
tvTitle.setTextSize(size);
}
public void setIcon(Bitmap bitmap) {
ivBack.setImageBitmap(bitmap);
}
public void setIcon(int srcId) {
ivBack.setImageResource(srcId);
}
public void setOnIconClickListener(View.OnClickListener l) {
ivBack.setClickable(true);
ivBack.setOnClickListener(l);
}
public void setIconLeftPadding(int imgPaddingLeft) {
ivBack.setPadding(imgPaddingLeft, 0, 0, 0);
}
public void setIconVisibility(int visibility) {
ivBack.setVisibility(visibility);
}
}
这就是一个简单的自定义控件;
可以自定义扩展,是一个相对布局,放置了一个ImageView 和一个TextView;
可以隐藏图片,可以设置图片大小,设置TextView 内容,设置字体大小;
简单使用
<TitleView xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="2000dp"
android:background="@color/colorRed"
app:hideIcon="true"
app:titleColor="#fff"
app:titleSize="18sp"
app:titleText="首页" />
高度已经顶死为 38dp 所以可以随便设置高度;
此文件是在src/values/attrs.xml 中自定义的属性
<declare-styleable name="TitleView">
<!--设置返回键中 靠左边距-->
<attr name="backPaddingLeft" format="dimension"/>
<!--设置Title显示的文字-->
<attr name="titleText" format="string|reference"/>
<!--设置Title显示的字体颜色-->
<attr name="titleColor" format="reference|color"/>
<!--设置Title的字体大小-->
<attr name="titleSize" format="dimension|reference"/>
<!--设置返回键中的图片-->
<attr name="iconSrc" format="reference"/>
<!--是否隐藏 返回按钮-->
<attr name="hideIcon" format="boolean"/>
</declare-styleable>
看一下自定义控件
public class TitleView extends RelativeLayout {
private static final int WIDGET_HEIGHT = 38;
private TextView tvTitle;
private ImageView ivBack;
private String titleText;
private int titleColor = Color.WHITE;
private int titleSize;
private int imgIconBackId;
private int imgPaddingLeft;
private boolean isHideIcon;
private int totalHeight;
public TitleView(Context context) {
super(context);
init(context, null, 0);
}
public TitleView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public TitleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
private void init(Context context, AttributeSet attrs, int defStyleAttr) {
//将高度锁定,将dp 转成px;
totalHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, WIDGET_HEIGHT, getResources().getDisplayMetrics());
int iconPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics());
imgPaddingLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
titleSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 14, getResources().getDisplayMetrics());
//初始化图片 话显示的图片
imgIconBackId = R.mipmap.ic_launcher;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TitleView, defStyleAttr, 0);
int count = ta.getIndexCount();
for (int i = 0; i < count; i++) {
int attr = ta.getIndex(i);
switch (attr) {
case R.styleable.TitleView_backPaddingLeft:
imgPaddingLeft = (int) ta.getDimension(attr, 0);
break;
case R.styleable.TitleView_titleColor:
titleColor = ta.getColor(attr, Color.WHITE);
break;
case R.styleable.TitleView_titleSize:
titleSize = (int) ta.getDimension(attr, titleSize);
break;
case R.styleable.TitleView_titleText:
titleText = ta.getString(attr);
break;
case R.styleable.TitleView_iconSrc:
imgIconBackId = ta.getResourceId(attr, imgIconBackId);
break;
case R.styleable.TitleView_hideIcon:
isHideIcon = ta.getBoolean(attr, false);
break;
}
}
/**
* 设置图片
*/
ivBack = new ImageView(getContext());
ivBack.setImageResource(imgIconBackId);
RelativeLayout.LayoutParams ivLp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ivLp.addRule(RelativeLayout.CENTER_VERTICAL);
ivBack.setPadding(imgPaddingLeft, iconPadding, iconPadding, iconPadding);
ivBack.setLayoutParams(ivLp);
if (isHideIcon) {
ivBack.setVisibility(GONE);
}
addView(ivBack);
/**
* 添加title 布局;
*/
tvTitle = new TextView(context);
RelativeLayout.LayoutParams tvLp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
/**
* 在相对布局中,设置当前TextView 在相对布局中的 位置;
*/
tvLp.addRule(CENTER_IN_PARENT);
tvTitle.setLayoutParams(tvLp);
tvTitle.setText(titleText);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
tvTitle.setTextColor(titleColor);
addView(tvTitle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//这里将当前控件的高度固定死,
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY));
}
public void setTitleText(String text) {
tvTitle.setText(text);
}
public void setTitleSize(float size) {
tvTitle.setTextSize(size);
}
public void setIcon(Bitmap bitmap) {
ivBack.setImageBitmap(bitmap);
}
public void setIcon(int srcId) {
ivBack.setImageResource(srcId);
}
public void setOnIconClickListener(View.OnClickListener l) {
ivBack.setClickable(true);
ivBack.setOnClickListener(l);
}
public void setIconLeftPadding(int imgPaddingLeft) {
ivBack.setPadding(imgPaddingLeft, 0, 0, 0);
}
public void setIconVisibility(int visibility) {
ivBack.setVisibility(visibility);
}
}
这就是一个简单的自定义控件;
相关文章推荐
- 我的IT生涯---一个普通程序员的成长经历
- 实践人生-------一个普通IT人的十年回顾(下)
- 找到了一个动态加载web用户自定义控件的问题,不知道算不算是微软的bug
- 一个普通IT人的十年回顾(上)
- 有些疑惑,一个普通的aspx页面的文件,IIS怎么知道改用 asp.net1.1还是 2.0来解释呢?
- 一个普通IT人的十年回顾 (中、下)
- 实践人生 —— 一个普通IT人的十年回顾(下)
- VC中一个关于宏的使用问题,字符串之间转换,宽字符与普通字符
- [收藏]用C#写一个Web自定义控件
- C#如何从普通C++动态库导入一个类?
- 把一个普通应用程序变为win2000(NT)中的服务
- 把一个普通应用程序变为win2000(NT)中的服务
- 一个普通的DataGrid模板实例与分析(原创)
- 实践人生,一个普通IT人的十年回顾
- C#如何从普通C++动态库导入一个类?
- 仅仅丢失一个普通用户数据文件的恢复A(联机恢复)
- 配置Apache中的httpd ,让一个普通目录支持perl,不支持php
- 按公司老大的要求,写了一个自定义控件
- 一个普通IT人的十年回顾
- 通过一个结构体或者普通指针来调用一个带有虚拟函数的对象