当前标签 / Android / 总共100篇

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 优秀开源项目整理

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

多媒体编程

图片加载库

Picasso

阅读更多

Android 使用 WIFI 无线调试

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

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

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

WIFI 连接设置对话框

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

PC 连接同一个路由器

阅读更多

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 库)。

阅读更多

HandlerThread详解

概述

在日常开发中,我们经常会通过 new Thread(){}.start(); 的方式来开辟一个新的线程。但是如果我们想要多次执行任务的时候,通过这种方式我就会创建多个线程,这样会使我们的程序运行起来越来越慢。通常情况下我会采用 HandlerThread 的方式来开辟一个线程,那么 HandlerThread 是什么呢?今天我们来介绍一下 HandlerThread。

正文

HandlerThread 是 Thread 的一个子类,HandlerThread 自带 Looper 使他可以通过消息队列来重复使用当前线程,节省系统资源开销。这是它的优点也是缺点,每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。它的使用也比较简单。

HandlerThread thread = new HandlerThread("MyHandlerThread");
thread.start();

mHandler = new Handler(thread.getLooper());
mHandler.post(new Runnable(){
    //...
});

接下来我们写一个完整的 Demo,然后在分析一下它的实现原理。

阅读更多

Android 中更为精细的屏幕适配方案

系统 dp 适配存在的问题

做 Android 开发的朋友应该都知道,Android 中屏幕的碎片化问题很严重,为此 Google 提供了 dp 这个单位来适配不同的屏幕。

相同大小的两个屏幕可能具有不同的像素数

从上图我们可以看出来,对于不同屏幕分辨率(像素多少)我们不能使用像素 px 作为单位,而应该使用一种和屏幕密度相关的单位 dp 来表示,最后在绘制的时候转换成 px。

px = dp * (dpi / 160)

阅读更多

如何在 Android 中获取 Heap Dumps

Heap Dumps 是诊断内存相关问题(如内存泄漏、垃圾收集问题和 java.lang.OutOfMemoryError )的重要工具。它们也是优化内存使用的重要工具。在本文中,我们提供了一些不同的方法来从 Android 应用程序捕获 Heap Dumps。一旦捕获了 Heap Dumps,就可以使用 HeapHero 和 Android Studio’s Heap Analyzer 等强大工具来分析 Heap Dumps。

Memory Profile

下面是在 Android Studio中从 Memory Profile (内存分析器)捕获 Heap Dumps 的步骤:

第一步:运行 app 并选择你要分析的设备。

第二步:在 Android Studio 中点击 View → Tool Windows → Android Profiler。

第三步:在 Android Profiler 中会有一个内存变化的时间轴,这个内存(MEMORY)时间轴位于处理器(CPU)时间轴之下,网络(NETWORK)时间轴之上。双击进入内存时间轴详情,然后就可以点击下载图标进行生成 Heap Dump, 如下图:

生成 Android 的 Heap Dump

阅读更多