关闭

自定义发票

标签: canvas自定义发票
308人阅读 评论(0) 收藏 举报
分类:

先贴图:

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

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

}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

国税总局发票助手二维码生成的CRC计算

最近为了在我们的应用里生成发票信息的二维码,根据国税总局的二维码文档(见文后),唯一麻烦的地方就是需要计算一个CRC16的值。中间主要碰到了两个问题,一是文档中没有描述中文编码方式,经过试验,我们发现...
  • sqlxx
  • sqlxx
  • 2017-08-01 08:07
  • 1316

Oracle EBS 应付发票 接口导入 API

本章主要目的是介绍Oracle EBS 应付发票 接口导入的API,因为有时需要开发一些应付发票批量导入或者从外围系统导入功能。 背景介绍:因为有时需要开发一些应付发票批量导入或者从外围系统导入功能...
  • jimmy_898
  • jimmy_898
  • 2014-05-25 11:25
  • 4087

jsp实现套打(发票打印)

jsp普通打印很简单,有很多方式,可以用window.print()这种自带的方法,也可以用组件webBrowser,还可以用ScriptX这样的第三方组件来实现。这样的打印都是打印默认的A4,如果碰...
  • lsy649241354
  • lsy649241354
  • 2013-06-23 11:15
  • 1373

Oracle EBS AP发票接口导入

Oracle EBS AP发票接口导入 在EBS 系统中客制化采购对账系统时,采用了ISP客户化,采购对账流程经历:1、手动/自动生成采购对账单;2、将采购对账单提交给供应商查看/确认;3、将供应...
  • zfj0597
  • zfj0597
  • 2016-08-11 09:04
  • 3062

hdu1864 — 最大报销额

题目大意:给出n张发票,每张发票可报销的类型只有 A、B、C三类,若有其他不予报销,其中可报销的每张发票总额不超过1000,单项消费金额不超过600,给出报销额度,问可报销的最大总额 思路分析:该...
  • freshman30
  • freshman30
  • 2015-07-16 09:35
  • 154

发票OCR识别来了 移动报销还会远吗

关键词:发票识别 发票OCR识别 OCR识别   财务最烦的是什么?整理发票!报销时最烦的是什么?粘贴发票!出差时最担心什么?别忘了要发票,发票要保管好! 关于报销这件事,企业和员工的最大痛点在...
  • curry666
  • curry666
  • 2016-08-02 16:12
  • 2181

MM--发票校验 及基于采购订单的MIRO发票校验过程

一、介绍 发票校验是物料管理(MM)系统的一部分。它提供物料管理部分和财务会计, 成本控制和资产管理部分的连接。 物料管理模块的发票校验为以下目的服务: 它完成物料采购的全过程 - 物料采购从采...
  • zhongguomao
  • zhongguomao
  • 2016-11-19 14:43
  • 871

题目1025:最大报销额

题目描述:     现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过60...
  • ZJFCLH
  • ZJFCLH
  • 2014-03-12 23:52
  • 768

AP未结应付发票一览

--未结应付发票 select hou.name as "业务实体", aia.cust_registration_number as "客户纳税人标识", cux_bq_...
  • chosen1brain
  • chosen1brain
  • 2016-11-29 11:58
  • 323

SAP 发票合并与拆分

问题的提出: 很多企业在晚上运行后台作业来开具到期发票。问题是这些自动运行的到期清单,是以怎样的逻辑被拆分、合并的?本文档将解释标准系统的工作逻辑并提供事例来说明怎样对标准逻辑作自定义增强。 ...
  • Amandfox1228
  • Amandfox1228
  • 2015-06-16 13:13
  • 2854
    个人资料
    • 访问:36357次
    • 积分:1107
    • 等级:
    • 排名:千里之外
    • 原创:75篇
    • 转载:4篇
    • 译文:0篇
    • 评论:4条
    文章分类