自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 简单天气--Kotlin+JetPack+协程+MVVM架构

????????????简单天气简单天气——遵循 Material Design 风格天气APP,使用彩云天气api,基于MVVM模式结合JetPack组件库:LiveData、ViewModel、Lifecycle、Navigation、Room组件以及协程+Retrofit网络请求,使用Kotlin语言开发的一款天气app。项目地址Weather(github) ( ???? ???? ???? 如果觉得该项目对你有帮助留个star再走叭(๑• . •๑))下载体验当前版本(1.0)项目展示

2020-06-23 13:37:30 4445

原创 Camera2 API -- OutputConfiguration

什么是OutputConfigurationHAL configurate stream 只需要下述三者即可sizeformatusageOutputConfiguration用于描述一个输出流的配置信息,一个Outputconfiguration在HAL对应一条Stream, 它的具体功能如下:设置Deferred Surface (针对SurfaceView not ready的场景)设置Surface Group设置Physical Camera ID设置Surface S

2021-09-06 00:00:45 852

原创 音视频同步方法

音视频同步方法音频向视频同步视频向音频同步统一向外部时钟同步音频向视频同步视频保持一定的刷新帧率,填充音频数据时会和当前渲染的视频帧的时间戳进行比较,如果差值不在阈值范围内则进行对齐操作如果音频时间戳小于视频的时间戳,则进行跳帧操作(加快速度或者丢弃部分音频)如果音频时间戳大于视频的时间戳,则进行等待(补空白帧)优点:画面流畅缺点:插帧或者丢帧用户是可以感受到的视频向音频同步因为任何平台播放音频的引擎都可以保证播放的音频时间长度和实际音频所代表的时间长度一致

2021-03-02 00:08:04 1087

原创 OpenGL ES实践

OpenGL 渲染管线(OpenGL 渲染图像的流程)几何图元:包括点、直线、三角形、均是铜鼓哦顶点vertex来指定的模型:根据几何图元创建的物体渲染:计算机根据模型创建图像的过程渲染结束后:在内存中,像素点组成一个大的一维数组,每4个Byte表示一个像素点的RGBA数据,在显卡中,这些像素点可以组成帧缓冲区(保存了图形硬件为了控制屏幕上所有像素的颜色和强度所需要的全部信息)渲染管线阶段阶段一:指定几何对象GL_POINTS:以点的形式进行绘制GL_LINES:以线的形式进行绘

2021-02-16 23:01:10 301

原创 MediaRecorder生命周期

MediaRecorder状态图MediaRecorder是一个状态机,通过调用一系列方法进行状态之间的转换状态说明Initial:通过MediaRecorder实例化类对象时处于初始化状态,此时MediaRecorder会占用系统资源,所有状态会通过reset()方法返回到该状态Initialized:使用setAudioSource()或者时setVideoSource()方法后进入音频或者视频录制,并可以指定音视频的文件属性,设置完成之后进入DataSourceConfigured状态

2021-02-16 21:46:39 372

原创 MediaCodec 使用(二)-- YUV打包成MP4

图像数据格式简介YUV格式:planar:先连续存储所有像素点的Y,紧接着存储所有像素点的U,再存储所有像素点的V,将Y、U、V的三个分量分别存放在不同的矩阵中packed:将Y、U、V值存储成Macro Pixels数组,和RGB的存放方式类似YUV存储:主流的采样方式主要有:YUV444,YUV422,YUV420,只有正确的还原每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来YUV 4:4:4表示完全取样,每一个Y对应一组UV分量

2021-01-24 21:05:39 798 1

原创 AudioManager使用

作用官方提供的音量和铃声管理类API方法意义adjustVolume控制手机音量,调大或者调小一个单位,根据第一个参数进行判断 AudioManager.ADJUST_LOWER,可调小一个单位; AudioManager.ADJUST_RAISE,可调大一个单位setStreamVolume直接设置音量大小getStreamVolume获得手机的当前音量,最大值为7,最小值为0,当设置为0的时候,会自动调整为震动模式setStreamMute将手机某

2021-01-21 00:18:44 428 1

原创 MediaCodec原理及使用

使用MediaCodec目的MediaCodec是Android底层多媒体框架的一部分,通常与MediaExtractor、MediaMuxer、AudioTrack结合使用,可以编码H264、H265、AAC、3gp等常见的音视频格式MediaCodec工作原理是处理输入数据以产生输出数据MediaCodec工作流程MediaCodec的数据流分为input和output流,并通过异步的方式处理两路数据流,直到手动释放output缓冲区,MediaCodec才将数据处理完毕input流:

2021-01-19 01:12:37 542

原创 Android 音视频变速原理

视频倍速播放假设视频帧率是24fps, 则播放器必须在1000/24 = 41.66ms 内 解封装 + 解码 + 渲染完一帧,一般只计算出把YUV数据从渲染队列中取出到渲染结束的时间(RenderTime),超过了这个时间就会出现播放卡顿,画面延迟渲染是花不到41.66ms的,假设渲染时间是10ms,那么我们就要休眠 41.66-10 = 31.66ms ,再继续从渲染队列拿帧数据。倍速播放就是24fps换成48fps,即1000ms内播放出48帧,即RenderTime = 41

2021-01-16 23:00:00 1439

原创 Jetpack -- DataStore

DataStore简介Jetpack DataStore 是用来替代SharedPreferences的一种数据存储的解决方案,可以使用Kotlin协程和Flow异步,体现数据处理的一致性。注意:DataStrore适用于key-value型的数据存储,Room适用于大型或者复杂的数据存储DataStore使用DataStore : key-value存储和访问数据,不保证类型安全Proto DataStore : 使用Protocol-Buffers存储键值对或类型化对象,保证类型

2021-01-01 20:40:06 326 2

原创 获取Bitmap中主色调的取色器

颜色空间RGB色彩空间RGB颜色空间以R(红)、G(绿)、B(蓝)三种基本色为基础,进行不同程度的叠加,呈现不同的颜色–>三原色模式RGB颜色空间 可以使用一个立方体来表示颜色,黑、蓝、绿、青、红、紫、黄、白8种常见颜色分别位居立方体的8个顶点,通常将黑色置于三维直角坐标系的原点,绿蓝红分别分别置于xyz轴上,个参数的取值范围是:R : 0 - 255, G : 0 - 255, B : 0 - 255其中(0,0,0) ->(255,255,255)的提对角线表示从黑色到白色的灰度值

2020-12-19 22:57:18 1078 2

原创 View.post() 分析

view.post() 使用目的获取View的属性子线程处理耗时任务,并抛到主线程执行view.post()分析首先在onCreate()方法中使用post()方法override fun onCreate(savedInstanceState: Bundle?) { Log.d(TAG, "onCreate") super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

2020-11-01 21:32:56 642

原创 Android 使用Navigation 跳转页面时发生crash

crash问题日志Fatal Exception: java.lang.IllegalArgumentExceptionnavigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController解决// 在执行跳转语句之前使用下面方法对当前fragment 进行判断if (Navigation.findNavController(it).currentDestination

2020-10-25 23:05:15 1264

原创 Gradle 命令操作

常规操作 – 使用帮助Gradle Wrapper帮助命令行./gradlew -?./gradlew -h./gradlew -help查看所有可执行的Tasks ./gradlew tasks // 会以分组的形式列出所有的Task列表Gradle Help任务./gradlew help --task //显示tasks任务的帮助信息:类型、分组信息、可使用的参数强制刷新依赖./gradlew --refresh-dependencies assemble多任务调用

2020-09-06 23:24:22 271

原创 Gradle 构建脚本基础

Setting 文件Setting文件大多是为了配置子工程,一个根工程可以包含多个Module也就是子工程,子工程只有在Setting文件里配置类Gradl才会识别,才会在构建的时候被包含进去Build文件每个Project都会有一个Build文件,该文件是project构建的入口,可以在此对project进行配置,配置版本,依赖库等等Project和Tasks一个Project又包含多个Task,即多中操作,比如打包一个jar包,复制一份文件,编译代码等等创建任务的两种方式如下 (两

2020-09-03 00:16:21 126

原创 View 生命周期分析

View 生命周期View生命周期函数意义onFinishInflateView中所有的子元素均被映射成xml时触发onAttachedToWindow该方法在当前View被附到一个Window上时被调用onMeasureView确定所有子元素的大小onSizeChanged当View大小发生变化时触发onLayout当View分配所有子元素的位置和大小时触发onDrawView渲染内容细节onWindowFocusChanged当窗口

2020-08-02 22:55:41 339

原创 Jetpack -- App StartUp

定义App StartUp是Google Jetpack新增的一个组件,该组件在App启动时提供了一个直接、高效的方式来初始化组件,同时开发者可以使用App Startup这个组件来简化启动顺序并且显示地设置初始化顺序,通过App Startup这个组件提供了一个ContentProvider来运行所有依赖项的初始化,避免第三方库单独通过ContentProvider进行初始化,从而提高了应用的启动速度,使用效果如下图所示:图片来自 Husayn Hakeem由上面两个图对比可见,App

2020-07-12 22:59:43 659

原创 Jetpack组件结合MVVM架构的Kotlin版本WanAndroid来啦

WanAndroid-Kotlin 项目根据鸿神提供的WanAndroid开放Api来制作的WanAndroidApp, 基本实现了所有的功能,使用kotlin语言开发,基于Material Design+AndroidX + MVVM + ViewModel + LiveData + RxJava + Retrofit等优秀的开源框架,上次开发的 WanAndroidMvvm版本不是很完善,所...

2020-06-06 16:05:29 3905

原创 Kotlin Coroutine + retrofit + Okhttp3 网络请求实战篇

背景最近看到很多项目都将RxJava + Retrofit 替换成了 Coroutine + retrofit,首先Coroutine + retrofit学习成本相对于Rxjava来说较低,而且最重要的一点是Kotlin的下称实现线程切换的代码更加精简,逻辑相对更加清晰一些注意:没有学习过DSL 以及 协程 的可以阅读以下两篇Kotlin DSLKotlin 协程封装RxJava ...

2020-06-06 16:05:20 1385

原创 移动端软件架构设计

什么是架构软件架构是一张开发蓝图,是一个整体的规划,即软件工程的指导方针,软件开发的主要目标如图所示:优秀的软件架构提供迅速响应,扩展灵活;还要具备美观性,代码要简洁,易于阅读、维护、能使维护者对功能产生更清晰的认识,能够快速地处理变化软件架构设计的关注点软件架构设计应该关注 – 变化软件架构设计的本质和目的本质降低软件熵目的:降低因需求增加导致的软件熵增加从而导致的成本增加架构设计模式原则架构的细节需要运用一些经典的设计模式原则,比较常用的原则之一为SOLID原则

2020-05-18 19:11:35 1740

原创 ViewModel源码分析

ViewModel创建ViewModelProvider(this).get(CustomModel::class.java)点进源码查看ViewModelProvider实现// 实际上调用的方法是ViewModelProvider(activity.getViewModelStore, factory)public ViewModelProvider(@NonNull ViewModelStoreOwner owner) { this(owner.getViewModelStore

2020-05-16 21:12:35 565

原创 Jetpack -- WorkManager

简介WorkManager适合处理一些定时执行的任务,它可以根据操作系统的版本自动选择底层是使用AlarmManager实现还是JobScheduler,降低我们的使用成本,同时他还支持周期性任务、链式任务处理等功能。WorkManager可以在应用退出或者手机重启的情况下,还能够执行之前注册的任务主要功能添加网络可用性或充电状态等工作约束调度一次性或周期性异步任务监控和管理计划...

2020-05-03 19:58:56 625

原创 Flutter 动画封装

AnimatedWidgetAnimatedWidget对addListener和setState进行了封装,示例如下import 'package:flutter/material.dart';class AnimatedLogo extends AnimatedWidget {  // listenable类似之前写的addListener,此时可以监听a...

2020-04-28 15:24:14 604

原创 ViewModelScope 简介与使用

简介当在ViewModel中引入协程,如果直接使用CoroutineScope,那么需要在onCleared()方法中取消协程,如果忘记取消协程那么会导致出现内存泄漏等各种问题,此时需要使用ViewModel扩展属性viewModelScope来实现协程作用域。viewModelScope源码分析val ViewModel.viewModelScope: CoroutineScope&...

2020-04-26 20:04:35 9851

原创 Flutter实现层叠滑动效果

实现效果项目地址滑动效果使用PageView滑动来控制当前显示的位置Stack( children: <Widget>[ // 两者堆叠在一起。通过PageView滑动的Controller来控制当前显示的page CardScrollWidget(currentPage), Positioned.fill( child: Page...

2020-04-26 18:17:18 4288 3

原创 Jetpack -- Navigation

简介NavHost: 是一个存放页面的容器,同时也是一个控制器(Activity /Fragment)NavController:切换页面,需要定制切换路线NavGraph:利用图形化的方式定制切换路线Navigation组件配合ViewModel实现数据共享1.首先创建一个Activity, 两个Fragment以及一个ViewModelfragment的xml如下...

2020-04-25 23:05:27 169

原创 Flutter 实现自定义侧滑--side menu

实现效果项目源码对flutter中的动画不了解的可以看这篇 Flutter 动画入门实现首先将界面拆解成两部分 menu 和 homePage 使用Stack组件将两者包裹起来(类似使用FrameLayout)return Scaffold( backgroundColor: backgroundColor, body: Stack( children: <W...

2020-04-22 15:25:04 1141

原创 Flutter 动画入门

简介Flutter动画核心类:Animation类,它可以判断当前动画的状态(开始,停止,移动,前进,反向),它是由AnimationController管理的,并通过Listeners和StatusListeners管理动画状态的所发生的变化,我们先对动画有了大体的了解,下面我们对其中提到的类进行逐一学习这次主要学习flutter动画中的 平移,缩放,旋转,透明度,插值器,是为之后的自定义...

2020-04-21 21:59:57 521

原创 Flutter实现的精致的聊天界面

偶然实现聊天UI的视频教程链接项目源码链接实现效果如下:

2020-04-20 19:39:38 1240

原创 Kotlin--小抄(十一)协程

简介协程是一种并发设计模式,可以使用协程来简化异步代码为什么需要协程顺序执行的代码是同步的,即下面的工作要执行必须等待之前的工作执行完毕,每一行代码都会阻塞当前的线程,显然主线程阻塞会导致明显的卡顿 ,界面呈现速度缓慢或界面冻结,对触摸事件的响应速度很慢,所以我们需要将耗时的任务放到主线程之外运行多线程执行代码,可以在不同的线程上执行顺序的代码,然后通过异步函数完成线程之间的切换工作...

2020-04-18 20:43:21 449

原创 Kotlin-小抄(十)Kotlin创建DSL

DSL简介DSL (领域特定语言)指的是专注于特定问题领域的计算机语言,即对一个特定问题的方案模型更高层次的抽象表达,使之更加简单易懂。DSL只是问题解决方案模型的外部封装,这个模型可能是一个API库,也可能是一个完整的框架等在Android中比较典型的例子使用DSL框架Anko来替代传统的xml(类似Flutter创建布局的方式)如下代码块:UI {  &nbs...

2020-04-18 17:00:59 317

原创 Flutter 多语言国际化配置 -- 使用Intl插件

安装插件Android Studio -> File -> Setting -> Plugins -> 搜索Flutter Intl配置项目首先在项目pubspec.yaml中添加如下语句并执行 package getdev_dependencies:... flutter_localizations: sdk: flutter在菜单栏的To...

2020-04-13 20:45:18 5364

原创 Hey Flutter: 体验较佳的WanAndroid Flutter客户端

WanAndroid-Flutter 项目????????????项目基于 Flutter 移动应用框架,采用 Dart 语言编写,继续打造新的WanAndroid,重新打磨之前的flutter版本的WanAndroid, 持续更新…项目地址WanAndroid(github) (留下个star再走叭)下载体验当前版本(1.0)项目展示项目功能待完成功能夜间模式切换语言...

2020-04-09 14:28:54 1040

原创 Jetpack -- Room使用简介

简介Room是对 Android中SqlLite数据库的一个抽象,实现了流畅的访问SqlLite数据库基本使用创建Entity实体类@Entitypublic class Word {    // 声明主键    @PrimaryKey(autoGenerate = true) &nb...

2020-03-26 14:57:38 322

原创 Jetpack -- LifeCycles

简介android.arch.lifecycle提供的类和接口可以感知activity和fragment的生命周期,可以使得组件自己在activty和fragment的生命周期中的某个状态完成一些操作这样每个组件都可以实现良好的封装,提高了可移植性使用自定义一个Chronometer,实现在activity的onPause时停止计数,onResume时开始接着计数class M...

2020-03-25 17:50:48 393

原创 Jetpack-- DataBinding结合ViewModel和LiveData使用

简介DataBinding 用来将数据绑定在UI页面上,实现试图和数据的双向绑定,主要是体现数据驱动开发,具体含义是在得到数据后,通过框架在视图树中找到与数据绑定的视图使用在build.gradle中添加android {        ....    defaultConfig { &...

2020-03-25 13:58:38 1521 3

原创 Jetpack -- ViewModel状态保存

简介一个Activity对应一个ViewModel,当Activity进入后台,屏幕翻转,语言切换等Activity会重建但是ViewModel还存活着,所以数据并不会丢失,当进程被系统杀死,Activity被回收,那么ViewModel中的数据就会丢失,这时候就需要ViewModelStore使用class MyViewModel(handle: SavedStateHan...

2020-03-25 13:57:01 558 2

原创 Jetpack -- LiveData使用与源码流程分析

简介LiveData是给定生命周期的一个数据持有类LiveData配合ViewModel可以将Controller中的逻辑更加简单,在数据进行变动的时候可以通过注入观察者来监听数据的变化LiveData可以感知实现LifecycleOwner组件的生命周期,只有在上述组件的激活状态 (STARTED, RESUMED) 才会通知观察者数据更新当组件的生命周期到了DESTROYED状态的时...

2020-03-24 15:24:26 493

原创 Jetpack -- ViewModel使用与分析

简介使用Android AAC组件构建自己的应用之后,为了不让自己停留在仅仅是使用的层面,所以从头开始总结一边AAC组件的使用以及注意的要点ViewModel旨在以注重生命周期的方式存储和管理界面相关的数据, ViewModel 类让数据可在发生屏幕旋转等配置更改后继续存在作用:将View中的数据模块进行单独的管理,使得Activity和Fragment更加简单,只需要专注于界面本身...

2020-03-23 19:12:07 324

原创 Flutter--线程模型

Flutter线程模型isolate是通过Flutter Engine层面的一个线程来实现的,Flutter Engine线程的创建和管理是由embedder负责的,下面是Flutter Engine的运行架构Platform Task Runner它是Flutter Engine的主Task Runner,既可以处理与Engine的交互也可以处理来自native平台的交互,...

2020-03-21 22:25:54 1227

AndroidKiller_v1.3.1.rar

AndroidKiller可视化、全自动的反编译、编译、签名;支持批量编译APK。

2019-06-07

空空如也

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

TA关注的人

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