自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【XR】AR开发技术栈概述

1 AR技术脑图2 AR技术对比分析3 AR头戴设备

2021-11-23 11:10:21 1019

原创 【Flutter】一文搞懂异步编程

1 事件循环机制

2021-11-05 00:09:53 1907

原创 【Flutter】绘制图形原理

1 Canvas画布API名称功能drawLine画线drawPoint画点drawPath画路径drawImage画图像drawRect画矩形drawCircle画圆drawOval画椭圆drawArc画圆弧1.1 drawLine使用方法及源码分析使用方法:源码: /// Draws a line between the given points using the given paint. The line

2021-10-23 00:58:43 751

原创 【Flutter】时间轴高度自适应最佳实践

1 使用部件画圆圈:使用 canvas.drawCircle 和属性为_paint.style = PaintingStyle.fill;画笔画两个实心圆;画竖线:使用 canvas.drawLine 和属性为_paint.style = PaintingStyle.stroke;的画笔画直线,通过 p1 和 p2 两个端点使直线为竖线在 Container 中调用 decoration 组件使用 BorderTimeLine 类。decoration: BoxDecoration(border:

2021-10-20 01:09:14 1355

原创 【算法】一文刷完LeetCode(Java语言)全部典型题(持续更新)

1 题型分类2 贪心算法

2021-10-18 18:00:00 622

原创 【Android】Gradle入门

是什么?在语法上是基于Groovy语言的(Groovy 是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语言java的弱类型版本),在项目管理上是基于Ant和Maven概念的项目自动化建构工具。基础知识准备Java基础,命令行使用基础官方文档:https://docs.gradle.org/current/dsl/Gradle使用指南: https://gradle.org/docs/current/userguide/userguideAndroid插件文档:https://github

2021-10-16 01:16:47 110

原创 【Flutter】使用GridView实现二维网格列表

1 GridView构造函数GridView({ Axis scrollDirection = Axis.vertical, bool reverse = false, ScrollController controller, bool primary, ScrollPhysics physics, bool shrinkWrap = false, EdgeInsetsGeometry padding, @required SliverGridDelegate gridDe

2021-09-21 00:38:31 498

原创 【Flutter】详解BuildContext

framework.dart中BuildConttext源码:/// The [BuildContext] for a particular widget can change location over time as/// the widget is moved around the tree. Because of this, values returned from/// the methods on this class should not be cached beyond the exe

2021-09-06 02:10:57 898

原创 【Flutter】应用开发笔记

1 获取Flutter SDK1.下载安装包2.将压缩包解压,然后把其中的 flutter 目录整个放在你想放置 Flutter SDK 的路径中勿将 Flutter 安装在需要高权限的文件夹内,例如 C:\Program Files\。2 配置环境变量2.1 更新path环境变量Environment Variables->User Variables->PATH->New加入 flutter\bin 目录的完整路径配置国内镜像,新增加环境变量2.2 配置Andro

2021-09-03 22:43:24 1191 3

原创 【Flutter】Dart学习笔记

1 变量(Variables)var name = 'Bob';Dart可自动推断变量的类型,也可以为变量指定类型,如果一个对象的引用不局限于单一的类型,可以将其指定为 Object(或 dynamic)类型。推荐通过 var 声明局部变量而非使用指定的类型未初始化变量默认值为null,包括数字,因为在 Dart 中一切皆为对象,包括数字。Final和Const这两个关键字可以替代 var 关键字或者加在一个具体的类型前。一个 final 变量只可以被赋值一次;一个 const 变量是一个编译时

2021-09-03 22:42:50 365 1

原创 【Android】字节码插桩(一)

1 摘要字节码插桩技术可以帮我们实现业务层模块和功能模块的关联,并在项目结构避免其耦合,比如ARouter实现各模块路由表的注册;2 背景一般我们使用Transform会有下面两种场景我们需要对编译class文件做自定义的处理。 我们需要读取编译产生的class文件,做一些其他事情,但是不需要修改它。本篇主要介绍完成字节码插桩的第一步,通过Transform将编译后的class文件和jar包找到并输出;3 正文Transform的基本API参考:Transform的抽象方法:publi

2021-07-14 18:02:20 907

原创 【Android】Android Butter Knife 框架——最好用的View注入

最近在看GitHub上的一些代码时,发现很多工程都用到了Butter Knife这个框架,能节省很多代码量。像findViewById这种代码就不用再出现了,而且这个框架也提供了很多其他有用的注解。抱着学习的心态看了官网上的文档,挺简单,也很实用,决定以后就用这个库了。下面是我翻译的官方文档,诸位看官轻喷。官方文档也挺简单,英语好的不好的,都建议去看看原文。另外注意,这个库的版本更新挺快的,我第一次用到的时候是7.1.0,而现在的最新版本已经是8.5.1了,也就是说大家可能需要去ButterKnife

2021-03-23 18:00:21 273

原创 [Android]使用 Jetpack DataStore 进行数据存储

欢迎使用 Jetpack DataStore,这是一个经过改进的全新数据存储解决方案,旨在替代原有的 SharedPreferences。Jetpack DataStore 基于 Kotlin 协程和 Flow 开发,并提供两种不同的实现: Proto DataStore 和 Preferences DataStore。其中 Proto DataStore,可以存储带有类型的对象 (使用 protocol buffers 实现);Preferences DataStore,可以存储键值对。在 DataSto

2021-01-08 18:00:25 544 2

原创 【Android】冷启动优化

1、app的启动流程App启动的描述。应用启动分为冷启动、热启动、温启动。而冷启动是应用程序从零开始,里面涉及到更复杂的知识。我们这次主要是对应用的冷启动进行分析和优化。应用在冷启动的时候,需要执行下面三个任务:加载和启动应用程序;App启动之后立即展示出一个空白的启动窗口;创建App程序的进程;在这三个任务执行后,系统创建了应用进程,那么应用进程会执行下一步:创建App对象;启动Main Thread;创建启动页的Activity;加载View;布置屏幕;进行初始绘制当应用进程

2021-01-07 18:01:01 224 1

原创 【Android】MediaStore三种刷新方式简介

1、Media是MediaStore的内部类(MediaStore.Image.Media),它提供了几个insertImage方法,以方便我们想MediaStore插入图片数据,该操作会生成一张缩略图。插入有两个重载方法,一个是传入图片路径,一个是传入Bitmap;区别:传入图片路径的方法,会将制定的图片拷贝一份到Picture目录下,也就是SDCARD中共有两种相同的图片。传入Bitmap的方法,会将图片直接保存到Picture目录下。/**Insert an image and creat

2021-01-06 18:00:34 1992

原创 【Android】Jetpack的Data Binding库

Data Binding库支持使用声明性格式而不是以编程方式将layout中的UI组件绑定到应用程序中的数据源。我们通常在Activity中声明layout,并通过UI框架方法获取到UI控件。例如,下面代码演示调用findViewById()去获取TextView控件,然后将它绑定到viewModel的userName。TextView textView = findViewById(R.id.sample_text);textView.setText(viewModel.getUserName())

2021-01-05 18:01:05 123

原创 【Android】动画设置监听器的一个方法

设置监听器的方法, ViewPropertyAnimator 和 ObjectAnimator 略微不一样: ViewPropertyAnimator 用的是 setListener() 和 setUpdateListener() 方法,可以设置一个监听器,要移除监听器时通过 set[Update]Listener(null) 填 null 值来移除;而 ObjectAnimator 则是用 addListener() 和 addUpdateListener() 来添加一个或多个监听器,移除监听器则是通过

2021-01-04 18:00:28 2250

转载 【Android】Android Studio Database Inspector 使用

今天在逛技术网站的时候,看到了一个好东西,Database Inspector 第一眼看上去感觉没有用过,老样子赶紧百度一下,发现基本没有这方面的文章,看来这个应该是在内测还未推出的工具,首先说一下 Database Inspector 是干什么的?其实要解决的问题就是我们在调试数据库的时候,使它可以想编辑 Excel 一样的简单,直接修改直接生效,这有什么好处呢?不用我们在一点一点的去 Debug 数据了,这个看来还是非常有用的。本来想找一些资料来整理一下,但无意间看到一个 Google 的大佬工程师已

2021-01-01 18:00:27 1403

原创 【Android】线程池管理部分浅析

一、AsynTask1、构造NuAsyncTask实例该类是一个泛型类,取消了Process参数(因为更多情况下使用不到,保证接口的简洁性),只保留了Params,Result类型参数;另外,构造函数必须要求传入一个workName,以便来跟踪任务的执行时间。因为AsyncTask任务可以调用取消接口,所以该类为了保证功能的一致性,定义了一个NuFutureRunnable类,以来可以取消提交的任务。2、抽象接口定义抽象接口的定义,同AsyncTask的 doInBackground,onP

2020-12-31 18:00:35 124

原创 《第一行代码》调用相机部分适配Android10/11

摘要《第一行代码》中的调用相机程序在新版本的Android10/11中已经不完全适用,会出现闪退等问题,此文针对需要修改的内容作出特别说明正文1.必须在AndroidManifest中添加CAMERA权限否则会导致闪退 <uses-permission android:name="android.permission.CAMERA"/>2.添加provider用于文件的存储和读取android:authorities的参数必须与FileProvider.getUriForFile中

2020-12-30 18:00:37 536 1

原创 【Android】线程池缓存简介

1、缓存线程池创建缓冲池没有核心线程数为0,没有上限,线程空闲保存60s存活时间,任务队列采用的SynchronousQueue队列2、线程池实例化后就可以执行任务,一般通过execute方法调用分为3个步骤:步骤1:线程任务小于核心线程数,由于缓存线程池corePoolSize=0,所以该步骤不会被执行到步骤2:判断队列是否添加成功,由于采用的SynchronousQueue队列,所以一般情况下该offer对象返回false,不会执行该分支代码步骤3:队列添加失败,就直接执行任务addWo

2020-12-29 18:00:36 403

原创 【Android】ConstraintLayout构建响应式UI

一、摘要ConstraintLayout可以创建具有平面视图层次结构的大型复杂布局(不包含嵌套视图组)。这与RelativeLayout所有视图根据兄弟视图和父布局之间的关系进行布局相似,但它比RelativeLayoutAndroid Studio的布局编辑器更灵活,更易于使用。ConstraintLayout可以直接从布局编辑器的可视化工具中使用,因为布局API和布局编辑器是专门为此构建的。因此,ConstraintLayout完全通过拖放而不是编辑XML 来完成布局的构建。二、背景如果应用因为

2020-12-28 18:00:39 170 1

原创 【Android】Android ANR:原理分析及解决办法

一、ANR说明和原因1.1 简介ANR全称:Application Not Responding,也就是应用程序无响应。1.2 原因Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。以下四个条件都可以造成ANR发生:InputDispatching Timeout:5秒内无法响应屏幕触摸事件或.

2020-12-26 18:00:26 375

原创 【Android】单例模式多种实现方法对比

单例模式,又称单件模式或者单子模式,指的是一个类只有一个实例,并且提供一个全局访问点。可以使用下面几种方式创建单例调用:饿汉式饿汉式指的是单例的实例在类装载时进行创建。如果单例类的构造方法中没有包含过多的操作处理,饿汉式其实是可以接受的。饿汉式的常见代码如下,当SingleInstance类加载时会执行private static SingleInstance sInstance = new SingleInstance();初始化了唯一的实例,然后getInstance()直接返回sInstanc

2020-12-25 18:00:39 119

原创 【Android】拦截Activity启动的方法

1、源码寻找启动Activity的Hook的对象一般来说,静态变量和单列变量是相对不容改变,是比较好的Hook的对象,可以设一个动态代理对象进去,进行拦截。启动一个页面:public void start(View view) { Intent intent = new Intent(this, HookActivity.class); startActivity(intent);}追溯到ContextImpl:@Overridepublic void sta

2020-12-24 18:00:29 1862

原创 【Android】多帧动画方案

帧动画(FrameAnimation)是Android比较常用的动画之一,比如一些自定义loading的实现。帧动画逐帧显示配置在animation-list中的图片,但在显示前会一次性加载全部图片资源,如果图片过多过大,很可能会导致内存溢出问题。1 帧动画实现首先在drawable下添加animation-list文件loading_anim.xml<animation-list xmlns:android="http://schemas.android.com/apk/res/android

2020-12-23 18:00:25 460

原创 【Android】不依靠Activity和Dialog显示View的方法

一、首先我们先看下Activity是如何显示View平常我们在Activity的onCreate会调用setContentView(R.layout.xxx),Activity启动过程与window的源码流程可参考总结几个步骤:1、创建Activity:ActivityThread的performLaunchActivity函数中创建Activity后,调用Activity.attach函数2、创建PhoneWindow:Activity.attach函数中创建与之关联的PhoneWindow,Ph

2020-12-22 18:00:52 757

原创 【Android】StrictMode严格模式流程分析及入侵埋点处分析

一、使用严格模式StrictMode严苛模式,是Android提供的一种运行时检测机制,一般用来检测在主线程做一些耗时动作,比如IO读写、数据库操作、Sp操作、Activity泄露、未关闭的Closable对象泄露等,以减少发生ANR等。严格模式主要有2个策略:一个是线程策略,即TreadPolicy是针对一个具体的线程,另一个是VM策略,即VmPolicy,是针对虚拟机的所有对象。当然可以添加Penalty(惩罚),一般我们都是用来打印日志、绘制红框等。二、严格模式中是如何去检测,在哪个地方有注入

2020-12-21 18:00:34 472

原创 【Android】startForeground启动流程分析

1、startForeground本文分析了startForeground启动流程,android在8.0以上平台上怎么保证了前台服务,以及前台服务的通知怎么显示出来的进行源码解读。Android对于后台进程的应用,禁止启动后台服务,也就是startService方法禁止调用;如果想启动服务必须通过startForeground方式启动为前台服务。id 不能为0,notification不能为null,否则会报“null notification”异常,接下来会分析到2、跟踪到ActivityMana

2020-12-18 18:00:40 2893 1

原创 【Android】Universal Image Loader使用简介

ImageLoader是具体下载图片,缓存图片,显示图片的具体执行类,它有两个具体的方法displayImage(…)、loadImage(…),但是其实最终他们的实现都是displayImage(…)。ImageLoaderConfiguration是针对图片缓存的全局配置,主要有线程类、缓存大小、磁盘大小、图片下载与解析、日志方面的配置。使用说明//这里的路径可以自定义 File cacheDir = StorageUtils.getCacheDirectory(context);

2020-12-17 18:00:48 136

原创 【Android】View显示可见属性分析

有时有些需求要求开发判断View是否在手机屏幕的显示范围内。例如:列表中广告的曝光,开始虽然请求到广告,但是广告在列表的底部,超出了手机屏幕的范围,不能上报,当用户向上滑动,看到了广告才要求上报。常用方法:1.Ad.getVisibility( )2.Ad.isShown()3.Ad.getLocalVisibilityRect(Rect r)4.Ad.getGlobalVisibilityRect(Rect r)一. getVisibility()方法根据View源码可以看出,getV

2020-12-16 18:00:40 427

原创 【Android】View点击事件劫持方法

在不侵入业务代码的情况下监听所有的点击事件并记录所有的点击数,用于统计热点页面和其他一些分析工作,介绍一个如何Hook掉View的onClick方法第一步寻找Hook点setOnClickListener做了那些动作:btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { }});public void setOnClickListener(@Nul

2020-12-15 18:02:56 365

原创 【Android】View的绘制机制与源码解析

一、前言Android的视图是如何绘制的?深入了解一下UI的绘制原理无论对我们APP的性能优化还是对我们的自定义view都有很大的帮助。二、Activity的视图结构先看一下activity的视图结构图:每个activity都有一个Window(实际是phonewindow)Phonewindow含有一个DecorView,这是我们window的topviewDecorView是继承自Framelayout,换言之其为整个ViewTree的根节点viewGroup再看一下Phonewindo

2020-12-14 18:01:54 182

转载 【Android】自定义view之onMeasure

1 onMeasure什么时候会被调用onMeasure方法的作用是测量控件的大小,当我们创建一个View(执行构造方法)的时候不需要测量控件的大小,只有将这个view放入一个容器(父控件)中的时候才需要测量,而这个测量方法就是父控件唤起调用的。当控件的父控件要放置该控件的时候,父控件会调用子控件的onMeasure方法询问子控件:“你有多大的尺寸,我要给你多大的地方才能容纳你?”,然后传入两个参数(widthMeasureSpec和heightMeasureSpec),这两个参数就是父控件告诉子控件可获

2020-12-13 18:00:37 1551

原创 【Android】Volley技术细节简介

一 Volley网络请求流程介绍发送请求普通的http请求只要创建一个Request对象,然后添加到RequestQueue队列中就可以了。Request对象是Volley框架中的一个抽象类,Volley中也提供了几个默认的实现类,如:ImageRequest、JsonRequest (JsonArrayRequest和JsonObjectRequest)、StringRequest。从名字定义就可以看出具体的请求用途,下面会对这些内部实现做讲解。将Request对象添加到一个RequestQ

2020-12-11 18:00:29 176 1

原创 【Android】Volley原理

1.RequestQueue使用Volley之前首先要创建RequestQueue,就从这里开始入手,如下所示:RequestQueue mQueue=Volley.newRequestQueue(getApplicationContext());。接着查看newRequestQueue()做了什么:public static RequestQueue newRequestQueue(Context context, HttpStack stack) { File cacheDir = new

2020-12-10 18:00:33 210

原创 【Android】ScrollView子节点配置android:height=“match_parent“失效问题

本文研究了ScrollView的measure过程,重点讨论ScrollView的子View配置了android:height=“match_parent”,却没有到达预想值(预想应该跟父容器一样高度),针对该问题进行探讨。1 xml配置<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layo

2020-12-09 18:00:14 581

原创 【Android】ScrollView嵌套Listview源码分析

从源码的角度分析Scrollview嵌套Listview显示一行问题,主要关注ScrollView和ListView的Measure过程,1、ScrollView的OnMeasure()方法super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (!mFillViewport) { return;}final int heightMode = MeasureSpec.getMode(heightMeasureSpec);if (

2020-12-08 18:00:23 93

原创 【Java】Java 8 lambda表达式简介

一、摘要此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等。二、背景Java 是一流的面向对象语言,除了部分简单数据类型,Java 中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象。在 Java 中定义的函数或方法不可能完全独立,也不能将方法作为参数或返回一个方法给实例。我们总是通过匿名类给方法传递函数功能,以下是旧版的事件监听代码:someObject.setOnClickListener(new OnClickList

2020-12-07 18:00:37 77

原创 【Android】ImageView ScaleType简介

ImageView的ScaleType决定了图片在ImageView中的缩放形式。本文从ImageView的源码角度,结合图表展示不同ScaleType状态下图片的展示形式。ImageView的ScaleType有MATRIX,FIT_XY,FIT_START,GIT_CENTER,FIT_END,CENTER,CENTER_CROP,CENTER_INSIDE八种格式。当用户在设置了ImageView的ScaleType后,ImageView会根据ScaleType的值进行图片的缩放,代码实现在Ima

2020-12-04 18:00:49 613

空空如也

空空如也

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

TA关注的人

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