您的位置:首页 > 移动开发 > Android开发

浅谈android自定义view

2015-12-17 14:38 411 查看
android 开发也有一段时间了,现在能让自己感觉最大兴奋的还是莫过于自定义view,创造一个从未有过的控件,或者一个炫酷的界面,一定能满足自己的自我成就感。如何去实现从无到有的过程,这是一个艰难的学习路程。(本文是以介绍简单的自定义headview为原型去说这个自定义view)

1.自定义属性:

装逼一般越直观越好,弄个自定义的属性,简单明了,直接在xml文件用我们定义好的属性。

我们首先在values文件下attrs.xml下定义自定义属性:

<declare-styleable name="HeaderLayout">
<attr name="left_image" format="reference" />
<attr name="right_image" format="reference" />
<attr name="right_text" format="string" />
<attr name="center_text" format="string" />
<attr name="head_background" format="reference" />
</declare-styleable>

定义个name叫headerlayout的styable,然后里面就是我们所定义的自定义属性。通过字面意思也就可以知道我定义的这些东西是要实现什么样的功能了。

这里面我要插入一下format的属性介绍:

1. reference:参考某一资源ID

2. color:颜色值

3.
boolean:布尔值

4.
dimension:尺寸值

5.
float:浮点值

6.
integer:整型值

7. string:字符串

8. fraction:百分数

9. enum:枚举值

这里面我们的自定义headerview属性引用了三个资源id,两个字符串,这样我们就可以在xml里面使用它们了。如图:

<com.guanaihui.base.HeaderLayout
android:id="@+id/header_title"
android:layout_width="fill_parent"
android:layout_height="48.0dp"
app:head_back="@color/white"
app:center_text="@string/label_store_detail"
app:right_image="@drawable/ic_share_green"
app:left_image="@drawable/app_back_icon">
</com.guanaihui.base.HeaderLayout>

2.代码中如何使用我们自定义的属性

在自定义view的构造方法中根据我们定义的styleable的name去获取TypedArray,定义自己要接受这些属性的变量,用typedarray去接收这些定义于xml中的属性值。如图:

public HeaderLayout(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.HeaderLayout);
right_text = (String) array.getText(R.styleable.HeaderLayout_right_text);
center_text = (String) array.getText(R.styleable.HeaderLayout_center_text);
left_img = array.getDrawable(R.styleable.HeaderLayout_left_image);
right_img = array.getDrawable(R.styleable.HeaderLayout_right_image);
color = array.getColor(R.styleable.HeaderLayout_head_back, 0xFFFFFFFF);
array.recycle();
init(context);
}

这里面运并没有使用ondraw方法去绘制一个界面,而是将HeaderLayout继承一个RelativeLayout,然后再init方法中调用addview方法,添加了一个事先写好的一个头部布局,这样就实现了我们简单的自定义view。

private void init(Context context) {
mInflater = LayoutInflater.from(context);
mHeader = mInflater.inflate(R.layout.common_header, null);
addView(mHeader);
initViews();
}

initview方法中对这些控件进行赋值,我们刚刚从xml中获取的属性变量就可以使用到了,干完了这些是不是觉得大功告成了昵?错,这时候我们想要一个点击事件什么的应该怎么去获取昵,这样就到了我们最后的步骤。

3.自定义view的事件处理

这里面我只介绍下onclick事件,ontouchevent事件就不去介绍了。

首先定义好两个接口

public interface OnLeftClickListener {
void onClick();
}
public interface OnRightClickListener {
void onClick();
}


在我们控件的onclik事件中调用接口的方法,外面实现这个监听器,我们就能方便在自定义view的外面处理事件了。

在我的自定义headerlayout里面我还添加了动态改变headerlayout的方法:

/**
* 设置左边和中间信息
*
* @param leftClick
* @param titleCenter
*/
public void setLeftCenter(OnLeftClickListener leftClick, String titleCenter) {
setLeftClick(leftClick);
titleCenterView.setText(titleCenter);
}

/**
* 设置左,中(文字),右(设置)
*
* @param leftClick
* @param titleCenter
* @param rightClick
*/
public void setLeftCenterSet(OnLeftClickListener leftClick,
String titleCenter, OnRightClickListener rightClick) {
// iv_arrow.setVisibility(View.GONE);
setLeftClick(leftClick);
titleCenterView.setText(titleCenter);
setRightClick(rightClick);
}

/**
* 设置左,中(下拉对话框),右(刷新)
*
* @param leftClick
* @param middleClick
* @param rightClick
*/
public void setLeftCenterRight(OnLeftClickListener leftClick,
OnMiddleClickListener middleClick, OnRightClickListener rightClick) {
setLeftClick(leftClick);
setMiddleClick(middleClick);
setRightClick(rightClick);
}

/**
* 设置左,中,右(刷新)
*
* @param leftClick
* @param titleCenter
* @param rightClick
*/
public void setLeftCenterRight(OnLeftClickListener leftClick,
String titleCenter, OnRightClickListener rightClick) {
titleCenterView.setText(titleCenter);
setLeftClick(leftClick);
setRightClick(rightClick);
}

/**
* 设置左,中,右(文字信息)
*
* @param leftClick
* @param titleCenter
* @param rightText
*/
public void setLeftCenterRight(OnLeftClickListener leftClick,
String titleCenter, String rightText) {
titleCenterView.setText(titleCenter);
setLeftClick(leftClick);
titleRightText.setText(rightText);
}


如果想要了解更多,可以关注我的微信公众号,扫描下面二维码,开启你的奇幻之旅!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: