自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

禽兽先生不禽兽

不会唱歌的程序员,不是一个好厨师

  • 博客(111)
  • 资源 (30)
  • 问答 (1)
  • 收藏
  • 关注

原创 WebRTC 系列(四、多人通话,H5、Android、iOS)

实现完成后可以感觉到多人呼叫其实也没有多难,跟点对点 Demo 的流程大致一样,只是我们需要重新定义创建 PeerConnection 的时机,但是流程仍然是不变的。以及信令有些许不同,信令这就是业务层面的,自己按需来设计,上面我定义的消息格式只是一个最简单的实现。

2023-10-11 22:59:06 1694 2

原创 iOS 小技巧之单个 ViewController 旋转

在 Android 中,我们如果想实现某个 Activity 支持或者不支持横竖屏切换,只需要在清单文件 AndroidManifest.xml 中配置一下即可,但是 iOS 却不是配置的,要稍微麻烦一丢丢,需要我们在代码中配置。我们的应用大部分是大部分界面只需要竖屏显示,某些特殊界面如视频播放、拍照等界面才需要支持旋转,所以我们只需要封装成应用默认竖屏,支持单个 ViewController 设置支持旋转即可。

2023-06-02 16:25:40 657

原创 WebRTC 系列(三、点对点通话,H5、Android、iOS)

实现完成后可以感觉到点对点呼叫其实也没有多难,跟本地 Demo 的流程大致一样,只是我们需要将音视频通话的协商信息通过网络传输而已,所以我之前才说,明白 WebRTC 的流程比较重要,信令服务器反而在其次,毕竟真实场景中,信令服务器还会加入很多业务逻辑。下一次我们在信令服务器中加入一些逻辑,来实现多人通话。

2023-04-16 17:54:26 1556 6

原创 WebRTC 系列(二、本地通话,H5、Android、iOS)

踩过的坑,其实在代码中已经有注释了,大家留意一下。SurfaceViewRender 对象需要调用 init() 方法初始化,否则会黑屏。本地画面渲染控件就老老实实的用 RTCEAGLVideoView 就好,不要用 RTCCameraPreviewView,跟远端渲染控件保持一致,代码更整齐,使用其他视频源时还容易切换。

2023-04-11 22:55:06 2096

原创 WebRTC 系列(一、简介)

WebRTC,H5 Demo,Android Demo,iOS Demo,

2023-04-11 22:53:35 1746

原创 Java 修改 mp3 的标签(ID3V1 和 ID3V2)

修改 mp3 的标签(ID3V1 和 ID3V2)

2023-03-14 18:38:22 1510 2

原创 Java 基础之锁

上一篇博客中记录了线程的一些概念,那多线程既然能与人方便必然也会带来一些问题,这些问题主要与线程的三大特性有关,Java 的一些关键字和锁机制,可以帮助我们解决这些问题。

2022-12-04 21:40:28 485

原创 Java 基础之线程

线程是 cpu 可以调度的最小单元,多线程可以利用 cpu 轮询时间片的特点,在一个线程进入阻塞状态时,快速切换到其余线程执行其余操作,减少用户的等待响应时间。所以我们需要了解线程的基本概念,如何启动线程以及怎么去控制线程等。

2022-12-04 21:29:30 752

原创 Java 基础之对象的四种引用-强软弱虚

Java 中对象的引用分为四种,可以让我们更好的保证程序运行时足够的内存。

2022-11-29 16:41:44 989

原创 Jetpack 之 LiveData 实现事件总线

事件总线相信大家很多时候都会用到,那大家常用的也就是常青树 EventBus,以及 RxJava 流行起来的后起之秀 RxBus。它们的使用方式都差不多,思想也都是基于观察者模式,正好 LiveData 的核心思想也是观察者模式,因此我们完全可以使用 LiveData 来实现一个事件总线,如果项目使用 Jetpack 套件的话,可以减少库的依赖,也可以提高兼容性。一、基本实现二、粘性事件三、非活跃状态时收到事件...

2022-11-24 15:24:04 843

原创 Kotlin 之协程

协程的基本使用及浅析

2022-10-13 21:31:31 1173

原创 Jetpack 之 ViewModel

Jetpack 系列第三篇,这次回顾 ViewModel,ViewModel 作为 MVVM 架构中的 VM 层,具有自己的生命周期,且生命周期贯穿整个 Activity 或 Fragment,相较于之前 MVP的 Presenter,它的存活时间更长,所以作为界面数据的持有者和控制者会更有优势。

2022-10-11 15:59:44 597

原创 好记性不如烂笔头之 App widgets(二)

好记性不如烂笔头之 App widgets(一)_禽兽先生不禽兽的博客-CSDN博客之前记录了 AppWidgets 的基本用法,当我的小组件中需要展示集合的时候,发现使用集合的方式也跟普通的 UI 不一样,在此特意也记录一下。一、显示列表二、Item 响应点击事件...

2022-04-14 14:00:07 2442

原创 好记性不如烂笔头之 App widgets(一)

在 iOS 14 更新的时候,新增了一个功能——桌面小组件。当时我一看,妈呀,都说 Android 一直在模仿 iOS,但是这个小组件不一直都是 Android 有的功能吗,终于轮到被 iOS 模仿一回了。不过 App widgets 在 Android 上一直都不温不火,相信都会有部分的 Android Developer 不知道还有这个功能。不过不知道是不是由于 iOS 竞争的原因,在 Android 12 发布的新特性上,官方宣布对小组件进行一次升级,这也算是重视了一下这块功能。个人之前一直很喜欢

2022-04-13 11:49:05 2815 1

原创 Jetpack 之 LiveData

Jetpack 是 Google 官方力推的一个套件,它由许多库组成,这些库的出现意在帮助开发者简化业务逻辑之外的部分,包括开发架构优化、避免内存泄漏、性能优化等方面。之前我也零零散散用到过一些,现在准备做个记录,帮助自己梳理以及再次熟悉一下各组件。一、LiveData 是什么...

2022-02-14 15:51:41 1409

原创 Jetpack 之 Lifecycle

Jetpack 是 Google 官方力推的一个套件,它由许多库组成,这些库的出现意在帮助开发者简化业务逻辑之外的部分,包括开发架构优化、避免内存泄漏、性能优化等方面。之前我也零零散散用到过一些,现在准备做个记录,帮助自己梳理以及再次熟悉一下各组件。...

2022-02-09 10:43:55 1416

原创 Android 中图片占用内存分析

Android 在加载图片的时候一定会考虑到的一个点就是如何防止 OOM,那么一张图片在加载的时候到底会占用多少内存呢?会有哪些因素影响占用的内存呢?知道了这些,我们才能知道可以从哪些点去优化,从而避免 OOM。一、加载资源文件夹中...

2022-01-16 17:53:11 4100

原创 SpringBoot 入门(十一)——数据验证

前端和后端是不适合谈恋爱的,因为后端不信任前端。一般由前端页面传递过来的数据,即使前端做过验证,但是后端还是会在入库之前再验证一次,这时候前端妹子就会哭诉“我都验证过了,你为什么不信任我”。其实这跟信任没有关系,是为了让数据更严谨更真实,后端如果不验证的话,别人可以模拟前端发起不正确请求,那样就会造成很多垃圾数据了。SpringBoot 自带的hibernate-validator 组件可以...

2019-08-16 14:00:46 459

原创 SpringBoot 入门(十)——日志

在一个项目的调试和后期维护中,日志是很重要的一部分,在 JavaWeb 中最有名的日志组件当属 log4j 了,但是在后来 Logback 貌似更厉害,SpringBoot 默认集成了 Logback,所以要在 SpringBoot 中使用 Logback 并不需要添加特别的依赖,如果有个性化需求,我们只需要修改配置文件即可。一 打印日志当我们启动一个 SpringBoot 项目的时候看到...

2019-08-15 19:00:02 312

原创 SpringBoot 入门(九)——文件上传

文件上传是很常见的需求,下面就简单记录一下单个文件和多个文件的上传。一 上传单个文件我们创建一个新的 Controller 来写这个上传的方法:package com.qinshou.springbootdemo.controller;import org.springframework.web.bind.annotation.RequestMapping;import org...

2019-08-15 11:07:23 292

原创 SpringBoot 入门(八)——拦截器

拦截器可以帮助我们完成一些用户状态的统一检查、请求参数的统一检查、日志的记录等,在 SpringBoot 中可以通过继承HandlerInterceptor 来实现我们的拦截器,然后简单配置一下就可以使拦截器生效了。一 增加拦截器我们增加一个登录拦截器模拟对是否登录的状态统一处理:package com.qinshou.springbootdemo.interceptor;im...

2019-08-13 16:44:08 221

原创 SpringBoot 入门(七)——JavaMail 发送邮件

发送邮件,不论是给开发人员发送日志,还是给用户发送一些信息都有可能有这种需求,Sun 公司提供的 JavaMail 可以很方便的使用 Java 代码通过SMTP 服务器来发送邮件。一 添加依赖 <!-- JavaMail,发送邮件的插件 --> <dependency> <groupId>com....

2019-08-13 14:41:23 391

原创 SpringBoot 入门(四)——JPA

在上一篇博客SpringBoot 入门(三)——数据持久化中,已经明白了如何利用注解为实体类创建对应的表以及表与表之间的关系,那么有了表过后就要对表进行操作,SpringBoot 自带的 JPA 对于新手来说简直就是神器,只需要定义一个 Repository 接口,基本不用写什么代码,一些常规的 CRUD 操作就有了,下面就看看这是如何操作的。引入的依赖 JPA 部分跟上一篇博客一样,就不重复...

2019-07-31 18:52:46 1160

原创 SpringBoot 入门(三)——数据持久化

后端一定得与数据打交道,所以一定会做数据持久化,在 SpringBoot 中提供的 JPA 的 Api,可以很方便的实现数据的 CRUD。一 添加依赖在数据库部分,我使用的是 MySQL,所以在 pom 文件中需要添加如下依赖: <!-- MySQL 连接依赖 --> <dependency> <gr...

2019-07-31 10:36:09 3583

原创 SpringBoot 入门(一)——Hello World 初体验

使用 IDEA 来搭建一个 SpringBoot 的项目非常简单1 点击 Create New Project,选择 Spring Initializr2 点击 Next,输入包名3 点击 Next,选择需要的插件没有选择也没有关系,这些插件在后面也是可以在 pom 文件中添加的,这里为了快速运行只选择了 Spring Web Starter,需要数据库的插件的...

2019-07-25 14:41:28 361

原创 Android 自定义控件之 SwitchButton(仿 iOS 开关)

上图中的按钮是 iOS 中的自带的开关控件,Android 也有很多优秀的仿这个控件的开源库,自己也是模仿着实现了一下,下面记录一下实现过程。1 思路首先还是来进行分解动作,从静态样子来看,这个开关是一个圆角矩形的背景,然后中间有一个圆形的东西(姑且叫做按钮指示器)。点击该控件的时候会像 CheckBox 一样,会在开和关的状态之间切换,这个切换不是瞬间完成的,中间的指示器会有一...

2019-06-10 11:18:12 4814

原创 《Android 开发艺术探索》读书笔记(六)——Android 的 Drawable

Drawable 表示的是一种可以在 Canvas 上进行绘制的抽象的概念,它的种类很多,颜色和图片都可以是一个 Drawable。Drawable 是一个抽象类,它的子类很多。在看完原书后,在这里记录几种重要的 Drawable1 Drawable 简介Drawable 种类繁多,全部记下来可能会有些混乱,我只记录一些常用的。使用 Drawable 比起自定义 View 成本低很多,它可...

2019-02-14 16:26:58 294

原创 《Android 开发艺术探索》读书笔记(十)——Android 的消息机制

Handler 是 Android 消息机制的上层接口,所以我们在开发过程中只需要与 Handler 交互即可。Handler 的使用过程很简单,通过 Handler 可以将一个任务轻松地切换到 Handler 所在的线程中去执行。Handler 最常用的一个使用场景就是在子线程中执行耗时操作,然后通过 Handler 发送消息切换到主线程中更新 UI。Android 的消息机制主要是指 Ha...

2019-02-13 14:31:09 216

原创 Android 自定义控件之命运之轮(抽奖转盘)

1 思路首先肯定是要绘制扇形的,每一个奖品为一个扇形区分开,然后在扇形中得有当前奖品的说明,最后让这个轮盘转起来就行了。说起来很简单,但是在绘制的时候,特别是绘制文字的时候还有有一些细节需要注意的,也不是难点,只是要理清楚那些地方应该怎么去画,怎么获取需要绘制的坐标。 2 绘制扇形首先是一些初始化工作:public class WheelOfFortuneView exten...

2019-01-11 13:20:12 1267

原创 《Android 开发艺术探索》读书笔记(二)——IPC 机制

Android 多进程开发我在平时开发中还没有遇到,但不代表不重要,仍需要了解一下基本概念,Android 的序列化机制和 Binder 是。1 Android IPC 简介IPC 是 Inter Process Communication 的缩写,意为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程。进程一般指一个程序或一个应用,一个进程可以包含多个线程,线程是 CPU 调度的...

2019-01-06 16:21:02 278

原创 Flutter 基础组件之 Row、Column

1 RowRow 是一个可以沿水平方向展示它的子组件的组件。它还可以灵活布局,如果要让某个子组件填充满剩余剩余空间,请使用 Expanded 组件包裹该组件即可。Row 组件是不可以滚动的,所以在 Row 组件中一般不会放置过多子组件,如果需要滚动的话应该考虑使用 ListView。如果需要垂直展示,应该考虑 Column 组件。如果只有一个子组件的话,应该考虑使用使用 Ali...

2018-12-28 20:58:22 25208

原创 Flutter 基础组件之 Stack

如果说 Row 和 Column 相当于 Android 的 LinearLayout 的话,那么 Stack 就有点像 Android 中 FrameLayout,它可以使子组件堆叠起来,但是它比 FrameLayout 要强大,它可以控制子组件的位置,使用起来也是很简单的。 1 构造方法Stack({Key key, AlignmentGeometry alignment: Ali...

2018-12-28 20:41:34 14014 1

原创 Flutter 基础组件之 GridView

GridView 虽不及 ListView 用得多,但是 ListView 如果是纵向滚动的,那么在一行上一般算作一个 Item,如果是横向滚动,那么一在一列上一般算作一个 Item,如果需要一行展示多个 Item 但是又需要纵向滚动的话,就需要 GridView 了,在一些特定的情景,如展示图片的时候效果比 ListView 更棒,所以这也是个很重要的组件。由于 GridView 很多属性跟...

2018-12-26 22:22:38 3047

原创 Flutter 基础组件之 ListView

跟 Android 中的 ListView 差不多,就是一个可滚动的列表,这种组件在开发中是很常用的。 1 构造方法ListView({Key key, Axis scrollDirection: Axis.vertical, bool reverse: false, ScrollController controller, bool primary, ScrollPhysics ph...

2018-12-25 20:59:25 4163

原创 Flutter 基础组件之 Image

正所谓一图胜千言,一张意思清晰明了的图片胜过 N 句废话,所以图片的展示是相当重要的,Image 是 Flutter 用于展示图片的控件,它可以加载项目内的图片、手机存储中的图片以及直接从网络加载图片,不用再集成图片加载框架就可以加载网络图片这就很方便了。1 构造方法Image({Key key, @required ImageProvider image, String semantic...

2018-12-20 14:12:04 3175

原创 Flutter 基础组件之 Container

官方简介中,说 Container 组件是一个方便绘制、定位和调整子组件大小的组件。首先 Container 会在 child 子组件周围填充 padding(包括 decoration 中存在的 border),然后会根据约束 constraints 来决定子组件的宽高,最后 Container 会根据 margin 来添加周围的空白空间。在绘制过程中,Container 先会应用矩阵变...

2018-12-18 21:43:07 5843

原创 Flutter 基础组件之 Text

终于安装好了 Flutter 的环境,既然入了坑,就一点一点学吧,Flutter 可以说一切皆组件吧,所以要熟练掌握各个基础组件的 API,然后才能在面对复杂需求的时候才能得心应手的将各个组件组合起来,首先文本展示可以说是最基本的需求,所以先看看 Text 组件的使用。1 构造方法Text(String data, { Key key, TextStyle style, TextAlign...

2018-12-18 09:41:16 8860

原创 有趣的算法题之如何实现大整数相加

原文:微信公众号:程序员小灰——如何实现大整数相加?(修订版)1 题目两个很大很大的整数,如何求出它们的和?2 思路我们平时在程序中求和就是直接定义两个 int (-2 的 31 次方到 2 的 31 次方 -1)类型的数,稍大一点的数用 long (-2 的 63 次方到 2 的 63 次方 -1)类型,基本都能满足平时的需求,那如果需要求两个超过 long 范围的整数的和,那么...

2018-12-05 20:07:08 460

原创 有趣的算法题之移除 k 位数字后使剩下的数字最小

原文:微信公众号:程序员小灰——删去k个数字后的最小值1 题目给定一个整数,从该整数中去掉 k 个数字,使剩下的数字组成的新整数尽可能小,那么应该选择去掉的数字。2 思路感觉这是个挺有意思的问题,所以当时认真的读了读也认真的想了想,真是不想不知道,一想才发现算法真的分优劣。首先这个题目是什么意思呢?一个数字移除 1 位后肯定会变小,问题是变小多少,最简单直接的方法是移除掉最后一位,...

2018-11-27 20:52:13 3039 1

原创 《Android 开发艺术探索》读书笔记(一)——Activity 的生命周期和启动模式

Activity 作为 Android 四大组件之首,作为和用户交互的界面,在开发中使用得可谓极其频繁,所以弄清楚 Activity 的生命周期和启动方式是非常重要的,要牢记。1 Activity 的生命周期全面分析1.1 典型情况下的生命周期分析onCreate():该方法调用时表示 Activity 被创建,可以在该方法中做一些初始化工作,如调用 setContentView() ...

2018-11-05 21:59:02 387

Dimens 文件生成器

dimens 文件生成器,里面有 1px 的基准文件,也有几个我按照 1280x720 为基准分辨率生成的几个 dimens 文件,如果基准分辨率为 1280x720 的同学可以直接用。

2019-01-18

dimens文件生成器

dimens 文件生成器,可以帮助生成不同分辨率的 dimens 文件,再也不用自己一个个手写了,可用于 Android 项目.

2017-09-02

桥接模式Demo

桥接模式Demo

2017-06-09

外观模式Demo

外观模式Demo

2017-06-09

享元模式Demo

享元模式Demo

2017-06-08

装饰者模式Demo

装饰者模式Demo

2017-06-06

适配器模式Demo

适配器模式Demo

2017-06-05

组合模式Demo

组合模式Demo

2017-05-31

代理模式Demo

代理模式Demo

2017-05-31

View自由拖动Demo

View自由拖动Demo

2017-05-25

中介者模式Demo

中介者模式Demo

2017-05-25

访问者模式Demo

访问者模式Demo

2017-05-24

模板方法模式Demo

模板方法模式Demo

2017-05-23

迭代器模式Demo

迭代器模式Demo

2017-05-23

备忘录模式Demo

备忘录模式Demo

2017-05-22

观察者模式Demo

观察者模式Demo

2017-05-22

AnimationDemo

AnimationDemo 安卓动画

2017-05-19

抽象工厂模式Demo

抽象工厂模式Demo

2017-05-18

命令模式Demo

命令模式Demo

2017-05-16

事件传递机制Demo

事件传递机制Demo

2017-05-15

责任链模式Demo

责任链模式Demo

2017-05-15

下拉刷新和上拉加载更多的RecyclerView

下拉刷新和上拉加载更多的RecyclerView

2017-05-14

状态模式Demo

状态模式Demo

2017-05-12

策略模式Demo

策略模式Demo

2017-05-11

工厂方法模式Demo

工厂方法模式Demo

2017-05-08

原型模式Demo

原型模式Demo

2017-05-05

Builder模式Demo

Builder模式Demo

2017-05-05

单例模式的几种实现方式

单例模式的几种实现方式Demo

2017-05-05

单例模式的几种实现方式demo

单例模式的几种实现方式demo

2017-05-05

MediaCodec解码H264视频数据

利用MediaCodec解码H264原始视频数据,通过socket实时传输

2016-11-21

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

TA关注的人

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