01.自定义控件出现的原因:
Android原生的控件(例如:TextView、ImageView、Button、EditText)无法满足实际的用户需求。
需要程序员,拓展原生控件的用法.用于满足目前用户需求。
02.自定义控件的简单分类:
A.继承控件View的自定义控件
B.继承布局ViewGroup的自定义控件
C.继承某些特别的控件实现
一.继承式View的实现步骤:
1.写一个类继承某个控件
public class MarqueeTextView extends TextView{ ... }
2.重写三个构造方法,根据条件实现(这里只是实现了其中两个构造方法)
注意事项:我们可以在构造方法当中,初始化一些固定的,默认的配置信息.
这些配置信息之前是写死在XML的布局文件当中,目前可以固定写死在构造方法当中,
因为只要当前的类被加载,首先执行的就是构造方法
public MarqueeTextView(Context context) {
this(context, null);
}
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// android:singleLine="true"
setSingleLine();
// android:ellipsize="marquee"
setEllipsize(TruncateAt.MARQUEE);
// android:focusable="true"
setFocusable(true);
// android:focusableInTouchMode="true"
setFocusableInTouchMode(true);
// android:marqueeRepeatLimit="marquee_forever"
setMarqueeRepeatLimit(-1);
}
3.可以重写三个回调的方法【测量】【布局】【绘制】(可不使用)
4.重写某些方法.更改原生的系统配置信息
例如:将跑马灯在EditText抢占焦点或者有警告对话框弹出时候依然能搞跑起来
/**
* 判断控件初始化时是否有焦点
*/
@Override
public boolean isFocused() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
if (focused) {
// 有焦点时走父类方法,焦点被抢走时,不去做操作
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (hasWindowFocus) {
// 窗体有焦点时走父类的方法,窗体焦点消失,不去做操作
super.onWindowFocusChanged(hasWindowFocus);
}
}
5.在XML的布局文件当中,定义全路径名称【包名称+类名称】
二.继承布局ViewGroup的自定义控件 俗称【组合式自定义控件】
继承常见的ViewGroup类实现自定义控件:
ViewGroup就是指的一般的布局
【线性布局 LinearLayout】
【相对布局 RelativeLayout】
【帧布局 FrameLayout】
使用组合自定义控件的好处:
对于布局类型相同的代码,如果想要动态的去修改内容.可以采用组合式自定义控件.
这样操作,能够极大的缩减布局XML冗余的代码编写。
组合式自定义控件的编写步骤说明:
1.抽取一个布局文件,作为打气筒布局.【当前的这个布局是公共部分布局】
2.写一个类.继承ViewGroup或者ViewGroup的子类
3.重写三个构造方法
4.在构造方法当中,采用打气筒去填充此时此刻的视图
5.可以在构造方法.这里去关心控件,关心来自于打气筒布局里面的控件对象
6.接下来.就可以对于关心的控件设置各自的属性了
7.对于需要使用自定义控件的布局.设置全路径名称【包名称+类名称】
Android自定义控件笔记
最新推荐文章于 2024-06-29 22:58:51 发布