自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 Android 优雅地管理ProgressDialog,解决多次网络请求时弹窗闪烁问题

前言在Android应用中,执行一些耗时操作的时候,弹出一个表示加载中Dialog是非常常见的功能。

2020-05-31 16:49:26 7411

原创 Android TabLayout修改指示器宽度方案汇总

目录前言TabLayout的视图结构TabLayout绘制指示器的过程1.从获取tabSelectedIndicator边界着手1.1 默认情况下的指示器宽度1.2 tabIndicatorFullWidth="false"时,指示器宽度1.3 使用反射修改TabView的宽度1.4 修改calculateTabViewContentBounds()方法2.从tabSelectedIndicato...

2020-05-04 23:06:00 32810 5

原创 HashMap与HashTable的初始值

HashMap和

2020-12-04 17:28:58 1084

原创 Android 权限申请源码解析

权限申请的用法//acitivty中申请权限ActivityCompat.requestPermissions(activity, permissions, requestCode);//activity权限授权结果回调@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onR

2020-12-04 16:48:53 1796

原创 关于数据结构与算法的基本理解

数据结构 + 算法 = 程序数据结构是数据存储和组织的方式,旨在便于数据的访问和修改。算法是对于输入的数据或数据的集合,通过一系列特定的计算,输出数据或集合。它描述的是一种期望的输入/输出关系。1.从应用的角度来讲:通过算法对数据进行操作就可以实现一些特定的功能,多个功能组合起来就是一个应用程序,此时它也就具备了和人交互的能力。作为一个程序员,需要哪些功能并不是我们关心的重点。这主要是产品设计层次的问题,需要密切结合市场用户的需求。因此我们的重心就应该放到如何去完成一个个功能以及建立功能之间的联系

2020-10-27 18:01:59 1779

原创 设计模式演化之享元模式

定义使用共享对象有效的支持大量细粒度的对象演化1.单例模式单例模式对于一个类,只能拥有它的一个实例。单例模式实现了绝对意义上的对象共享,使用共享对象带来的好处是显而易见的。减少内存的消耗避免频繁的创建和销毁对象带来的性能损耗但是单例模式由于只能有一个实例,很难适用复杂多变的场景。一般我们只会把单例模式的写法应用到一些工具类的定义上,这些类通常只有方法没有成员变量,或者说成员变量的值只有一种,而不会有什么变化。而一旦成员变量可以有多重值,单例模式基本就没办法定义了。因为单例模式是需要对外屏蔽

2020-06-30 17:25:26 5809

原创 设计模式演化之适配器模式

定义将一个类的调用接口转换成另一个接口,使得由于接口不兼容的类可以一起工作演化1.给手机充电,一般家用电是220V。public class PowerSource { private int voltage = 220; public int output() { System.out.println("输出电压: " + voltage + "V"); return voltage; } }2.而手机一般用的是5V,我们可以

2020-06-29 17:53:00 5621

原创 设计模式演化之桥接模式

定义将抽象部分与实现部分分离,使它们都可以独立的变化。演化1.请设计一个绘图工具,功能比较简单,它能绘制不同的图形,和不同的颜色。为了让绘制对象具备统一的绘制行为,我们一般会抽象出来Shape和Color两个接口。public interface Shape { void drawShape();}public interface Color { void drawColor();}2.想让一个类具备两个接口的功能,可以让具体的绘制对象去实现这两个接口,如绘制一个红色的圆

2020-06-29 16:12:13 5757

原创 设计模式演化之装饰模式

定义向现有的对象添加新的功能,并不改变其结构演化1.一般情况下如果需要增加一个类的功能,且不改变它的源码,我们会直接使用继承的方式来扩展一下。

2020-06-29 12:24:38 5727

原创 设计模式演化之动态代理

前言承接上文

2020-06-22 18:57:39 5870

原创 Bugly报错Could not find method leftShift() for arguments [com.tencent.bugly.gradle]解决方案

解决方案在项目的buid.gradle文件的dependencies(buildscript部分)中修改bugly的插件为最新版本classpath 'com.tencent.bugly:symtabfileuploader:2.2.1'问题分析这个问题一般是在旧有项目升级gradle 3.5插件时会出现的。在升级gradle 3.5插件时,会要求我们将gradle同步升级到5.0以上。如5.4.1distributionUrl=https\://services.gradle.org/dist

2020-05-23 15:25:54 7482

原创 Android Studio引入aar包的新方式,module也可用

旧有的引入办法以前引入的方法,通常要分三个步骤(1) 把aar放入libs文件夹(2) 修改该module下的build.gradle文件将libs设置为本模块的依赖仓库 repositories { flatDir { dirs 'libs' }}引入具体的aar包api(name: 'LiteAVSDK_Professional', ext: 'aar')(3) 修改根目录下的build.gradle文件allprojects {

2020-05-21 11:03:45 15486

原创 设计模式演化之代理模式

定义为其他对象提供一个代理以控制对这个对象的访问演化1.我们平时写代码的时候,免不了要用到一些日志分析工具,来记录代码执行过程中产生的数据,这些工具通常会由第三方提供。他们封装的非常好,...

2020-05-11 10:54:02 6492

原创 Android图表控件MPAndroidChart实现左右滑动以及联动

前言MPAndroidChart是一个功能强大的Android图表控件库,它实现了许多常见的图表效果。关于MPAndroidChart的使用文章已经很多了,这里不再详细介绍它的使用。当数据量过多时,一部手机小小的屏幕是无法显示完全的。因此需要让图表能够放大显示,并提供左右滑动功能。实现原理:获取图表的Matrix,通过Matrix来实现图表的放大,平移操作。关键代码如下:// 获取图标M...

2020-05-06 20:06:14 19935 2

原创 设计模式演化之外观模式

定义要求一个子系统的外部与内部的通信必需通过一个统一的对象执行,该模式提供一个高层的接口,使得子系统容易复用演化在我们的开发生涯中,免不了使用各种各样的第三方库。如Gson,EasyPermissions,Retrofit2,EventBus等。我们会发现它们都有一个共同的特点:尽管源码的内容很多,Java类的文件也有许多。但在我使用的时候会发现往往只需要调用某一个类的方法就能使用这个系统中...

2020-05-04 21:11:13 6187

原创 设计模式演化之策略模式

定义针对一组算法,把他们封装到共同的接口类中,从而使得它们可以达到相互替换的目的。演化1.实现一个学籍管理系统的主页,可以允许老师和学生登录。两者能看到主页页面相似,但也存在着一些差别。在这种情况下,如果单独为两者各创建一个主页就会显得浪费了。因此我们一般会在主页里边通过身份判断来执行有差异的功能。如加载页面控件:public class MainPager { publ...

2020-05-03 21:54:58 6288

原创 设计模式演化之观察者模式3——仿EventBus实现

前言无论是设计模式演化之观察者模式1还是设计模式演化之观察者模式2中的写法,我们在注册观察者之前都有一个前提,观察者需要持有被观察者的引用,然后调用被观察者的注册方法。现在我们换一个场景:依然定义一个观察则Observer,现在要求程序运行中,所有被观察者Subject的改变事件都要通知到Observer。这在我们现在场的景中显然就无法做到了。改变Subject的地方可能有很多,且会动态变化。...

2020-05-01 20:46:57 6196

原创 设计模式演化之观察者模式2——仿LiveData实现

前言在设计模式演化之观察者模式1中,我们实现了一个经典的观察者模式,下边继续对观察者模式进行优化,以便于能够在各种场景下更好的工作。优化1.我们在Subject中新增多个属性。然后一下Subject类的名字,使它更符合业务场景。现在我们要观察一个User类多个属性的变化。public class User { private String name; private in...

2020-05-01 11:18:52 6332

原创 设计模式演化之观察者模式1——经典实现

定义定义一种对象之间的一对多关系,当一个对象状态改变时,所有依赖于它的对象都得到消息,并刷新。演化1.定义Subject和Observer两个类,现在要求当Subject对象中的一个属性改变时,Observer对象要把这个属性实时显示出来。在代码中我们可以这么写:让Subject对象持有Observer对象的引用,当属性改变时,调用Observer的update()方法。(1) 定义Sub...

2020-05-01 11:11:08 7955 1

原创 算法:计算两个整数之和

前言乍一看这个标题,你可能会觉得奇怪:实现两个数之和有什么好说的,直接使用 a + b不就好了。确实我们一般都是这么做的,那么如果此时加个条件,不允许使用 “+” 运算符,那又该怎么做呢。加法的计算过程1.我们先来分析一下平时如何在演草纸上计算两个数字之和的。以159 + 357 为例(1) 9 + 7 = 16,则和的个位为6,同时向十位进1(2) 5 + 5 + 1 = 11,则和的...

2020-04-30 19:02:04 10091 1

原创 网络代理流程解析

几个基本概念IP地址计算机在与外界连接的时候,都会有一个IP地址,它标识的是电脑在网络中的位置。通过IP地址可以找到这台计算机,并发送数据给它。但是我们发送的数据还需要特定的程序来进行处理,一台电脑可能运行着很多程序,我们还需要告诉计算机,这些数据是发给哪个应用程序的。因此仅仅只有IP地址是不够的。端口在所以还要有端口来标识进程。每个进程可以占用多个端口,但是一个端口只能属于一个进程。通过...

2020-04-29 00:34:26 9320

原创 设计模式演化之原型模式

定义

2020-04-24 11:21:43 6529

原创 设计模式演化之建造者模式

定义将一个复杂对象的创建与表示分离,使得同样的创建过程可以创建不同的标识演化1.定义一个电脑类public class Computer { private String cpu; private String mainBoard; private String memory; private String displayAdapter; priva...

2020-04-21 16:09:06 6535

原创 设计模式系列索引

前言设计模式已经是一个被写烂了的话题,相关的文章和示例数不胜数,按道理来说这一系列的文章可以说是石沉大海了。但我还是要写,总归还是有自己的里有。文章风格不同的文章可以有相同的话题,却可以有不同的论述风格。或许真的会有相应风格的读者能从这里得到启发呢?我们对一个知识点的掌握是可以分层次的了解:知道有这么个知识,当在别的地方提到它时,知道它的大概意思,不至于一头雾水。初步应用:能看懂这个知...

2020-04-20 17:19:58 6551

原创 设计模式演化之工厂模式

定义由一个工厂类根据参数来决定创建哪一种产品的实例场景:简单工厂模式的演变定义一个电脑类public class Computer { private String name; public Computer(String name) { this.name = name; } public void start() { S...

2020-04-16 10:15:08 6468

原创 Android RecyclerView数据错乱问题

前言RecyclerView是日常开发中最常用的控件之一。一般情况下,我们用它来展示一系列数据的视图。然而在使用过程中,偶尔会出现数据错乱的情况。当然这并不是RecyclerView本身的bug,而是代码编写中的问题。场景再现1.先准备一个数据对象public class TestModel { public TestModel(String description) { ...

2020-03-11 00:03:47 16091 2

原创 Android自定义ScrollView实现阻尼回弹效果

Android开发中,当一个页面存放的控件超出屏幕时,通常需要使用ScrollView来包裹布局。这样用户可以通过手指的滑动来查看超出屏幕的部分。然而当ScrollView滑动到边界时,继续滑动只会显示一个阴影效果。IOS自带的控件却可以实现边界的阻尼回弹效果,这种阻尼回弹效果会让用户有更好的使用体验。这里给出一个Android上的实现方案解决思路:ScrollView使用时要求内部有且仅一个...

2020-03-06 17:02:10 10484 4

原创 Android 在现有项目中使用NDK开发

新建项目直接选中Native C++即可,本篇文章主要描述如何在现有项目中添加Native方法1.AS中依次点击Preferences->Android SDK -> SDK Tools安装Cmake和NDK,如果安装过程中下载超时,可以关闭代理重试2.新建项目,新建声明native方法的类NativeMethod.java。代码如下public class NativeMeth...

2020-03-05 10:36:27 8545 1

原创 Android实现特定形状的图片

https://blog.csdn.net/YX_BB/article/details/104561359在上篇文章中,我们实现了圆形图片圆角图片,基本上已经满足了日常开发中的需要。那如果想要更多的图形效果该怎么办呢?一、使用Canvas的clipPath方法直接把Canvas剪裁成我们想要的形状。例如1.心形图片公式:t 表示点(x,y)在坐标系中的角度x = 16 sin^3 ty...

2020-03-04 16:55:47 17847 2

原创 Android基于Fresco的圆角和圆形图片实现

Fresco是FaceBook开源的Android平台图片加载库,可以从网络,从本地文件系统,本地资源加载图片Fresco本身已经实现了圆角以及圆形图片的功能。<!--圆形图片,一般用作头像--><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/iv_avatar" android:lay...

2020-02-29 00:20:24 8062

原创 Android解决EasyPermissions弹窗两次的问题

EasyPermission是Google为了方便开发者为App申请权限而推出的开源库。帮助开发者极大的精简了权限申请的过程。申请权限的时候也非常简单/*** @params host Activity或者Fragment* @params rationale String字符串,用于描述需要申请权限的说明* @params requestCode 用于标识权限申请的回调* @param...

2020-02-26 17:42:40 19880 1

原创 设计模式演化之单例模式

定义:一个类只有一个实例,并提供一个访问它的全局访问点。

2020-02-24 18:07:05 6275

空空如也

空空如也

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

TA关注的人

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