自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 资源 (3)
  • 收藏
  • 关注

原创 安卓 半透明画笔 重叠

默认情况下,画笔设置成半透明,当两段重叠的时候,就会有重叠部分加深的情况导致的原因是默认情况画笔的Xfermode为PorterDuff.Mode.SRC_OVER模式,改成PorterDuff.Mode.SRC模式就能使得重叠部分不加深别忘了要设置画笔的模式,一定要把禁止硬件加速,否则画笔的颜色可能就不对了...

2020-10-29 19:28:45 9

原创 startForeground如何去掉通知栏

在调用startForeground之后马上调用stopForeground(true);完整的就是这样:startForeground(1, new NotificationCompat.Builder(this, CHANNEL_ONE_ID).build());stopForeground(true);

2020-08-18 18:16:10 180 3

原创 安卓应用有几个context

最近看源码看到Context这一块,发现很多网上的博客对“安卓应用有几个context”这一个问题统一给出的答案是:Activity数量+Service数量+1我通过源码的分析发现根本不是这样,Context的数量应该是:2*(Activity数量+Service数量+1)要搞清楚这个问题就需要研究Activity和Application的生成了,Activity和Application的生成都位于ActivityThread的performLaunchActivity方法源代码:Contex

2020-08-11 20:01:03 129

原创 NDK学习(七)实现马赛克功能

之前在网上查找如何对图片进行打码操作,大多数的实现方式都是利用高斯模糊之类的方法来实现打码,最终在GPUImage里面找到了像素块那种形式的马赛克,不过GPUImage是用opengl实现的,因此在这里使用c来实现马赛克功能。像素块马赛克的基本思想是一个大的马赛克像素块里面的颜色是一样的,比如在一个30*30的区域内,统一使用左上角的像素值来表示整个马赛克像素块的颜色值。实现最终效果:代码:void mosaicBitmap(JNIEnv *env, jobject thiz, jobject b

2020-06-15 18:29:37 97 1

原创 安卓 TextView显示温度符号

在Java中有一个用于摄氏度的Unicode符号: \u2103 。 对于华氏你可以使用\u2109 。示例代码: temperatureValue.setText((result) + " \u2109"); 如果你只需要度(○)圆形符号,你可以复制下面的代码 char tmp = 0x00B0; temperature.setText("60"+tmp); ...

2020-05-20 09:52:43 191

原创 为什么ButterKnife需要在注解中使用R2

在多模块中使用ButterKnife,在bindView的时候需要使用R2而不是R,这是什么原因呢?这需要了解多模块项目是如何构建的。在构建多模块的时候,首先单独编译每一个模块下面的文件,然后根据每个模块编译之后的产物进行打包,其中一个比较重要的流程就是对资源的合并。因为最终所有模块的资源都需要提取到apk的res文件夹下面,因此这时就需要对各种资源进行分类,分配id号。如果有相同名称的资源,只会保留一个,因此资源在命名的时候,最好加一个前缀,这样可以大大降低资源的冲突率。相同的道理,我们使用到的R.id.

2020-05-15 20:27:56 229

原创 编译时注解代码的编写

现在很多三方库使用了apt技术,使得我们能够在编译的时候就获得代码的信息,从而能够根据现有的代码生成一些新的代码,比如ButterKnife就会生成Activity,从而免去了去写重复的findViewById函数;Glide在编译的时候会获取GlideModule注解的类,从而在配置Glide的一些参数;还有我这里推荐一个省去写Parcelable序列化内部每个成员的write/read方法的库ParcelableGenerator,这个库也是使用另外apt技术,在编译的时候生成一个类,运行时用这个类来进

2020-05-11 21:31:01 97

原创 Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZTINSt6__ndk18ios_b

今天更新一个库文件到项目上,编译是正常的,但是运行的时候报了这样一个错: Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZTINSt6__ndk18ios_baseE" referenced by "/data/app/com.tclhz.gallery.dev-jbo9-...

2020-04-26 19:53:24 418

原创 Mat数据结构

最近开始opencv的学习,首先就要从opencv的矩阵开始学起了。opencv的矩阵是用Mat这个对象来存储的,并且提供了一些访问矩阵属性的函数,比如获取行数、列数、获取步长等等。矩阵的内存分布Mat的在内存中是线性存储的,矩阵是多维的,因此在存储矩阵数据的时候,需要将矩阵的分布变成线性的才行。例如二维数组,那么在内存中就是先存第一行,再存第二行,依此类推。相应的三维矩阵可以看成是多个二维矩...

2020-04-09 23:52:37 69

原创 NDK学习(六)C++的虚函数实现原理

谈到C和C++最大的不同之处,恐怕就是C++的多态了,通过一个基类指针调用函数的时候,能够知道根据具体的对象去调用合适的函数,如果是Java的话,因为有jvm的存在,我们可以脑补出这样一个画面,基类指针p指向一个对象,首先我们可以判断这个对象的类型,在Java中判断类型是很好实现的(类的信息储存在对象头中),获取到类信息之后,就沿着这个类的继承层次往上找,直到找到一个相同方法签名的方法。那么这个过...

2020-02-18 00:14:08 62

原创 NDK学习(五)C++的sizeof操作符

上一篇中已经提到了由于cpu的寻址特性,导致只能读取某些地址的数据,因此就有了一个对齐的概念,编译器会为我们的程序中私自添加一些填充数据,使得对象在内存中能够对齐,从而获取更佳的存取速度。C++中获取一个对象大小的操作符,之所以说是操作符,因为sizeof并不是一个语句,而是一个C++的内置操作符,sizeof的值在编译的时候,就已经定下来了,不需要等到运行时,通过sizeof来学习C++中数据...

2020-02-17 22:10:11 63

原创 NDK学习(四)C++开篇

之前学习过C++,但是几乎都忘的差不多了,连语法好多都忘了,因此就C++几个重要的点复习一下,顺便深入C++的内存模型来探讨C++和C有什么区别和共同点,C++的多态实现和Java的多态有什么不同,另外就C++的一些专有特性写一些文章,比如:模板、运算符重载、STL模版库、复制构造函数等。其实从编译得到的可执行文件来讲,C和C++并没有什么不一样,都是二进制代码,访问变量,就是到相应的地址获取变...

2020-02-17 21:12:24 54

原创 NDK学习(三)从Parcel源码学习如何创建自己的JNI层对象

上一篇中学到了jni和java中的类型和函数是如何对应的,这一篇讲一下如何定义自己的Java类型,使得JNI层也能对应上。1、jni函数的静态注册和动态注册java函数与jni函数能够对应起来是jvm在其中做工作的,之前我们已经知道根据java方法名称和ID,能够拼凑出一个jni层对应的方法,只要我们在编译的时候实现了这个方法,那么jvm就能够识别,准确的将java方法和jni函数匹配。但是这...

2020-02-12 22:58:43 111

原创 NDK学习(二)认识jni的类型

C要和Java进行交互,那么他们之间必然要进行数据的交流,那么C中如何获取到Java中的数据呢?这就是本篇需要介绍的核心。推荐一个网站https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html这个网站是jni的官方文档类型分两种,Primitive和引用类型。这两种类型的对照表如下:其实查看代码得...

2020-02-11 19:04:37 81

原创 NDK学习(一)向现有安卓项目加入jni

做安卓半年了,用的都是java,目前老大分配了一个任务,在现有项目上添加图片的滤镜功能,使用滤镜一般计算量比较大,需要用到NDK,也就是C相关的知识,虽然之前学过C/C++,但还没用到过项目中,尤其还要用到安卓中,这一篇算是为NDK学习开个头。如何使得现有项目支持NDK呢?首先就是要下载NDK相关的工具链,然后加入C文件。1、首先我们在MainActivity中假如一个getNdkText的...

2020-02-11 18:15:08 83

原创 安卓动画(四)Recyclerview ItemAnimator(下)

这一篇就实现下面两种效果:实现之前,就是要对系统为我们实现的DefaultItemAnimator这个类进行改造,自己仿照写一个BaseItemAnimator,再在这个类的基础上,自定义我们自己的各种各样的动画,以add动画改造进行举例,DefaultItemAnimator中关于add动画有两个方法:animateAdd和animateAddImpl@Override public...

2020-01-05 16:38:45 73

原创 安卓动画(三)Recyclerview ItemAnimator(上)

前面讲了补间动画、Transition动画,属性动画,这一篇讲一讲和Recyclerview相关的动画。Recyclerview里面有一个类ItemAnimator专门用来管理每个item变化时所对应的动画,当item被删除、添加、位置发生变化时,相应的动画就会被调用,从而给用户更好的体验,这一篇就原理、流程做一个大概的介绍。由于ItemAnimator的流程还是比较复杂的,因为和recycl...

2020-01-05 14:58:21 90

原创 安卓动画(二)transition动画

本来此篇是想介绍属性动画的,但是属性动画还是比较简单,大致就是创建一个变化区间,然后监听屏幕的刷新,屏幕每刷新一次,就向主线程Looper中发送一个任务,用来设置属性的值。和前面补间动画最大的区别是补间动画是view层级的,在view绘制时,就会对view实行动画,而且补间动画只是view的影子,不是真正的view属性变化,并且补间动画继承的是Animation这个类。属性动画是真正的view属性...

2019-12-27 18:27:16 66

原创 安卓动画(一)补间动画

最近项目上要实现一个动画,不过这个动画做起来比较难,一是要跟随手势,另外涉及到多个view,不能通过简单的属性动画实现,目前思路应该可以用Scene动画实现,但是又要做到跟手这就比较麻烦了。不过还好这个需求不急,趁这段时间把动画的整个框架过一遍,挖一挖动画的实现代码,说不定写完这个系列,我那个问题自然而然就解决了。安卓动画主要分三种,补间动画、帧动画和属性动画,补间动画直接作用于view,也就是...

2019-12-19 21:49:59 39

原创 安卓手势处理(五)案例

系列文章:安卓手势处理(一)view的位置信息安卓手势处理(二) MotionEvent安卓手势处理(三)之实现图片的放大和缩小安卓手势处理(四)之Fling这一篇文章结合之前讲的内容实现一个案例,效果如下:上面的效果封装在了ZoomImageView中,demo地址:https://github.com/whoami-I/GestureZoomImageView主要功能有:...

2019-12-18 11:44:39 59

原创 安卓手势处理(四)之Fling

概述上一篇讲到了手势放大图片,当图片超出边缘的时候,我们需要进行滑动,滑动分为两个部分,一个是跟随手指的移动,另一个是手指离开时,view还会进行一个继续滑行的动作,称之为Fling。跟随手指的移动还是很简单的,就是根据手指移动多少,view就相应移动多少,fling相对就要麻烦一点,这一篇就来讲讲如何实现如丝般顺滑的Fling操作。首先我们想到的Fling肯定是使用动画来实现,其实还有更简单...

2019-12-13 14:22:12 156

原创 Handler、Looper、MessageQueue、Thread一探究竟

先说Handler、Looper、MessageQueue,这三者之间的关系还是比较简单的,Looper是消息的执行者,可以认为是代码的执行者,因此这个类和线程结合最紧密;MessageQueue就没什么说的了,就是存放消息的队列,主要用于管理消息,Handler这个是我们平时接触最多的,因为它决定如何处理消息,比如来了一个“闹钟”消息,那么我们就起床,来了一个“下班”消息,我们就下班,这个和具体...

2019-12-10 16:00:39 40

原创 java中的强引用、软引用、弱引用和虚引用区别

最近在项目中遇到了内存泄漏的问题,发现LeakCanary报出的引用链看不懂,没办法看不懂报出的错误就先研究一下源代码吧。通过查看LeakCanary的源代码发现这个东西的原理和弱引用有关系,之前也一直没搞懂软引用、弱引用和虚引用到底有什么卵用,今天算是真正看到了他们的用处了。引用的类型强引用:这个不用说了,一般我们都是使用这种引用的,只要一个对象有强引用那么jvm一定不会回收这个对象,如果内...

2019-12-10 09:55:09 53

原创 安卓手势处理(三)之实现图片的放大和缩小

这一篇来实现下面的效果:其实上面的效果可以用ScaleGestureDetector很容易实现,不过在这里我想自己动手实现一下这个简单的功能,然后在后面用GestureDetector来实现更全面的效果,并且封装成一个可支持手势放大缩小的Imageview。ImageView的缩小放大是基于Matrix的,这个类其实是一个矩阵,放大、缩小、位移、旋转其实就是矩阵变换操作。具体可以看这篇文章:...

2019-12-05 22:06:13 126

原创 安卓手势处理(二) MotionEvent

上一篇文章确定了view的位置,这一篇就来讲一下view是如何分辨多个手指的点击事件。MotionEvent事件的信息就是封装在MotionEvent这个类之中的,包含事件类型(Action),手指id(pointerId),手指索引(index),事件发生的坐标信息(x,y)。获取事件坐标位置API:getX() //获取相对于该view显示区域左上角的位置xgetY() ...

2019-12-04 21:48:23 71

原创 安卓手势处理(一)view的位置信息

最近需要为项目加入手势处理,所以就有了这个系列,一来总结之前的知识,而来学习新东西,并记录之。view的位置信息由这么几个成员变量规定:mLeft mTop mRight mBottom 这四个变量规定了位于父view中的位置,分别表示距离父view 左上右下的距离。另外还有设置三个方向上偏离的距离方法:setTranslationX()setTranslationY()setTran...

2019-12-04 18:27:56 62

原创 CoordinatorLayout系列(五)例子

这一篇讲两个例子,实现如下效果;demo地址:https://github.com/whoami-I/CoordinatorLayoutExample第一个是ToolBar能跟随手指的上下滑动而产生渐变的效果,而不是默认的动画,默认效果是达到某个阈值之后,就执行一个动画把ToolBar变成绿色。实现起来也很简单,就是运用AppBarLayout的OnOffsetChangedListene...

2019-11-27 20:54:22 142

原创 CoordinatorLayout系列(四)CollapsingToolbarLayout

终于到CollapsingToolbarLayout这个强大而装逼的布局了,这个布局的实现和原理都是非常的简单,比如下面的效果:是不是很酷?当然这还是比较简单的,这仅仅是使用到了系统自带的一些功能,通过自定义可以实现更复杂的效果。demo地址:https://github.com/whoami-I/CoordinatorLayoutExample先讲实现的方式,再讲实现的过程。实现原理...

2019-11-27 11:19:30 132

原创 java.util.ConcurrentModificationException异常原因及解决方法

今天项目上报了一些bug,通过查看log发现是ConcurrentModificationException,这个错误之前见过,也知道是遍历list时同时修改了list导致的,但是对其中的原理还不是很清楚,正好借今天的机会学习一下里面的机制。ArrayList里面有一个变量modCount,专门用来记录该ArrayList被改变了多少次,增删、排序、replace这些改变链表的操作都会导致这个变...

2019-11-25 21:43:21 98

原创 CoordinatorLayout系列(三)AppBarLayout之layout_scrollFlags

在上一篇文章里面CoordinatorLayout系列(二)AppBarLayout里面讲到了AppBarLayout的使用,这一篇准备讲一下AppBarLayout是怎么通过layout_scrollFlags控制child view的滑动,以及各种flag产生的效果。一、Flags种类Flags在代码里面具体位于AppBarLayout的LayoutParams中:public Layo...

2019-11-24 18:45:02 271

原创 CoordinatorLayout系列(二)AppBarLayout

这一篇文章结合AppBarLayout来实现头部滑动的跟随。先看实际效果:上面就是实现了recyclerview和ToolBar的联动效果。其实要实现这个功能很简单,因为CoordinatorLayout和AppBarLayout将大部分功能实现了。布局文件:<?xml version="1.0" encoding="utf-8"?><androidx.coordi...

2019-11-24 15:18:57 138

原创 pip安装requests到指定目录

pip install --target=安装目录 安装模块名sudo pip3 install --target=/usr/local/lib/python3.7/site-packages/ requests

2019-11-09 18:35:57 456

原创 python编译出错:Could not build the ssl module! Python requires an OpenSSL 1.0.1

原文链接:https://blog.csdn.net/devalone/article/details/82459276在编译python3.7的时候有一个错误,这个错误是ssl模块不能编译,版本不对,虽然说python仍然能使用,但是不能使用https协议,这对于如今的网络环境肯定是不行的,下面介绍博主是如何解决这个问题的。下载libressl ,代替openssl,下载地址:https:/...

2019-11-09 17:35:05 1448

原创 CoordinatorLayout系列(一):Behavior

CoordinatorLayout是google在Material Design上提出的一个布局样式,这个布局的主要功能就是实现一个view跟随另一个view变化,具体变化逻辑,由Behavior来实现,一个好的跟随效果可以展现出很酷的动画,因此这个系列就从Behavior入手,来剖析CoordinatorLayout的细节。一、使用方法首先摆出效果:功能就是实现一个球跟随另一个球移动,两...

2019-11-06 21:19:17 106

原创 Toolbar的使用

1、首先在配置文件中加入Toolbar控件<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" an...

2019-11-04 22:03:05 250

原创 Recyclerview缓存机制分析

最近做项目的时候突然想到一个问题,就是在项目里面使用了多种ViewHolder,但是在onBindView这个方法中,RecyclerView是如何知道我在哪个位置需要的是哪种ViewHolder呢?就这个问题趁机看了一下源码,终于找到了答案,原来RecyclerView的缓存机制是区分type的,也就是Recyclerview.Adapter.getItemViewType()这个方法的返回值来...

2019-11-01 14:20:43 70

原创 安卓 ViewTreeObserver源码分析

今天在写程序时报了一个这样的错:This ViewTreeObserver is not alive, call getViewTreeObserver() again原因是我在Activity的onCreate方法中这样写的:ViewTreeObserver vto = recyclerview.getViewTreeObserver(); vto.addOnGlobal...

2019-10-29 20:43:39 514

原创 安卓 ImagView的ScaleType

今天做一个应用加载图片,发现图片的位置没有占满整个ImageView,发现是ImageView的ScaleType属性没有设置,一般将ScaleType属性设置成centerCrop,关于ImageView的属性可以查看这篇文章:https://blog.csdn.net/u012702547/article/details/50586946/我们从源代码的角度来看,ImageView是在哪里...

2019-10-29 16:28:35 51

原创 如何设置安卓状态栏文字颜色

google原生的修改方式:<item name="android:windowLightStatusBar">true</item>只需要在主题中添加这个属性就可以将状态栏颜色变成黑色,设置为false颜色变白。不过这个属性在API23上才有用...

2019-10-18 09:45:53 92

原创 如何优雅的申请sd卡权限

在上一篇文章安卓如何申请sd卡权限并写入文件已经解决了向sd卡里面写入文件的问题了,解决办法需要startActivity,然后在onActivityResult方法里面去监听是否授权成功,这种方法对当前Activity的侵入性太强了,如何优化呢?我的想法来自于rxpermission和glide,我们知道rxpermission申请权限非常简单,只需要这么几句就搞定了:RxPermissio...

2019-09-20 21:22:18 611

android生成xml

android下面使用Stringbuffer生成xml文件,可以用来做短信备份

2018-10-24

Learning_the_vi_and_vim_Editor

vi is a powerful editor that is ubiquitous amongst Unix and Unix-like operating systems, but is available on many other operating systems, even on MS-DOS, Windows and the Macintosh. If not the original vi, there is usually at least a good clone available that runs on your system. Even if you use another editor you must have a passing knowledge of vi as an administrator. Sometimes vi is the only editor available when your computer crashes leaving a minimal system for you to repair.

2018-10-09

深入理解linux内核架构pdf_中英文

深入理解linux内核架构First and foremost, I have to thank the thousands of programmers who have created the Linux kernel over the years — most of them commercially based, but some also just for their own private or academic joy. Without them, there would be no kernel, and I would have had nothing to write about

2018-08-27

空空如也

空空如也

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

TA关注的人 TA的粉丝

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