全国服务热线4000-662-088 专线13828842088 在线咨询 预约方案申请

安卓开发的小技巧

【摘要】2017-4-22


                                                                         安卓开发的小技巧
                                                                                                                           2017-4-22  小B

  又见面啦!欢迎来到安卓开发技巧系列的第三篇博文。


我们很高兴至今为止很多人已经发现了这个系列的有趣之处,很感谢你们通过评论和电子邮件的方式向我们表达你们的支持!


说给第一次来这里的朋友吧,很久以前我们(安卓团队)就已经在内部互相分享每周学习到的小技巧了。


最近,我们开始在博客上与其余的开发团队分享我们的小技巧。


你可以在 这里 和 这里 找到我们较早以前的两篇博文。


可能最近某个星期我们将分享最早的几篇小技巧文章来博君一笑!好吧,言归正传,下面就是这周的小技巧。


技巧 1


如果你正在使用 ZXing 库中的 QRCodeWriter 来生成 qr 码,那么(用这种方法)生成大尺寸图像是相当慢的。实际上,你可以传递一个 0×0 的尺寸,这时将返回一个尽可能最小尺寸(每块是1像素)的 BitMatrix。


然后你可以把这个 matrix 写进 BitmapDrawable,并将其设置为某些视图的背景。


不过,你需要首先确保在 drawable 中调用了


setFilterBitmap(false)


这样(图像)在缩放时不会变得模糊。


BitMatrix matrix = new QRCodeWriter().encode("content here", BarcodeFormat.QR_CODE, 0, 0);


int height = matrix.getHeight();


int width = matrix.getWidth();


Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);


for (int x = 0; x < width; x++) {


for (int y = 0; y < width; y++) {


bmp.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.TRANSPARENT);
}
}
BitmapDrawable qrCodeDrawable = new BitmapDrawable(getResources(), bmp);


qrCodeDrawable.setFilterBitmap(false);


imgQrCode.setBackground(qrCodeDrawable);


我使用 Bitmap.Config.ARGB_4444,因为我需要将 QR 码的背景设置成透明。如果你希望是黑白色的,可以使用 Bitmap.Config.RGB_565。


同时,如果你希望操作安全,你可以改变 QR 码的创建方式为


BitMatrix matrix = new QRCodeWriter().encode("content here",BarcodeFormat.QR_CODE, 10, 10)


以防类库在未来不再接收 0×0 的尺寸,因为我相信一个 QR 码不可能小于1.0×1.0。


– 技巧贡献者, James Sun


技巧 2


下次你需要使用“adb shell”时可以键入“adb hell”试试。相信我。


– 技巧贡献者, Tyler Romeo


技巧 3


TextUtils.concat()


将会返回给你一个连接输入字符串的字符序列,并且保留了它们之间的间距。


– 技巧贡献者, Walker Hannan


技巧 4


“叶子”视图在触摸事件中享有优先权,但是“根”视图在拦截触摸事件时享有优先权,所以当你需要的是有子视图正在使用的触摸事件时,换成拦截事件吧。


同时,如果这个子视图正在调用


setRequestDisallowInterceptTouchEvent


但是你并不希望它起作用,那么除了覆盖它不要做任何事。


– 技巧贡献者, Frank Doyle


技巧 5


你可以使用 SqliteDatabase 的 beginTransaction() 和 endTransaction() 来完成批量操作,但是你必须确保调用了


setTransactionSuccessful()


否则一旦调用endTransaction(),你所做的改变将会回滚。


– 技巧贡献者, Walker Hannan


技巧 6


如果你正在做测试,你可能应该谨慎使用静态方法!为什么?在众多其他理由中,较恰当的一个理由是安卓框架提供的方法不能在测试中使用,因为他们是静态方法所以你不能将它们模拟出来。


– 技巧贡献者, Frank Doyle


技巧 7

如果你正在做测试,你应该试试 Mockito。它会帮助你将复杂对象依赖替换成超级简单的替换物。