先贴图:
这个图就是发票的原形了,里面关键部分就是:
canvas.save();
canvas.translate(x,y)
canvas.restore();
注意:save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。
代码:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
/**
* 自定义发票
*/
public class InvoiceView extends View{
private Paint paint;
/**画布宽 */
private int width;
/**画布高*/
private int height;
/**圆半径*/
private int radius=10;
/**圆齿轮个数*/
private int gearcount;
/** 当距离不足与在绘制一个圆的时候两边的空隙*/
private int marginleft_right;
private RectF rectF;
public InvoiceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public InvoiceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public InvoiceView(Context context) {
super(context);
init();
}
private void init() {
paint=new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setStyle(Style.STROKE);
paint.setColor(Color.GREEN);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
width=measure(widthMeasureSpec,true);
height=measure(heightMeasureSpec,false);
setMeasuredDimension(width, height);
}
/**
* 测量
* @param measureSpec
* @param b
* @return
*/
private int measure(int measureSpec, boolean b) {
int result=0;
int size=MeasureSpec.getSize(measureSpec);
int mode=MeasureSpec.getMode(measureSpec);
if(mode==MeasureSpec.AT_MOST){
result=size;
}else{
result=Math.max(size,result);
}
return result;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
width=w;
height=h;
}
@Override
protected void onDraw(Canvas canvas) {
drawGear(canvas);
}
/**
* 绘制发票轮廓
* @param canvas
*/
private void drawGear(Canvas canvas) {
measureGearcount();
canvas.save();
canvas.drawLine(0, 0, 0, height, paint);
if(marginleft_right!=0)
canvas.drawLine(0, height, marginleft_right,height, paint);
rectF=new RectF(0,height-radius*2,radius*2, height+radius*2);
canvas.translate(marginleft_right, 0);
for(int a=0;a<gearcount;a++){
canvas.drawArc(rectF, 180, 180, false, paint);
canvas.translate(radius*2, 0);
}
canvas.restore();
if(marginleft_right!=0)
canvas.drawLine(width-marginleft_right, height, width, height, paint);
canvas.drawLine(width, height, width, 0, paint);
canvas.drawLine(width, 0, 0, 0, paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
canvas.drawBitmap(bitmap,width/2-bitmap.getWidth()/2,height/2-bitmap.getHeight()/2, paint);
}
/**
* 计算圆齿轮个数 及空隙
*/
private void measureGearcount() {
int a=width%(radius*2);
gearcount=width/(radius*2);
if(a!=0){
marginleft_right=(width-gearcount*radius*2)/2;
}
}
}