自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RecyclerView自定义行个数

在某些需求下,会出现在一个ReyclerView列表中,各行的元素个数不相等,此时可以使用两种方式解决问题。使用StaggeredGridLayoutManager和StaggeredGridLayoutManager.LayoutParams中的setFullSpan方法,可以设置某个元素单独占据一行,其他元素照常排列。但是这种方式缺点只能应对一个元素占据一行的情景。比如,常规是一行三个it...

2019-05-09 21:34:08 7661

原创 设计模式——桥接模式

定义桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。介绍意图:将抽象部分与实现部分分离,使它们都可以独立的变化。主要解决:在有多种可能会变化的情况下,用继...

2018-07-24 11:53:12 343

原创 精致自绘渐变进度条-Path/Paint.setXfermode

日常产品需求开发中进度条自绘是经常需要的,如下:思路1,如图1,绘制左端半圆部分通过canvas.drawArc即可2,如图2,绘制左半圆和中间矩形部分通过canvas.drawArc和canvas.drawRect即可3,如图3和图4,绘制右半圆部分绘制左半圆->绘制矩形->绘制右半圆部分(通过Path取得BEFC封闭区域部分如图4,或...

2018-05-30 09:54:20 674

原创 Java(Android)注解

概述注解(Annotation)在JDK1.5之后增加的一个新特性,注解的引入意义很大,有很多非常有名的框架,比如Hibernate、Spring,Android新推出的AAC/Room等框架中都大量使用注解。注解作为程序的元数据嵌入到程序。注解可以被解析工具或编译工具解析,此处注意注解不同于注释(comment)。当一个接口直接继承java.lang.annotation.Annotat...

2018-05-18 11:59:08 297

原创 初探RxJava2Android

源码RxJava: https://github.com/ReactiveX/RxJavaRxAndroid: https://github.com/ReactiveX/RxAndroid配置 compile 'io.reactivex.rxjava2:rxjava:2.1.12' compile 'io.reactivex.rxjava2:rxandro...

2018-05-18 11:57:01 233

原创 Android AAC架构

定义Android Architecture Components,简称 AAC,一个处理UI的生命周期与数据的持久化的架构AAC 的核心Lifecycle, LiveData, ViewModel 以及 Room通过它可以非常优雅的让数据与界面交互并做一些持久化的东西高度解耦自动管理生命周期而且不用担心内存泄漏的问题.架构图如下:LifeCycle...

2018-05-18 11:39:13 8785 2

原创 ConstrainLayout初探

概述ConstraintLayout, 即约束布局, 在2016年由Google I/O推出. 从支持力度而言, 将成为主流布局样式, 完全代替其他布局, 减少布局的层级, 优化渲染性能. 在新版Android Studio中, ConstraintLayout已替代RelativeLayout, 成为HelloWorld项目的默认布局. ConstraintLayout作为非绑定(Unbun...

2018-05-18 11:38:05 942

原创 Java8-Lambda表达式(函数式编程)

引言课本上说编程有两种模式,面向过程的编程以及面向对象的编程,其实在面向对象编程之前还出现了面向函数的编程(函数式编程),以前一直被忽略、不被重视,现在从学术界已经走向了商业界,对函数编程语言的支持目前有Scala、Erlang、F#、Python、Php、Java、Javascript等,有人说他将会是编程语言中的下一个主流…函数式接口函数式接口(Functional Interface)是Jav

2018-02-27 19:51:16 337

原创 设计模式——享元模式

享元模式模式定义享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。模式结构享元模式包含如下角色:Flyweight: 抽象享元类ConcreteFly...

2018-02-08 16:07:58 265

原创 设计模式——单例模式

单例模式单例模式的几种实现方式单例模式的实现有多种方式,如下所示:1、懒汉式,线程不安全是否 Lazy 初始化:是是否多线程安全:否实现难度:易描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。 这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。代码实例:public cla

2018-02-06 14:45:15 235

原创 设计模式——策略模式

策略模式定义策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。模式的结构封装类(Context):也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类

2018-02-06 14:41:55 270

原创 设计模式——状态模式

状态模式定义状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。模式结构状态模式包含如下角色:Context: 环境类State: 抽象状态类ConcreteState: 具体状态类模式分析状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不

2018-02-05 20:11:53 410

原创 六大原则(4)——接口隔离原则

接口隔离原则定义客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。解决方案:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。未遵循接口隔离的如下:遵循接口隔离原则:举例互联网公司

2018-02-01 16:11:09 473

原创 六大原则(6)——开闭原则

开闭原则概述定义一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。问题由来在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。解决方案当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。核心用抽象构建框架,用实现扩展细节。因为抽象灵活性

2018-02-01 15:32:40 353

原创 六大原则(5)——迪米特法则

迪米特法则概述定义一个对象应该对其他对象保持最少的了解。问题由来类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。解决方案尽量降低类与类之间的耦合。迪米特法则又叫最少知道原则。通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。迪米特法则还

2018-02-01 15:32:06 605

原创 六大原则(3)——依赖倒置原则

依赖倒置原则概述定义高层模块(即客户端/调用者)不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 简而言之:面向接口编程问题由来类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。解决方案将类A修改为依赖接口I

2018-02-01 15:30:45 381

原创 六大原则(2)——里氏替换原则

里氏替换原则概述定义严格的定义:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。 通俗的定义:所有引用基类的地方必须能透明地使用其子类的对象。更通俗的定义:子类可以扩展父类的功能,但不能改变父类原有的功能(一方面指不改变父类原功能的逻辑,另外一方面也指不改变该方法的含义)。对于基

2018-02-01 15:29:53 533

原创 六大原则(1)——单一职责原则

单一职责定义不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 问题由来类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方案遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生

2018-02-01 15:28:21 532

原创 设计模式——组合模式

组合模式定义:组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以使用一致的方法操作单个对象和组合对象。 UML图:(1)Component:抽象根节点,为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子节点。可在递归结构中定义一个接口,用于访问一个父节点,并在合适

2018-01-29 20:51:38 419

原创 设计模式——迭代器模式

迭代器模式定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。 Java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式题外话学习这个设计模式之后才知道以前写了很多很“辣鸡”的代码,可能有些小伙伴也这样写过代码。下面我就说说我刚提到的“超辣鸡”的代码的一个例子。希望自己,也希望每一个小伙伴都不要再犯这种错误。需求:图书馆有一些语文文学书。

2018-01-26 18:05:39 267

原创 设计模式——代理模式(Proxy)

代理模式业务类只需要关注业务逻辑本身,保证了业务类的重用性,这是代理的共有优点,同时协调调用者和被调用者的关系,使得两者一定程度的解耦。代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。模式优点代理模式的共同优点如下:(1) 能够协调调用者和被调用者,在一

2018-01-25 16:46:51 337

原创 设计模式——装饰者模式

装饰者模式Decorator模式(别名Wrapper)动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。设计原则多用组合,少用继承。利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时

2018-01-25 16:44:03 192

原创 设计模式——外观模式(Facade)

外观模式(Facade)定义定义了一个高层、统一的接口,外部与通过这个统一的接口对子系统中的一群接口进行访问。优缺点优点 - 实现客户类与子系统类的松耦合降低原有系统的复杂度提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。 (1)引入外观角色之后,用户只需要与外观角色交互; (2)用户与子系统之间的复杂逻辑关

2018-01-25 16:39:02 320

原创 设计模式——适配器模式

适配器模式适配器模式是指将一个接口转化成另外一个希望得到的接口适配器模式包括对象适配器模式和类适配器模式。  ●  目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。  ●  源(Adaptee)角色:现在需要适配的接口。  ●  适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一

2018-01-24 17:16:24 276

原创 Android小技巧——Uri启动Activity

今天来跟大家说一下一个在某些情形下很实用的小技巧——通过Uri启动Activity。 首先获取某个Activity 的Uri: Intent intent = new Intent(this, SecondActivity.class); mUri = intent.toUri(Intent.URI_INTENT_SCHEME); Log.i("uri", "mUri=" +

2018-01-03 16:11:19 2848 1

原创 Android音视频录制(4)——变速录制

概述在看本篇文章之前请务必先查看这面三篇文章:第一篇:Android音视频录制概述 第二篇Android音视频录制(1)——Surface录制 第三篇Android音视频录制(2)——Buffer录制视频变速是一个非常有趣的东西,在我们平时看电影的时候,导演对某些镜头进行快放(比如动作片的拳脚片段),某些镜头进行慢放(比如一些火山喷发之类的),从而造成非常震撼的影视效果。最近非常火

2017-12-21 15:09:41 2872 4

原创 Android小技巧——圆角背景

如果要你实现一个圆角的按钮,首先想到的当然是利用shape啦,假设需求是view的背景为黄色,左上角和右上角为圆角,左下角和右下角为直角,这个时候很多小伙伴就想当然的来了:先来个布局:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

2017-12-20 16:42:23 6200 1

原创 Android 音视频录制(3)——全关键帧视频录制(视频编辑必备)

概述在看本篇文章之前请务必先查看这面三篇文章:第一篇:Android音视频录制概述 第二篇Android音视频录制(1)——Surface录制 第三篇Android音视频录制(2)——Buffer录制全关键帧录制顾名思义,就是视频所有帧都是关键帧(I帧),毫无疑问,全I帧的视频肯定会比正常录制的视频要大很多,但是为什么需要全I帧录制的视频?原因就是,大部分音视频app录制完视频之后都要对视频进行

2017-12-05 16:20:50 2586 3

原创 Android 音视频录制(2)——Buffer录制

概述没有看上一篇Surface录制的小伙伴,先去看了Android音视频录制概述 和Android音视频录制(1)——Surface录制 这两篇文章在来看此篇文章。正如前面文章说的,surface录制是将摄像头数据通过egl和opengl绘制到编码器surface最后输出到文件的,buffer录制则是更直接,直接将摄像头数据灌输到编码器,让编码器直接编码数据后输出到文件,具体详见下文。因为在surf

2017-12-05 15:27:42 1999 3

原创 Adroid音视频录制(1)——Surface录制

概述在上一篇文章Android音视频录制概述。已经大概讲述了Surafce录制的原理,如果大家还没看那篇文章,请先去查看哈。后续文章介绍Android音视频录制(2)——buffer录制Android全关键帧视频录制——视频编辑必备(待续) Surface录制视频数据一共分为以下几个部分: 1,摄像头预览预览 包括A:摄像头配置 B:基于GLSurface View的OpenGL绘制2,编码器

2017-12-04 19:18:31 4075 6

原创 Android 音视频录制概述

相比于IOS健全的多媒体库,Android的多媒体库就显得非常的发育不全了,视频录制在安卓手机上是一个比较有挑战性的问题,当然我这里说的并不是那种用MediaRecorder做视频录制,那种说实话太low,很固化,灵活性为0。但是现在应用市场音视频的app比比皆是,视频录制在这类音视频应用中又是一种必须,虽然,安卓提供的音视频库是那么的“不堪”,但是,录制视频还是可行的。抛开刚刚说的MediaRec

2017-12-03 18:47:04 1901

原创 Android DIY抠图——想怎么抠就怎么抠

下面我分享Android的一个抠图技巧,这篇文章只适合有Android基础和向量基础的小伙伴,如果朋友们刚学Android不久,建议先去了解Android自定义View、Touch机制、Canvas/Path/Paint、向量等相关知识。 先来看看效果图:这张是原图 抠出脸部图片,下面是结果: 下面我给小伙伴们讲述具体流程。1,获取本地相册,很简单,直接代码,不解释public void sc

2017-10-09 14:56:18 5015 11

原创 Android bitmap 一些常用用法

说到Bitmap,Android 的朋友肯定很熟悉了,下面是我对bitmap一些常用方法的总结。之后会陆续更新。圆角bitmap /** * * @param source * @param radius 圆角半径 * @return */public static Bitmap getRoundCornerBitmap(Bitmap s

2017-09-30 17:28:11 565

原创 Android小技巧——LinearLayout巧妙的平均分配空间

通过设置width/height和layout_weight属性,巧妙平分LinearLayout布局

2017-06-22 18:36:14 39562 1

原创 Android小技巧——Selector用法

在做Android UI的时候,Selector是必不可少的,下面说一下使用selector其中一个小技巧 昨天有个小伙伴来问我,你看我明明给这个TextView设置了background,为什么不生效呢?先来看看他是怎样写的: <TextView android:background="@drawable/tv_background" android:layout_width

2017-06-22 16:25:50 2405

原创 android 音视频混合

接到过这样的一个需求:给你一个视频(mp4)和一段音乐,合成一个新的视频,新的视频去掉原有的音频,而是用该音乐作为音频。看似简单的几句话,但接到这个需求的时候,真的非常头疼,其实这个真不简单。关于音视频的编辑,业界普遍使用的是FFmpeg库,但是如果要自己去编译优化得到一个稳定可使用FFmpeg库,需要花费巨大的人力和时间成本,这在我当时的情境下,并不现实。在网上查找资源时候,了解到,自从andr

2017-05-10 14:55:48 3771 6

原创 android音频裁剪(2)——Wav裁剪

在android音频裁剪(1)——MP3裁剪一文中我分享了对mp3文件裁剪方法。在本文中我将分享对另外一种音频格式——wav格式音频的裁剪。不同于mp3格式的裁剪,对于wav裁剪并不是通过android提供的多媒体库对音频进行处理,而是直接通过java代码对wav音频进行裁剪,所以以下方法对于wav音频裁剪具有平台通用性。 俗话说的好,知己知彼,百战不殆,要对wav文件进行处理,首先要去详细了解w

2017-05-09 16:54:10 3282 2

原创 android 音频裁剪(1)—MP3裁剪

android 音频裁剪(1)—MP3裁剪=====原创不易,请尊重每一位原创,让我们更有分享的动力,转载请注明=====在android开发中,一说到音视频,程序员第一反应肯定是FFMpeg,但是FFMpeg这个库,又复杂,又性能差,如果只想简单的要个音频裁剪的功能,就要去引入这么大的库,完全不值得。然而自从android api 16之后谷歌就开始在音视频方面进行布局,android 18之后继

2017-05-08 18:44:28 5821 9

视频分析工具

视频分析工具(双击eseye_u.exe), 分析视频信息,查看关键帧/非关键帧,可以分析视频的完整性,打开视频是一系列的柱形图(代表视频帧),如果中间有间隔,则说明视频有丢帧,如果柱形图为红色,则为关键帧,如果是绿色,则是非关键帧

2017-12-05

空空如也

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

TA关注的人

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