自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 在Ubuntu18.0.4系统装nvidia显卡驱动

最近因为项目里面要用到ros做东西,在笔记本上面装了双系统win10和Linux,一开始笔者装的是Ubuntu16.0.4,装好了之后发现连不了WiFi(只能连宽带),问了一下其他人并没有这个问题,排查原因发现是笔者电脑和16.0.4不太兼容,故最后装了Ubuntu18.0.4系统,成功解决了WiFi连接的问题。但是每次开机选择系统之后都要按e再输入nomodeset才可登录,如下:原因是Ubu...

2020-06-16 10:23:31 617

原创 Android开发实现一个简单好用的倒计时按钮(Kotlin)

能坚持做自己喜欢的事情也是一种幸福。最近项目需求里面遇到了一个很常见的需求:根据邮箱地址获取验证码,过一段时间(通常是60s)后才能再次获取,效果如下:在网上找了一些倒计时按钮相关的文章,感觉写的逻辑并不是很清晰,于是便自己写了一个分享出来,提供给也有类似需求的朋友们。这个需求实现起来非常简单,采用自定义 View 的方式,首先我们创建一个 TimerButton 类继承自 MaterialButton(实现圆角按钮效果非常简单),当然如果继承自普通的 Button 也没什么不行,可以通过 shap

2021-01-18 14:42:56 1640 2

原创 Android开发自定义Banner实现图片无限轮播效果

之前做过的很多项目都用到了 Banner,不过每次项目做完都忘了总结导致每次要实现 Banner 效果都要上网查,网上的文章真的是鱼龙混杂,因此今天花点时间好好总结一下实现 Banner 的原理。首先我们来看看要实现的效果:实现 Banner 的思路很简单,其本质就是封装了一个 ViewPager,然后用定时任务来控制 ViewPager 的位置,再给 ViewPager 设置一个监听器,当页面改变时控制下面指示器的变化即可。因此我们分为两个大的步骤:用 ViewPager 实现轮播效果 和 添加底

2020-12-06 09:36:07 1518 2

转载 ThreadLocal源码分析

文章转载自并发容器之ThreadLocal详解ThreadLocal简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程进行阻塞等待,很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临界区共享资源进行操作,那么,如果每个线程都使用自己的“共享资源”,各自使用各自的,又互相不影响到彼此即让多个线程间达到隔离的状态,这样就不会出现线程安全的问题。事实上,这就

2020-09-09 21:45:46 196

原创 Android异步消息处理机制分析(图文)

异步处理机制的作用提到Android异步处理机制,我们首先会想到Handler,而大多数Android初学者对于Handler的作用仅局限于子线程如何更新UI这一方面。其实Handler能做的事情远不止于此,它贯穿于Android应用的整个生命周期,如果没有Handler,我们编写的应用就无法正常运行。总的来说,它的作用体现在两大方面:处理延时任务(告诉app在将来的某个时间执行某个任务)线程之间通信(子线程更新UI就是其中的一个应用)角色分析与流程描述与Android异步处理机制相关较为重要

2020-09-07 17:16:29 352

原创 HashMap源码分析(JDK12.0.2)

1、HashMap的由来提到存储数据,我们首先会想到数组,然而数组一旦确定其长度就不可变化,所以将数组封装成了类ArrayList(线性表)。ArrayList虽然对外提供了增删改查等操作,但是由于其内部还是数组,因此增加和删除的操作效率并不高。为了提高增删的速度,链表诞生了,然而链表数据结构在内存空间并不是连续的,所以其查询速度较慢。而HashMap内部是哈希表结构,采用数组+链表+红黑树(JDK1.8新增红黑树)的方式,使其既有数组的特点(查询速度较快),又有链表的特点(增删速度较快),因此HashM

2020-08-30 10:30:22 122

原创 LinkedList源码分析(基于JDK12.0.2)

与ArrayList类似,LinkedList也是一种常用的集合类,本文将结合源码来分析LinkedList的工作原理。不同于ArrayList,LinkedList内部维护了一个双向的链表,每个节点如下代码所示: private static class Node<E> { E item; //本节点存储的数据对象 Node<E> next; //尾指针,指向该节点的下一个节点 Node<E> prev; /

2020-08-26 17:16:58 111

原创 ArrayList源码分析(基于JDK12.0.2)

ArrayList是Java集合框架中一个很重要的类,开发时如果不知道要用什么集合类那就可以使用ArrayList(当然最好还是要熟知每个集合类的特点和应用场景),因为它的适用性最高,能满足大部分的需求。本文将从源码的层面上分析ArrayList的工作原理。ArrayList的几个重要字段 //默认的容量 private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA =

2020-08-24 17:18:27 87

原创 Android开发LayoutParams知识点总结

在Android开发中,LayoutParams使用的场景相对来说比较少,总结一下也就三大方面:一是自定义ViewGroup时要获取子元素的LayoutParams来完成测量和布局流程;二是动态的给ViewGroup添加一个子View;三是动态改变子元素布局参数来实现滑动效果。虽然说它的使用频率并不高,但是它对我们深入理解View的工作原理上具有重要的作用,本文将结合源码介绍LayoutParams的相关知识。LayoutParams是什么,有什么用LayoutParams翻译成汉语就是布局参数,每个控

2020-07-31 16:41:13 773

原创 Android开发自定义ViewPager以及滑动冲突的分析与解决

在前两篇文章中分别介绍了Android事件分发机制和3大流程,本文将自己实现一个自定义ViewGroup来深刻理解一下这些知识点的用法。自定义简易的ViewPager不多bb,首先来看效果图:很简单的效果,手指左右滑动时会将容器中的内容拖动,手指松开之后可以自动翻页,也就是一个简易版ViewPager的效果。在看代码之前要先说一个前提,就是这个自定义的ViewPager在宽度方向上不能设置为wrap_content的。这是因为ViewPager中滑动的子元素宽度都必须设为match_parent,否

2020-07-28 18:39:55 560

原创 View三大流程分析

View的三大流程指的是测量(measure)、布局(layout)和绘制(draw),我们可以通过生活中的一个例子来理解其过程。比如说现在有一个空房子要装修,那么首先要做的事情就是测量一下要往里面放置的家具的尺寸(measure),接着就要画一张设计图来设计一下具体的每个家具应该摆放在什么位置(layout),最后就要将家具摆放到该设计的位置上面了(draw)。然而,View和ViewGroup的三大流程具体的实现又有所不同。测量流程:对于View来说测量过程就是简单的测量自己的尺寸,而ViewGr

2020-07-26 16:57:42 1063

原创 Android事件分发处理机制源码分析与知识点总结

在Android开发中,事件分发与处理机制是一个重要知识点,在自定义View、处理滑动冲突中具有重要的意义。本文在总结了其机制的基础上,对其源码进行了分析。事件既然是事件分发和处理,那么首先来说说事件。根据面向对象的思想(万物皆对象),在手指接触屏幕产生了触摸事件时,它自然就被封装成了一个对象,这个对象对应的类是MotionEvent。最常见的事件类型有以下3种:ACTION_DOWN —— 手指刚触摸屏幕产生的事件ACTION_MOVE —— 手指在屏幕上滑动产生的事件ACTION_UP——

2020-07-17 14:37:29 212

原创 Java字符串知识点总结

1、String的创建1.1、普通创建方式和new关键字创建的区别String最常用的创建方式就是:String a = "abcd";使用这种方式创建字符串时,jvm首先会在字符串常量池中检查是存在该字符串,如果有则将该对象的地址赋给它的引用a;若不存在则jvm会在常量池中创建这个字符串对象并将地址赋给a。还有一点需要明确:字符串一经过创建就不会改变。在这个基础上加入:a = "xxx";虽然a被指向了xxx,但是原来的abcd却没有变,只是jvm又在常量池中创建了新的xxx,然后让a指向

2020-07-07 12:23:06 278

原创 一个例子看懂Activity和AppCompatActivity视图层级结构

在之前的文章AppCompatActivity#setContentView源码分析和Android开发Activity的setContentView源码分析中已经介绍了Activity和AppCompatActicity的setContentView加载视图的流程,本文通过一个小例子来看看它们两个的视图层级到底是怎样的。新建一个工程,布局里面代码如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=

2020-06-22 14:44:35 472

原创 AppCompatActivity#setContentView源码分析

在我的上一篇文章Android开发Activity的setContentView源码分析中介绍了Activity的setContentView源码,但是我们在开发过程中用的基本都是AppCompatActivity,那么让我们看看AppCompatActivity的setContentView方法跟Activity的setContentView方法有什么不同。首先来回忆以下Activity的setContentView方法中有两个很重要的东西:mDecor和mContentParent。前者是整个界面的根

2020-06-21 14:58:14 266

原创 Android开发之LayoutInflater及其源码分析

LayoutInflater的inflate方法是在Android开发中常用到的一个方法,不过它的参数却让很多初学者很头疼,不知道它们分别代表什么含义,本文结合了其他几篇博客做出了一个总结。inflater方法有以下4个重载的方法如下:public View inflate(int resource, ViewGroup root)public View inflate(int resource, ViewGroup root, boolean attachToRoot) public View

2020-06-16 10:14:57 356

原创 Android开发Activity的setContentView源码分析

一个Activity是如何显示界面的呢?要从Activity中的setContentView开始分析(用的源码是Android9.0源码):点进Activity的setContentView方法public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar();}可以看到,Activity中的setCo

2020-06-14 19:35:56 260

原创 使用Source Insight查看Android系统源码

源码在哪里?如果安装好了Android Studio,则系统源码则位于Android SDK里面,如下(我自己的路径)在Source Insight中选择project点击New Project:第一个输入框让输入项目名称,随便起一个就行;第二个框是选择项目存放的目录,如果没有特殊需求默认就行,然后点击ok,弹出下面的对话框:这个不用管,直接ok,弹出下面的框:这里就要吐槽一下它的UI设计了,它默认的目录是C盘而我的SDK是装载了F盘,但是它的面板上却没有选盘的按钮。我弄了好半天才明白,首

2020-06-11 12:35:20 1046

原创 Android开发build.gradle文件详解

不同于eclipse,AS是用Gradle来构建项目的。Gradle是一个很先进的项目构建工具,使用了基于Groovy的领域特定语言(DSL)来进行项目设置,摒弃了传统基于XML(如Maven)的各种繁琐配置。最外层目录下的build.gradle文件:buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.

2020-06-10 17:10:38 401

原创 Android开发自定义开关实现

最近Android开发中遇到了一个开关的需求,就自己绘制了一个。不多bb,直接看效果图:由上图可看出,空间上方和下方由两个TextView构成,属于Android系统控件就不谈了,接下来介绍中间的自定义开关的绘制原理。先贴出完整代码,如下:public class SlideButton extends View { public interface OnChangeListener { //回调接口 void onChanged(); }

2020-05-25 17:36:53 321

空空如也

空空如也

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

TA关注的人

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