浅谈android自定义view
2015-12-17 14:38
411 查看
android 开发也有一段时间了,现在能让自己感觉最大兴奋的还是莫过于自定义view,创造一个从未有过的控件,或者一个炫酷的界面,一定能满足自己的自我成就感。如何去实现从无到有的过程,这是一个艰难的学习路程。(本文是以介绍简单的自定义headview为原型去说这个自定义view)
1.自定义属性:
装逼一般越直观越好,弄个自定义的属性,简单明了,直接在xml文件用我们定义好的属性。
我们首先在values文件下attrs.xml下定义自定义属性:
定义个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里面使用它们了。如图:
2.代码中如何使用我们自定义的属性
在自定义view的构造方法中根据我们定义的styleable的name去获取TypedArray,定义自己要接受这些属性的变量,用typedarray去接收这些定义于xml中的属性值。如图:
这里面运并没有使用ondraw方法去绘制一个界面,而是将HeaderLayout继承一个RelativeLayout,然后再init方法中调用addview方法,添加了一个事先写好的一个头部布局,这样就实现了我们简单的自定义view。
initview方法中对这些控件进行赋值,我们刚刚从xml中获取的属性变量就可以使用到了,干完了这些是不是觉得大功告成了昵?错,这时候我们想要一个点击事件什么的应该怎么去获取昵,这样就到了我们最后的步骤。
3.自定义view的事件处理
这里面我只介绍下onclick事件,ontouchevent事件就不去介绍了。
首先定义好两个接口
在我们控件的onclik事件中调用接口的方法,外面实现这个监听器,我们就能方便在自定义view的外面处理事件了。
在我的自定义headerlayout里面我还添加了动态改变headerlayout的方法:
如果想要了解更多,可以关注我的微信公众号,扫描下面二维码,开启你的奇幻之旅!
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); }
如果想要了解更多,可以关注我的微信公众号,扫描下面二维码,开启你的奇幻之旅!
相关文章推荐
- Android设备的USB通讯
- android开发仿iphone开关按钮动态效果
- Android中的AndroidAnnotations
- Android优化指南
- Android Intent的花样启动
- android 布局2层叠加 能隔着上层点到下层的处理方法
- Android ImageView ScaleTypes介绍
- [干货]Android编程开发规范
- Android内存优化杂谈
- Android分区解释
- [干货]Android编程开发规范
- android开发的记录
- 【Android】Socket通讯示例(服务端/客户端)
- Android中Parcelable接口用法
- Android Activity 启动/退出 动画效果
- Android TextView(未完善)
- Android项目的结构
- Android中的windowSoftInputMode属性详解
- Android Studio 使用笔
- android 调用系统相机拍照 获取原图