自定义发票

先贴图:

这个图就是发票的原形了,里面关键部分就是:
//用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作
canvas.save();
//Canvas的平移
canvas.translate(x,y)
//用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响
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);
        //不等于0表示可以绘制gearcount+1/n个圆
        if(a!=0){
            marginleft_right=(width-gearcount*radius*2)/2;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值