当前分类 / Android / 总共112篇

Android 中水平自动滚动列表实现

水平滚动的思路借鉴于 Android RecyclerView打造自动循环效果,但是这个不能实现循环左右移动,所以我进行了一个小修改,添加了方向这个概念,并在滚动到最顶端的时候自动改变了方向。

水平自动滚动广告效果演示

if(recyclerView.canScrollHorizontally(scrollDirection)){
    recyclerView.scrollBy(2 * scrollDirection, 2 * scrollDirection);
}else{  //改变方向
    scrollDirection = -scrollDirection;
}

首先我们考虑到水平列表可以使用 RecycleView 实现:

mRecycleView.setLayoutManager(new LinearLayoutManager(this.getContext(),
        LinearLayoutManager.HORIZONTAL, false));

然后我们重写一下 RecycleView 继承并使用 scrollBy() 方法来实现自动滚动。

阅读更多

Android 虹软人脸识别 NV21 和 RGB24 转换问题

当我们使用活体检测检测完毕后,需要上传图片给后台进行人脸识别,在 Android 里面默认的 Camera 获取的图片格式是 NV21.

怎么知道这个默认格式呢?

Camera.Parameters parameters = camera.getParameters();
parameters.getPreviewFormat();

这个格式的图片本身虹软是支持的,但是有个条件限制:SDK 对图形尺寸做了限制,宽高需要大于 0,宽度为 4 的倍数, YUYV/I420/NV21/NV12 格式的图片高度为 2 的倍数, RGB24 格式的图片高度不限制。如果你的图片是 NV21 格式不符合这个条件就需要进行转换。

private static final int VALUE_FOR_4_ALIGN = 0b11;
private static final int VALUE_FOR_2_ALIGN = 0b01;

/**
    * 确保传给引擎的NV21数据宽度为4的倍数,高为2的倍数
    *
    * @param bitmap 传入的bitmap
    * @return 调整后的bitmap
    */
public static Bitmap alignBitmapForNv21(Bitmap bitmap) {
    if (bitmap == null || bitmap.getWidth() < 4 || bitmap.getHeight() < 2) {
        return null;
    }
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    boolean needAdjust = false;
    //保证宽度是4的倍数
    if ((width & VALUE_FOR_4_ALIGN) != 0) {
        width &= ~VALUE_FOR_4_ALIGN;
        needAdjust = true;
    }

    //保证高度是2的倍数
    if ((height & VALUE_FOR_2_ALIGN) != 0) {
        height--;
        needAdjust = true;
    }

    if (needAdjust) {
        bitmap = imageCrop(bitmap, new Rect(0, 0, width, height));
    }
    return bitmap;
}

阅读更多

Android 对接虹软活体检测

虹软的人脸识别算法因为免费,所有被很多开发者采用,今天来大致介绍一下如何使用,方便你接入的时候更加省时省力。因为人脸识别一般都放在服务器端,除非做离线识别,所有接下来就针对活体检测 sdk 来说明一下。

活体检测 SDK 下载:https://ai.arcsoft.com.cn/product/liveness_detection.html

ArcSoft_Liveness_Android_V1.0
├─doc
├─libs
│  └─armeabi-v7a 
└─samplecode
    └─LivenessDemo

阅读更多

Android 优秀开源项目整理

下面这些是我整理的一些常用的开源框架,在你的项目中使用它们可以起到事半功倍的效果,有的项目已经不再维护,有的项目即将停止,我只能感叹技术的发展是如此之快,在你还没有完全搞懂一个新框架之前可能这个框架已经被淘汰,我相信这些框架中的大部分会在不久被淘汰,也可能会被全部淘汰。但是这并不影响我们去学习和使用它们,因为其中的设计思维是可以长久的被我们所利用的。

多媒体编程

图片加载库

Picasso

阅读更多

Android 使用 WIFI 无线调试

最近项目中的需要,安卓设备需要安装到设备中后可能需要调试,这个时候去插线调试就不是很方便了,这个时候我想到了 WIFI 无线调试,其实这个在很早之前我就用过,很久没用了,今天索性就记录一下,方便大家参考。

首先,你的 Android 设备需要是 Root 的,而且拥有无线 WIFI 模块。

长按 WIFI 网络图标,然后在弹出的连接对话框中选择 高级选项 然后点击 IP设置 并选择 静态(如下图所示)。

WIFI 连接设置对话框

注意上面的设置弹框界面要输入与你路由器相匹配的网关和网段IP地址,你路由器的网关你可以通过 PC 上面的 ipconfig 或者 ifconfig 命令来查看:

PC 连接同一个路由器

阅读更多

10 个最好的 Android 游戏模板

引言

如果您熟悉 Android SDK,您可能知道使用它从头创建一个新游戏是不容易的。选择合适的游戏引擎,支持多种屏幕尺寸和 DPIs,实现无错误的游戏玩法,管理玩家数据,这些都是需要花费几天甚至几周才能完成的任务。

值得庆幸的是,CodeCanyon 是一个在线市场,它提供了许多经过深思熟虑的游戏模板。通过使用一个或多个这样的模板,你可以跳过游戏开发中大多数繁琐的部分,而只关注游戏中独一无二的部分。

在这篇文章中,我将向你介绍一些在 CodeCanyon 上可用的功能最丰富和最棒的 Android 游戏模板。

阅读更多

Android 中的 MVP 和 MVVM 架构

基本架构

Android 默认模板鼓励创建大型 Activity 或 Fragment。这些组件通常同时包含业务和 UI 逻辑。这使得 Android 应用程序的测试和维护变得更加困难。为了提高可测试性,Android 社区流行几种模式。

最流行的架构选择是:

  • Model View Presenter (MVP)
  • Model View View Model (MVVM)

MVP 或 MVVM 中的视图与 Android 中的视图类不同。MVP 中的视图通常通过 Fragment、Activity 或 Dialog 来实现。

MVP 架构

Model View Presenter(MVP)体系结构模式改进了应用程序体系结构以提高可测试性。 MVP 模式通过演示者(Presenter)从视图中分离数据模型。

阅读更多

Android 日志记录轻量级框架 Timber

前言

Log 日志在 Android 项目开发中的作用非常重要,但项目越做越大,开发者会面临很多问题,比如管理各种不同的 Log,不同版本控制是否输入 Log 等。Timber 是一个轻量级的第三方库,能够帮助开发者更好的使用 Android Log。

面临问题

  1. 项目使用 Log 规范不统一,例如:关于 okhttp 的实现使用了 Logging Interceptor 输出 log,关于 rxjava 的实现使用了 onError,其他使用了 Android Log 机制。
  2. 项目开发时,为了方便调试,需要输出 Log,但发布后,Log 中包含很多项目相关的信息,如果全部暴露会有安全隐患,但完全删除也不利于发生问题后的查看调试,因此需要一个开关,关闭开关则不能输出 log,打开开关则可以输出 log。

Timber 介绍

Timeber 的使用主要通过添加 Tree 实例,添加 Tree 实例可以通过方法 Timber.plant 完成。实例化 Tree 需要尽量早,推荐在项目 ApplicationonCreate() 方法中完成。其中,DebugTree 自动实例化,是 Timber 中已经实现了 tree 的类,可直接拿来用,并在使用他的类中以类名为其 TAG,但是其他的 Tree 不会自动实例化,需要进行手动实现扩展 Timber.Tree 实现。

阅读更多

一款让你爱不释手的 Fragment 管理框架

前言

最近在项目中用到了一个 Fragment 管理框架,简直是一个牛逼,这个介绍给大家,这款框架让你爱上使用 Fragment,可以让你的 Fragment 像使用 Activity 一样方便管理。使用它绝对可以让你的开发效率大幅度提升,如果再结合 ConstraintLayout 来开发界面的过程简直让你爽的不要不要的。

项目地址:https://github.com/YoKeyword/Fragmentation

演示APK下载:https://www.pgyer.com/fragmentation

特性

  1. 悬浮球/摇一摇实时查看 Fragment 的栈视图,降低开发难度。
  2. 内部队列机制 解决 Fragment 多点触控、事务高频次提交异常等问题。
  3. 增加启动模式、startForResult 等类 Activity 方法。
  4. 类 Android 事件分发机制的 Fragment BACK 键机制:onBackPressedSupport().
  5. 提供 onSupportVisible()、懒加载 onLazyInitView() 等生命周期方法,简化嵌套 Fragment 的开发过程。
  6. 提供 Fragment 转场动画 系列解决方案,动态改变动画。
  7. 提供 Activity 作用域的 EventBus 辅助类,Fragment 通信更简单、独立(需要使用 EventBusActivityScope 库)。
  8. 支持 SwipeBack 滑动边缘退出(需要使用 Fragmentation_SwipeBack 库)。

阅读更多

图解 RxJava2-【3】observeOn

上篇文章分析了 RxJava 中 subscribeOn 方法的实现原理,然而只使用 subscribeOn 发现上下游都是执行在子线程中。在日常开发中往往是将上游耗时任务通过 subscribeOn 指定在子线程中,下游通常是更新 UI 等需要在主线程中进行,使用 observeOn(AndroidSchedulers.mainThread()) 就能实现,那么它是怎么做到的呢?

例子

基于上篇文章的代码,修改上下游联系,添加 observeOn(AndroidSchedulers.mainThread())

source.subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(observer);
Log.e(TAG, "其他任务执行");

打印如下:

此时主线程中的「其他任务」没有被阻塞,上游的耗时任务在子线程 RxNewThreadScheduler-1 中执行,而下游接收任务在主线程中进行,并且事件传递不保证顺序(多次执行输出可能都不同),这也是多线程执行顺序的不确定性特点,上篇已介绍过。

阅读更多

图解 RxJava2-【2】subscribeOn

在 RxJava 中可以通过 subscribeOn/observeOn 很方便地完成上下游指定线程的切换,日常开发除了一些常用的 Rx 操作符外,这两个方法也是打交道最多的。本篇先分析 subscribeOn 方法。

例子

先回顾上篇文章的流程,饭店(Observable)开张前提要有厨师(ObservableOnSubscribe),接着改名叫沙县小吃(ObservableCreate),饭店接客(Observable.subscribe(observer)),创建服务员(CreateEmitter)把顾客和厨师关联起来,之后厨师每做一道菜都通过服务员端给顾客,整个流程如下:

我们都知道 Andriod 有主线程,在未指定线程切换操作的情况下,上图的流程是跑在主线程中,另外主线程中往往还存在其他任务需要执行,所以结合线程来看应该是这样的。

阅读更多