- 博客(17)
- 资源 (1)
- 收藏
- 关注
原创 Window与WindowManager
WindowWindow表示窗口,比如可以实现桌面或者锁屏上的类似悬浮窗的效果,Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,实际上他们都是附加在Window上的,WindowManager提供了对这些Window的统一管理功能Window与WindowManager的联系为了分析Window的工作机制,需要先了解如何使用W...
2019-07-21 17:15:53 198
原创 控件的高级属性(二)
GestureDetector.SimpleOnGestureListener类首先它是一个类,在他的基础上新建类,要使用ectends派生 ,而不能用implements继承在其中的方法并不需要全部进行重写,需要什么就可以直接重写什么eg:public class SimpleOnGestureListenerActivity extends AppCompatActivity im...
2019-07-21 16:03:29 190
原创 CircleImageView的使用
简介:实现对一个图片进行圆形切割,并作为头像使用,因为在使用的过程中涉及备份到云端,那么就会出现重新加载的图片出现毛边,为了解决毛边的问题,在头像的周围添加一个圆框即可,在github上有一个开源控件叫做CircleImageView可以很好的实现圆形边框使用:在build.gradle的dependencies中加入dependencies { .... impl...
2019-07-21 14:43:36 1629
原创 控件的高级属性(一)
手势检测当用户触摸屏幕的时候,会产生很多的手势,如up,down,scroll, fling等处理简单的手势:View类有一个View.onTouchLiatener内部接口,通过重写他的onTouch(View view, MotionEvent event)函数,可以处理一些touch事件,但是这个函数只限于处理简单手势处理复杂手势:Android SDK提供给我们...
2019-07-15 23:06:35 173
原创 MMKV组件实现原理以及和SharedPreferences的比较(二)
MMKV数据结构上面提到的SharedPreferences使用的是xml来进行文件存储的<map> <int name = "4970" value="4970"/> <int name = "4971" value="4971"/> <int name = "4972" value="4972"/> <...
2019-07-09 19:50:40 613
原创 Java Stream使用
循环遍历的弊端得益于lambda表达式所带来的函数式编程引入了Stream的概念Java8 Lambda表达式专注于做什么而不是怎么做,针对for循环语句可以发现:for循环的语法就是“怎么做”for循环的循环体才是“做什么”Stream写法/*使用Stream流的方式,遍历集合二,对集合中的数据进行过滤*/public class DemoStream { ...
2019-07-09 15:10:54 263
原创 MMKV组件实现原理以及和SharedPreferences的比较(一)
MMKV组件简介MMKV项目地址MMKV是基于mmap内存映射关系的key-value组件,底层序列化/反序列化使用protobuf实现。性能高,稳定性强。从2015年就在微信上使用,已经移植到了Android/MacOS/Windows平台SharedPreferences实现原理SharedPreferences是Android提供的一种使用XML文件保存内容的机制,内部通过XM...
2019-07-08 21:47:43 1038
原创 Android APP编译流程
Android Gradle plugin的具体流程首先上一张官方的图:[外链图片转存失败(img-QMFtfIiX-1562588711680)(en-resource://database/5304:1)]首先通过aapt打包res资源文件,生成R.java、resources.arsc和res文件(二进制&非二进制保持原来的代码)处理.aidl文件,生成对应的Java接...
2019-07-08 20:26:09 800
原创 测量与布局
ViewGroup的绘制流程绘制流程分为三步:测量、布局、绘制,分别对应onMeasure(), onLayout(),onDraw()onMeasure():测量当前控件的大小,为正式布局提供建议(只是建议,至于上是否适用,要看onLayout()函数onLayout():使用layout()函数对所有子控件进行布局onDraw():根据布局的位置绘图onMeasure()函数与M...
2019-07-08 17:59:20 310
原创 封装自定义控件
自定义属性与自定义Style利用XML中的declare-styleable标签来实现自定义属性,下面是declare-styleable标签的使用方法:自定义控件的步骤自定义一个类MyTextViewimport android.content.Context;import android.widget.TextView;/*** Created with Android ...
2019-07-05 21:14:04 489
原创 ANR产生原因以及分析工具
ANR产生原因:只有当应用程序的UI线程响应超时才会引起ANR,超时原因:当前事件没有机会得到处理当前的事件正在处理,但是由于耗时太长没能及时完成引发ANR的原因;View的按键事件或者触摸事件在5s内无法得到响应BroadcastReceiver的onReceive()函数在10s内没有得到处理Service各个生米周期函数在20s内没有得到处理典型的ANR场景分...
2019-07-05 11:30:54 808
原创 Matrix与坐标变换
ColorMatrix色彩变换对于色彩的存储,Bitmap类使用一个32位的数值来保存,红,绿,蓝以及透明度各占8位,每个色彩分量的取值范围是0~255,透明度为0表示完全透明,为255时色彩完全可见色彩矩阵的表示:由于一个色彩信息包含R、G、B、Alpha信息,所以,必须使用一个四阶色彩变幻矩阵来修改色彩的每一个分量,对于色彩矩阵来说色彩顺序是R、G、B、A如果想要原有的R色上增加...
2019-07-04 20:36:42 1069 1
原创 双缓冲技术解决方案
解决方案一:保存索要绘制的内容,全屏重绘:为了防止每次画布上绘制的,第一种解决方案是:每次将我们绘制的内容都保存起来,下次拿到画布时,把这些绘制的内容全部重新绘制一遍,但是这种方案主要用于比较简单的绘图上private void drawText(final Surfaceholder holder){ Canvas canvas = holder.lockCanvas(); ...
2019-07-04 17:28:14 253
原创 lambda表达式
lambda简介什么是lambdaJava8添加的新特性,lambda是一个匿名函数为什么使用lambda使用lambda可以对接口进行非常简洁的实现lambda对接口的要求虽然可以使用lambda可以对某些接口进行简单实现,但是接口中只能定义一个抽象方法不可以多于或者少于一个。在Java8对接口增加了一个新特性:default, 对接口中的方法进行修饰,被修饰的方法在接口...
2019-07-03 21:40:09 255
原创 双缓冲技术局部更新原理
SurfaceView支持局部更新,可以通过Canvas lockCanvas(Rect dirty)函数指定获取画布的区域和大小,画布以外的地方会将现在屏幕上的内容复制过来,以保持与屏幕一致,而画布以内的部分将会保持原画布的内容:lockCanvas():用于获取整个画布的内容,屏幕内容不会被更新到画布上,画布保持原画布内容(不会进程当前屏幕内容,只保持所有在自己上面所画的内容利用unloc...
2019-07-03 20:06:23 376
原创 SurfaceView使用与双缓冲技术
为什么引入SurfaceViewAndroid屏幕刷新时间是16ms, 如果View在16ms内完成所需要执行的绘图操作,那么在视觉上,界面是流畅的,否则就会出现卡顿,View,ViewGroup,Animator的代码执行全部是在主线程中完成的,当执行大量逻辑代码的时候,轻则卡顿,甚至会发生ANR问题,所以一般会使用Handler和AsyncTask,但是同时也会加大代码的复杂度,为了解决逻...
2019-07-02 21:29:19 749
原创 Bitmap静态方法
Bitmap静态创建方法static Bitmap createBitmap(int width, int height, Bitmap.Config config);static Bitmap createBitmap(Bitmap src);static Bitmap createBitmap(Bitmap source, int x, int y, int width, int hei...
2019-07-01 15:42:00 342
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人