android控件满足不了我们的需求,怎么办?自己做吧,提供两种方法,一种是组合andoird现有控件,另重视继承View 自己去画。当然第二种稍微麻烦点。
1 组合控件
先说第一种吧:举个最简单的例子,就是刚做的一个电池控件
1 先定一个.battery_layout.xml 里面上下排布一个imageVIew 和一个TextView,
2 顶一个Battery类, this.layoutInflater = layoutInflater.from(context);
layoutInflater.inflate(R.layout.battery_layout, this);
3 在类中天上你想要操作这个电池控件的代码,搞定,及时这么简单
注意: 当在java中获取xml中已经定义好的空间的时候,可以不用new 来初始化,直接findviewbyId()
batteryImg = (ImageView)findViewById(R.id.battery);
powerText = (TextView)findViewById(R.id.power);
2 控件自己画:
另一种就是提供现有的东西连组合都不能组合了,自己画吧,没法了
看看之前画的标尺控件吧,这需要重写View的ondraw方法,同样是电池;
这里要非常注意,你最好吧View 的三个构造函数在你的类中都实现一下,否则会出现在布局的时候,会出现很多奇怪的现象,具体什么现象现在忘了,像这样:
publicBatteryView(Context context) {
super(context);
initView();
}
publicBatteryView(Context context, AttributeSet attrs) {
super(context,attrs);
initView();
}
publicBatteryView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context,attrs, defStyleAttr);
initView();
}
关键中的关键:onDraw()
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(measureWidth / 2, measureHeigth / 2);
canvas.drawRoundRect(mBatteryRect, 2f, 2f, mBatteryPaint); // 画电池轮廓需要考虑 画笔的宽度
canvas.drawRoundRect(mCapRect, 2f, 2f, mBatteryPaint);// 画电池盖
canvas.drawRect(mPowerRect, mPowerPaint);// 画电量
canvas.restore();
}
measurewidth,measureHeigth 哪里来的?
@Override
protectedvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
measureWidth= MeasureSpec.getSize(widthMeasureSpec);
measureHeigth= MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(measureWidth,measureHeigth);
}
当需要改变电池状态的时候,要记得重绘invalidate(); 如果在子线程中,要用postInvalidate(); 这个函数会触发,去执行onDraw()函数再重新画一次。
就是这样,也不难吧? 就是算坐标的时候,仔细一点,没什么的。