很多时候系统自带的控件无法满足我们设计的要求,这个时候android提供的允许自定义view的办法就帮了我们大忙。在android中,自定义view主要有三种实现方式
1.对现有控件进行扩展
2.通过组合实现新的控件
3.重写view来实现新的控件
现在先是第一点,对现有控件进行扩展
书中给了两个例子,第一个是对textview控件进行扩展,代码片段如下:
protected void onDraw(Canvas canvas) {
//绘制外层矩形
canvas.drawRect(0,
0,
getMeasuredWidth(),
getMeasuredHeight(),
mPaint1);
//绘制内层矩形
canvas.drawRect(10,
10,
getMeasuredWidth()-10,
getMeasuredHeight()-10,
mPaint2);
canvas.save();
//绘制文字前平移10像素
canvas.translate(10, 0);
//在回调父方法之前实现自己的逻辑,对Textview来说即是在绘制文本之前
super.onDraw(canvas);
//在回调父方法之后实现自己的逻辑,对Textview来说即是在绘制文本之后
canvas.restore();
}
在这之前,我们需要在构造方法中增加对画笔属性的初始化,因为我们要在布局文件中使用到这个自定义的view,所以要添加两个参数的构造方法,这里的第二个参数AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来(如果有的话),而拥有一个参数的构造函数只适合于直接在activity用代码调用该view时使用。
<span style="font-size:18px;">
public RecTextView(Context context,AttributeSet attributeSet) {
super(context,attributeSet);
// TODO Auto-generated constructor stub.
mPaint1 = new Paint();
mPaint1.setColor(getResources().getColor(android.R.color.holo_blue_light));
mPaint1.setStyle(Paint.Style.FILL);
mPaint2 = new Paint();
mPaint2.setColor(Color.YELLOW);
mPaint2.setStyle(Paint.Style.FILL);
}</span>
然后在xml文件中添加该控件
<span style="font-size:18px;"> <
com.example.textviewbyextend.RecTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="android hello"/></span>
完成之后,就可以在代码中实例化这个布局文件了<span style="font-size:18px;">
public class MainActivity extends Activity {
private RecTextView recTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}</span>
效果如图: