自定义发票

原创 2016年06月01日 15:42:55

先贴图:

这个图就是发票的原形了,里面关键部分就是:

//用来保存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;
        }
    }

}
版权声明:本文为博主原创文章,转载请注明出处。

相关文章推荐

税控发票开票管理系统

  • 2017年07月21日 16:13
  • 46.75MB
  • 下载

winform实现发票打印功能

各位博友,好久没有更新博客了,前两天一个交流中的好友研究了一套winform中的打印功能,再此向这位好友【杭州-andy】表示感谢,感谢他提供这么好的素材让大家学习。          直入主题,实...

Office 自定义插件 Vsto

  • 2017年11月10日 10:40
  • 18.65MB
  • 下载

发票统计(C程序设计进阶 第2周)

编程题#3:发票统计 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有一个小型的报账系统,它有如下功能: (1)统计每个人所报发票的总钱数 (2)统计每类发票的总钱数 ...

自定义view(音量条)

  • 2017年11月09日 15:14
  • 19.83MB
  • 下载

AR发票导入程序

CREATE OR REPLACE PACKAGE APPS.MEW_AR_INVOICE_TRC_PKG IS   /* =====================================...

自定义键盘PopupWindows弹出

  • 2017年11月02日 18:03
  • 8KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义发票
举报原因:
原因补充:

(最多只允许输入30个字)