自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(150)
  • 资源 (1)
  • 收藏
  • 关注

转载 使用 FFmpeg 提取帧的综合指南

今天,我想与大家分享如何使用 FFmpeg 通过相应的命令行提取帧。

2024-01-03 17:00:00 2243

原创 Android 如何根据区域高度动态计算最匹配的字体大小

Android 提供了一个 autoSizeTextType 属性来自动调整字体大小,但是它仅适用于 API Level 26 及以上的版本。对于 API Level 25 及以下的版本,可以通过代码计算最佳字体大小来实现动态调整。以下是使用 Kotlin 代码实现的示例:fun getBestFontSize(text: String, maxWidth: Int, maxHeight: Int): Float { val paint = Paint() var textSiz

2023-11-15 16:00:44 257

转载 Android屏幕刷新机制解析

之所以要讲这点,是因为,当我们的 app 界面没有必要再刷新时(比如用户不操作了,当前界面也没动画),这个时候,我们 app 是接收不到屏幕刷新信号的,所以也就不会让 CPU 去计算下一帧画面数据,但是底层仍然会以固定的频率来切换每一帧的画面,只是它后面切换的每一帧画面都一样,所以给我们的感觉就是屏幕没刷新。其实,想想就能明白了。这也是我们从代码上看到的,每一个屏幕刷新信号来的时候,只会去执行一次 performTraversals(),因为只需遍历一遍,就能够刷新所有的 View 了。

2023-09-28 16:25:36 378

转载 module解耦(二)基于路由的解耦

模块化开发可以将一个大型项目拆分成多个相对独立的模块,每个模块负责一个功能或业务场景,从而提高代码的可读性、可维护性和可复用性。路由表可以是静态的或动态的,也可以是本地的或远程的。本地路由表是存储在客户端内存或文件中的,远程路由表是存储在服务器端数据库或配置文件中的。路由是一种将URL映射到具体页面或服务的机制,可以用于将Intent页面跳转的强依赖关系解耦,同时减少跨团队开发的互相依赖问题。这个路由表包含两条记录,分别表示moduleA模块中的pageA页面和moduleB模块中的pageB页面。

2023-07-05 11:25:48 173

转载 安卓开发module解耦总篇

在安卓开发中,随着项目的功能不断扩展,一个app主模块往往会变得庞大而复杂,各种业务逻辑高度耦合,导致代码难以维护和测试。为了提高代码的可读性、可复用性和可扩展性,我们需要将一个app主模块拆分成多个子模块(module),每个子模块负责一个独立的功能或业务场景,例如登录、支付、社交等。但是,拆分后的子模块之间可能还需要相互调用或通信,例如登录模块需要调用支付模块的接口进行支付验证,或者社交模块需要调用登录模块的接口获取用户信息。

2023-07-05 11:24:01 313

转载 module解耦(一)基于接口的module解耦

在安卓开发中,随着项目的功能不断扩展,一个app主模块往往会变得庞大而复杂,各种业务逻辑高度耦合,导致代码难以维护和测试。为了提高代码的可读性、可复用性和可扩展性,我们需要将一个app主模块拆分成多个子模块(module),每个子模块负责一个独立的功能或业务场景,例如登录、支付、社交等。但是,拆分后的子模块之间可能还需要相互调用或通信,例如登录模块需要调用支付模块的接口进行支付验证,或者社交模块需要调用登录模块的接口获取用户信息。

2023-07-05 11:23:05 174

转载 常见代码重构技巧(非常实用)

Java 8 之前我们知道,一个接口的所有方法其子类必须实现(当然,这个子类不是一个抽象类),但是 java 8 之后接口的默认方法可以选择不实现,如上的操作是可以通过编译期编译的。另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的开闭原则。同时,类职责单一,类依赖的和被依赖的其他类也会变少,减少了代码的耦合性,以此来实现代码的高内聚、松耦合。

2023-06-25 17:02:36 308

转载 常见 Java 代码重构技巧

Java 8 之前我们知道,一个接口的所有方法其子类必须实现(当然,这个子类不是一个抽象类),但是 java 8 之后接口的默认方法可以选择不实现,如上的操作是可以通过编译期编译的。另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的开闭原则。同时,类职责单一,类依赖的和被依赖的其他类也会变少,减少了代码的耦合性,以此来实现代码的高内聚、松耦合。

2023-06-10 15:45:58 310

转载 面向对象设计的SOLID原则

这个原则比较简单,举个例子来说,我们对外提供API接口服务,调用方可能有很多个,很多时候我们会提供一个大而全的接口给不同的调用方,但有些时候调用方A只使用1、2、3 这三个方法,调用方B只使用4、5两个方法,其他都不用。面向对象设计的原则有很多,在实际的设计过程中完全遵循所有的原则是不太切实际的,也不现实,始终是一个取舍平衡的过程。说到面向对象设计的 SOLID 原则,相信大部分的程序员都有个大概的印象,但具体是做什么的,要怎么做可能不太清楚,今天就带大家一起来聊聊SOLID原则以及它们之间的联系。

2023-06-07 11:01:25 86

原创 聚合/组合

Father类里有两个方法A和方法B,并且A调用了B。子类Son重写了方法B,这时候如果子类调用继承来的方法A,那么方法A调用的就不再是Father.B(),而是子类中的方法Son.B()。如果程序的正确性依赖于Father.B()中的一些操作,而Son.B()重写了这些操作,那么就很可能导致错误产生。

2023-06-06 17:19:35 428

转载 依赖倒置原则

如此一来,系统发布以后,实际上是非常不稳定的,在修改代码的同时也会带来意想不到的风险。通过依赖倒置,可以减少类与类之间的耦合性,提高系统的稳定性,提高代码的可读性和可维护性,并且能够降低修改程序所造成的风险。这时候再看来代码,Tom的兴趣无论怎么暴涨,对于新的课程,只需要新建一个类,通过传参的方式告诉Tom,而不需要修改底层代码。根据构造器方式注入,在调用时,每次都要创建实例。大家要切记:以抽象为基准比以细节为基准搭建起来的架构要稳定得多,因此在拿到需求之后,要面向接口编程,先顶层再细节地设计代码结构。

2023-06-06 17:18:32 52

转载 面向对象设计原则-开闭原则

这下是不是比开始好了很多,并且他还很好的满足了单一职责原则(SRP),每个类只负责一种动物发出的声音,职责单一了, 但是我们发现如果我们想听到猫的叫声还是要修改Main方法中的调用代码, 还要编译部署,风险还是有点大,工作量还是有点大,那么我们能不能不修改代码只需要改个配置来达到修改Main方法调用的结果呢?那么势必会对软件的开发带来额外的风险和成本, 这是OCP原则要规范设计的一个主要原因,所有的设计原则都是对软件的开发,设计以及维护带来好处的,OCP也不例外。很简单达到了我们的设计目的。

2023-06-05 16:31:23 151

转载 面向对象原则——单一职责原则

上图中,通过接口将耦合的职责分开,但实际上ModemImplementation也应该被分离,但有时这些分离是困难甚至是难以实现的,这个时候应当保证所有的依赖关系与它无关。不仅仅是类,方法,函数,甚至是变量也需要做到职责的分离,例如:你不应当使用一个变量即代表正确返回值,又代表错误时的错误原因。单一职责听起来很简单,做起来却很难,因为我们总是自然而然地倾向与把职责结合在一起(习惯于面向过程的思维)。因为之前对于这些概念了解很少,在实际工作中遇到了很多的坑,借着内部交流的机会也重新学习了一下。

2023-06-05 15:58:53 59

转载 谈谈编程思想

今天就讲讲编程思想。编程思想是个宏大的主题,我不敢保证我能在短短的一两个小时里讲得全面而深入。推荐给大家一本好书『冒号课堂』,是国内为数不多的讲编程思想的经典之作。无奈这本书已经不再出版,只能在图书馆里一睹芳容(我几年前在国图和它偶遇)。各种软件思想虽然层出不穷,但其本质是降低系统复杂度,减少重复,减少代码的变更。掌握了这个大方向,理解各种编程思想就容易多了。下文建议在手机上横过来看。所涉及的代码大多是剪短清晰的python代码。我们一点点展开,说到哪算哪。

2023-06-05 14:33:45 292

转载 设计原则之里氏替换原则里氏替换原则的定义

里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supertype object

2023-05-31 17:47:14 59

原创 软件开发:面向对象设计的七大原则!

软件系统的构建是一个需要不断重构的过程,在这个过程中,模块的功能抽象,模块与模块间的关系,都不会从一开始就非常清晰明了,所以构建100%满足开闭原则的软件系统是相当困难的,这就是开闭原则的相对性。但在设计过程中,通过对模块功能的抽象(接口定义),模块之间的关系的抽象(通过接口调用),抽象与实现的分离(面向接口的程序设计)等,可以尽量接近满足开闭原则。根据开闭原则,在设计一个软件系统模块(类,方法)的时候,应该可以在不修改原有的模块(修改关闭)的基础上,能扩展其功能(扩展开放)。

2023-05-31 15:06:16 336

原创 Android 插桩之美,全面掌握

但是对于一些复杂情况,我们可能需要使用另外一种 Tree API 来完成对 Class 文件更直接的修改,因此这时候你要掌握一些必不可少的 Java 字节码知识,ASM 的特点是功能强大操作灵活,但是上手的难度也会比 AspectJ 更难,但是它能获得更好的性能,更适合大面积的插桩场景。可以操作“.class”的 Java 字节码,也可以操作“.dex”的 Dalvik 字节码,这取决于我们使用的插桩方法,相对于 Java 文件方式,字节码操作方式功能更加强大,应用场景也更广,但是它的使用复杂度更高。

2023-04-07 16:42:05 559

转载 kotlin之object,companion object,内部class和inner class之间的区别

最近开始使用kotlin写项目了,这几天一直对object,companion object,内部类和inner class搞得有点迷糊现在抽空,理清一下他们之间区别我定义了一个class A然后再class A内部分别定义了class B,object C,companion object D,inner class E四中不同的类每个类中包含一个字段和一个函数/** * Copyright:AndroidInterview * Author: liyang <br>

2021-09-30 16:21:39 1921

转载 Kotlin基础--静态方法、静态变量和常量

在Java中我们通常会使用静态变量和静态方法作为工具类。public class StaticUtils { public static String staticProperty; public static String getStaticProperty(){ return staticProperty; }}那如何在Kotlin中类名直接调用类的方法和变量呢?先来看看 object 关键字的作用。objectobject 和 c

2021-09-30 16:05:26 1273

转载 Kotlin之const val、val以及@JvmField修饰字段

我们先看看kotlin官方文档的解释 val 声明一个只读属性(也称作只读变量)或局部变量 如果被声明的变量是方法内部的局部变量,可以称为常量 如果被声明变量是顶级变量,称为只读变量 const 将属性标记为编译期常量(编译期常量是在程序编译期会替换成字面量) 位于顶层或者是 object 声明 或 companion object 的一个成员 以 String 或原生类型值初始化 没有自定义 getter 我们通过代码一一理解一下局部变量

2021-09-30 15:28:28 498

转载 计算不同色域下的RGB与YUV 以及 RGB与XYZ互转公式

写了个软件用来计算RGB与YUV互转公式, 输入色彩空间,输出两者互转公式,原理是根据r177协议后续我会把代码开源出来"BT2020 625 D65"Input:r=(0.708,0.292)g=(0.170,0.797)b=(0.131,0.046)w=(0.3127,0.3290)RGB2XYZ Matrix:0.6370, 0.1446, 0.16890.2627, 0.6780, 0.05930.0000, 0.0281, 1.0610XYZ2RGB Matrix:

2021-09-29 13:54:12 865

转载 计算不同色域下的RGB与YUV 以及 RGB与XYZ互转公式

关于写这篇文章的原因:  本人也是摸索了很长时间才弄懂其中的原理,里面涉及的知识点太多了,比如色彩空间,比如Gamma,里面还会涉及到很多的协议,比如BT601 BT709,BT2020,RP177等,一不小心就会写错,然后色彩可能就不准确了,可能偏白偏黑或者偏色自己也踩过很多坑,然后把这些经验写出来,防止大家踩重复的坑,如果文章有不够严谨的地方,请及时指出。不同的色彩空间的转换公式是不一样的  YUV与RGB互转的公式有很多,不同的色彩空间的转换公式是...

2021-09-29 13:53:23 2899

转载 Android OpenGL ES FrameBuffer离屏渲染

作用FrameBuffer Object,也称FBO,离屏渲染,可以摆脱屏幕的束缚,在后台做图像处理。理解FrameBuffer和Texture绑定,FrameBuffer犹如画板,而Texture犹如画纸,我们在上面画东西,画完后,我们可以拿Texture去绘制到其他地方上面。代码本章案例效果是在屏幕外绘制一张图片,并保存到本地。由于GL运行需要EGL环境,而GLSurfaceView已经帮我们构建了这样的一个环境,所以我们此次也是在GLSurfaceView上运行,但是不绘制到屏幕

2021-07-20 17:15:03 627 1

转载 Opencv——相机标定

相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。相机标定的输出:摄像机的内参、外参系数。标定流程1. 准备标定图片2. 对每一张标定图片,提取角点信息3. 对每一张标定图片,进一步提取亚像素角点信息4. 在棋盘标定图上绘制找到的内角点(...

2021-07-07 18:13:25 6693 1

转载 Android 接入 OpenCV库的三种方式

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 我们利用它来做一些图片的处理,能大大的优化内存的处理。下面我来说说接下OpenCV 的三种方式:一、接入OpenCV 的Java SDK 包,这样你可以...

2021-07-07 11:29:02 5033

转载 opencv 二值化图像详解 一文看懂各种二值化方法

本文介绍使用不同的阈值方法“二值化”图像固定阈值分割图解代码import cv2 as cv# 读入灰度图像img = cv.imread('baby_g.jpg', 0)# 阈值127分割图像ret, th = cv.threshold(img, 127, 255, cv.THRESH_BINARY)cv.imshow('thresh', th)cv.waitKey(0)cv.destroyAllWindows()函数讲解cv.threshold()用来

2021-07-02 17:52:25 2782

转载 ThreadLocal

在阅读Handler源码时发现了这么一个东西,本想直混在其他博客中一笔带过,但仔细想了下这个东西还是蛮重要的,于是开了这篇博客。ThreadLocalthreadlocal使用方法很简单static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>();sThreadLocal.set()sThreadLocal.get()threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,

2021-06-30 17:07:07 62

转载 Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

app程序入口中为主线程准备好了消息队列而根据Looper.loop()源码可知里面是一个死循环在遍历消息队列取消息而且并也没看见哪里有相关代码为这个死循环准备了一个新线程去运转,但是主线程却并不会因为Looper.loop()中的这个死循环卡死,为什么呢?...

2021-06-02 15:51:10 472

转载 Android系统服务 —— WMS与AMS

“可以毫不夸张的说,Android的framework层主要是由WMS、AMS还有View所构成,这三个模块穿插交互在整个framework中,掌握了它们之间的关系和每一个逻辑步骤,你对framework的了解至少有百分之五十”。这是《Android源码与设计模式》作者的原话,最近学习WMS和AMS相关知识,的确非常复杂,这篇文章是在学习之初的初步整理,虽然内容不够细致,但对其也算有个宏观的了解。难点是其中具体的代码逻辑,也都在相应框架下给出了参考链接,日后的工作就是详细学习其中的代码逻辑,让整个框架在脑海

2021-05-31 10:48:19 389

转载 关于Class对象、类加载机制、虚拟机运行时内存布局的全面解析和推测

简介:本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解、验证和Java虚拟机中内存布局的一些推测。本文重点讲述了如何理解Class对象以及Class对象的作用。欢迎探讨,如有错误敬请指正如需转载,请注明出处http://www.cnblogs.com/nullzx/1. 类加载机制当我们编写好一个“.java”文件,通过javac编译器编译后会形成一个“.class”文件。当我们运行该文件时,Java虚拟机就通过类加载器(类加载器本质就是一段程序)把“.cla.

2021-05-26 16:34:42 211

转载 浅析ListenableFuture使用场景及介绍示例

ListenableFuture是对原有Future的增强,可以用于监听Future任务的执行状况,是执行成功还是执行失败,并提供响应的接口用于对不同结果的处理。适用场景:1、如果一个主任务开始执行,然后需要执行各个小任务,并且需要等待返回结果,统一返回给前端,此时Future和ListenableFuture作用几乎差不多,都是通过get()方法阻塞等待每个任务执行完毕返回。2、 如果一个主任务开始执行,然后执行各个小任务,主任务不需要等待每个小任务执行完,不需要每个小任务的结果,此...

2021-04-13 17:24:41 699

转载 Java的concurrent用法详解

我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担.万幸的是,在JDK1.5出现之后,Su

2021-04-13 17:14:12 1792

原创 git 获取最后一次提交的的时间和commit id

获取最后一次commit的时间git show --pretty=format:"%ci %cr" | head -12021-04-07 15:06:17 +0800 2 hours ago获取最后一次提交的commit Idgit rev-parse HEAD31cab83b6cc7b844dc407291d47ac72f1d495690获取最后一次提交的short commit Idgit rev-parse --short HEAD31cab83b6...

2021-04-07 17:10:46 5784

转载 Camera acquireLatestImage() 与 acquireNextImage() 的区别

在Camera中获取图片的时候,会遇到acquireLatestImage() 与 acquireNextImage()选择,以下是对这两个方法的解读:acquireLatestImage()  从ImageReader的队列中获取最新的Image ,删除旧images 。 如果没有新图像可用,则返回null 。如果已经close了,那么将不会是最新的数据图像。对于大多情况可以使用acquireNextImage(),它更加适合处理实时数据.。在使用这个方法读取图片的时候,要注意maxImages不能小于

2021-02-23 13:39:10 946

转载 System.gc()与Runtime.gc()的区别

System.gc()与Runtime.gc()的区别(1) GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。(2) 对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过

2021-01-21 10:38:12 1003

转载 Runtime类中的freeMemory,totalMemory,maxMemory几个方法

最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误解,他们认为这个方法返回的是操作系统的剩余可用内存,其实

2021-01-21 10:35:09 213

转载 DNG格式与RAW格式的区别

什么是 RAW 格式?RAW的原意就是“未经加工”。可以理解为:RAW图像就是CMOS或者CCD图像感应器将捕捉到的光源信号转化为数字信号的原始数据。RAW文件是一种记录了数码相机传感器的原始信息,同时记录了由相机拍摄所产生的一些元数据(Metadata,如ISO的设置、快门速度、光圈值、白平衡等)的文件。RAW是未经处理、也未经压缩的格式,可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。什么是 DNG 格式?dng格式是数码相机原始数据的公共存档...

2020-12-11 16:09:50 15609

转载 camera参数介绍及3A编程算法

camera的参数通常有分辨率、清晰度、亮度、对比度、饱和度、焦距、视场角、光圈、增益 、曝光时间、白平衡等。分辨率:指图像水平和垂直的像素点数,通常有640*480、1024*768;清晰度:指影像上各细部影纹及其边界的清晰程度,单位DPI(Dot Per Inch)。亮度:指照射在景物或图像上光线的明暗程度。图像亮度增加时,就会显得耀眼或刺眼,亮度越小时,图像就会显得灰暗。对比度:指不同颜色之间的差别。对比度越大,不同颜色之间的反差越大,即所谓黑白分明,对比度过大,图像就会显得很刺眼

2020-09-24 15:01:36 1702

原创 adb 发送广播和启动activity,清除数据

1.启动acitivtyadb shell am start -a (action name) -c (category name) -es (package name)例如adb shell am start -a android.media.action.IMAGE_CAPTURE_SECURE -c android.intent.category.DEFAULT -es com.application.demo2.发送广播adb shell ambroadcast-...

2020-07-01 11:50:09 545

转载 Android录屏的三种方案

本文总结三种用于安卓录屏的解决方案:adb shell命令screenrecord MediaRecorder, MediaProjection MediaProjection , MediaCodec和MediaMuxerscreenrecord命令screenrecord是一个shell命令,支持Android4.4(API level 19)以上,录制的视频格式为mp4 ,存放到手机sd卡里,默认录制时间为180sadb shell screenrecord --size.

2020-06-10 15:30:02 2817

ROM修改工具l

官方固件修改工具

2016-05-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除