移动开发

Android Zxing 扫描器 扫描框、扫描线定制样式

###一、概述 相信Adnroid开发都知道,世界上有四款扫描器,Zxing 、Zbar ,Barcode4J、OkapiBarcode 前二者应用较广泛,至于介绍与区别就在此阐述,网上有很多。此文主要介绍在在使用过程中,官方客户端各种达不到需求。相信很多童鞋都有此体会,所以借此机会就在Zxing 官方客户端基础上修改,去除无用功能并二次封装达到可扩展。 官方客户端目前问题汇总 设置功能多余 竖屏后不能正向扫描条形码 扫描框大小、颜色、扫描线配置不够灵活 无生成二维码、主动识别二维码功能 介于以上问题,于是该库就华丽的诞生 修复竖屏不能正向扫描条形码 可定制扫描框与扫描线样式 加入创建二维码、识别图片中的二维码功能 ###二、效果图 本库地址:https://github.com/mylhyl/Android-Zxing ###三、代码说明 Zxing 核心代码 https://github.com/zxing/zxing/tree/master/core 不作任何修改也不需要修改,只管用就行主要修改客户端代码。你可以自己编译成 jar 或者直接下源码拷到工程,可以参考Zxing编译。也可以到github下载本库,利用gradle编译 如下图双击 makeJar 等待控制出现 BUILD SUCCESSFUL 即编译完成,zxing 工程目录build将出libs目录 精简后的代码,去掉资源文件、扫描历史记录、分享等,目录结构如下 camera 摄像头相关 common 全局静态常量相关 decode 解析二维码相关 encode 生成二维码相关 OnScannerCompletionListener 扫描成功接口 ViewfinderView 扫描预览视图 ScannerView 新增自定义View,包括 ViewfinderView 、SurfaceView,公开一些样式设置方法,具体使用后面介绍 样式定义上来说,其实就在darw方法中,与平时自定义View一样,废话不多说来看一下干货 定义所用的变量 private int laserColor = Scanner.color.VIEWFINDER_LASER;//扫描线颜色 private int laserFrameBoundColor = laserColor;//扫描框4角颜色 private int laserLineTop;// 扫描线最顶端位置 private int laserLineHeight;//扫描线默认高度 private int laserMoveSpeed;// 扫描线默认移动距离px private int laserFrameCornerWidth;//扫描框4角宽 private int laserFrameCornerLength;//扫描框4角高 private int laserLineResId;//扫描线图片资源 private String drawText = "

retrofit2+Executors+DiskLruCache 2秒加载100张图片从此告别OOM的困扰

人生的旅途,前途很远,也很暗。然而不要怕,不怕的人的面前才有路。——鲁迅 自从上一篇博客发布后,已经有很长时间没有更新博客了,一直忙着支付通的事情,在此给大家道个歉。 先贴个图: 你不要惊讶,这就是第一次从网络获取图片的速度,感觉比本地读取图片的速度还要快吧。加载100张图片真的只要2秒时间,你不要不相信,不信你就来看。 一、概述 在众多的app当中,缓存可以作为衡量一款产品的好坏,既能节省流量,减少电量消耗,最重要的是用户体验好。你想想一款产品每个月消耗你100M以上的流量,你愿意用吗?当然这里除了游戏以外。那么怎么才能做好缓存呢?这里要介绍两个重要的概念,一个是内存缓存LruCache,一个是硬盘缓存DiskLruCache,大家对这两个概念肯定不会陌生,如果你还不了解的话请链接郭神的Android DiskLruCache完全解析,硬盘缓存的最佳方案 真心写的很棒。从标题中就可以看出今天还有一个主角就是线程池这个概念我很久以前都听说过了,但没具体去研究过,我也只会使用它。 相关文章请链接一下地址: Retrofit2与RxJava用法解析 android中对线程池的理解与使用 Android DiskLruCache完全解析,硬盘缓存的最佳方案 二、Executors初探线程池 Android常用的线程池有以下几种,在Executors里面对应的方法: newFixedThreadPool 每次执行限定个数个任务的线程池 newCachedThreadPool 所有任务都一次性开始的线程池 newSingleThreadExecutor 每次只执行一个任务的线程池 newScheduledThreadPool 创建一个可在指定时间里执行任务的线程池,亦可重复执行 获取实例: Executors.newSingleThreadExecutor();// 每次只执行一个线程任务的线程池 Executors.newFixedThreadPool(3);// 限制线程池大小为3的线程池 Executors.newCachedThreadPool(); // 一个没有限制最大线程数的线程池 Executors.newScheduledThreadPool(3);// 一个可以按指定时间可周期性的执行的线程池 我们来看看下面这个例子: new Thread(new Runnable() { @Override public void run() { } }).start(); 在功能上等价于: mMyHandler.post(new Runnable() { @Override public void run() { } }); 还等价于: executors.execute(new Runnable() { @Override public void run() { } }); 我们为啥要使用ExecutorService呢,而不使用Thread和Handler?使用线程池我觉得可以对我们开启的线程进行跟进,可以复用这点很重要,能够减少内存消耗,当然也可以指定个数来执行任务的线程池、创建一个可在指定时间里执行任务的线程池。 线程池使用

android 中style的使用

Android的Styles(样式)和Themes(主题)非常类似Web开发里的CSS,方便开发者将页面内容和布局呈现分开。Style和Theme在Android里的定义方式是完全一样的,两者只是概念上的区别:Style作用在单个视图或控件上,而Theme用于Activity或整个应用程序。由于作用范围的不同,Theme也就需要比Style包含更多的定义属性值的项目(item)。不过本文,我将Style和Theme都归为Style来称呼。 Android的Style和Web的CSS相比,有一个缺陷就是只能针对一个对象只能通过android:theme="@style/AppTheme"或style="@style/MyStyle"指定一个值。而CSS则可以通过class属性在DOM元素上定义多个样式来达到组合的效果。不过Style也有CSS没有的功能,那就是继承(Inheritance)。(当然CSS通过LESS和SASS这些工具也获得继承的能力。) Style继承简介 根据Android Developers官方文档的介绍,定义Style的继承有两种方式:一是通过parent标志父Style; Java