- 博客(159)
- 资源 (6)
- 收藏
- 关注
原创 RecyclerView实现选中的item居中
实现:(1)LinearShapHelper可以实现控件自动修正至居中,但由于惯性加速度的影响使得目标view并非是距离中心位置最近的那个,需要重写findSnapView方法,实现指定我们想要选中的view(2)由于每个item的宽度都比RecyclerView小,二、(1)抬起手指时,能够让距离RecyclerView中心位置最近的控件正好居中(2)惯性滚动最多只能滚动1个item。实现:设置第1个item的左边距和最后一个item的右边距。PagerShapHelper无效。
2024-03-24 00:58:47
1664
原创 RecyclerView滑动辅助
前言:LinearSnapHelper:滑动结束时让最靠近中间的位置的子条目居中;PagerSnapHelper不仅带有LinearSnapHelper居中的效果还带有ViewPager的效果,每次只能滑动一页(即快速滑动无惯性效果,而LinearSnapHelper则可以惯性继续滑动)
2023-09-07 10:20:05
286
原创 协程
一、a、b、c串行(launch效果同线程:对于{}内的代码顺序执行,与外层d并行,而不是当执行a挂起后才跳转到{}外执行d)注:a或b发生异常时父协程不会终止,但由于收不到子协程的结果导致一直等待,c无法执行。注:a或b发生异常时会导致父协程终止,从而导致其他子协程也都终止。1、launch + join方式。2、async + await方式。三、a、b并行,当都完成后执行c。
2023-08-10 23:49:00
179
原创 NumberPicker注意事项
2、displayedValues:自定义显示内容的集合(注意由大范围变小先设置maxValue再设置displayedValues,由小范围变大先设置displayedValues再设置maxValue)3、wrapSelectorWheel = false,由小范围变大失效问题(通过下面的方法即可避免数组越界也解决了循环滚动标识失效问题)1、wrapSelectorWheel:是否循环滚动标识(注意调用顺序否则无效:要在设置完最小和最大值后调用)
2023-08-10 10:13:55
229
原创 SimplePool与SynchronizedPool
(四)SyschronizedPool是SimplePool的子类,通过对acquire()和release()方法加锁实现。(三)通过release(T obj)方法将对象放到数组里,如果数组已存在该对象则抛异常,不存在且数组没有满则添加。(二)acquire()从后向前取值,如果有值则返回该值,直到数组头仍无值则返回null。简介:对象池,适用于频繁创建和回收对象场景,通过复用对象池的对象实现。(一)内部通过数组存储。
2023-07-25 16:22:16
349
原创 kotlin类
3、需要返回值的when,全部列出子类则无需定义else(如果直接使用when而不使用其返回值,即使未全部罗列也没有定义else也不会有异常提示)6、重新了hashCode和equals方法:全部参数值相等,则对象相等(注:不是同一个对象,===仍为false)内部类:嵌套类加上inner,持有外部类引用,对应Java的非静态内部类。3、不可以声明为abstract、open、sealed和inner。2、子类必须与密封类在同一个文件中,而子类的派生类可以在其他文件中。1、可以定义抽象方法。
2023-07-10 17:42:15
477
原创 IdleHandler
注:(1)返回值为false即只执行1次,为true则可以重复执行(当再次触发空闲情况)(2)addIdleHandler内部是列表存储空闲任务。前言:当空闲才会被执行,空闲指的是MessageQueue为空或者要执行的消息还没到执行时间。
2023-05-11 17:05:08
137
原创 Handler同步屏障
message的tartget为空的消息,该消息是通过MessageQueue.postSyncBarrier方法(虽然是public但@hide注解无法直接调用,只能通过反射)1、消息执行到屏障消息时将只执行消息队列里的异步消息,这里并不是开启线程异步处理,只是筛选作用,直到移除屏障后同步消息才能执行。2、异步消息如果没有屏障会认为普通消息处理,只当发生屏障后才能体现出特权。(1)同步消息(普通消息)一、message类型。
2023-05-11 16:46:25
242
原创 进程通信--共享内存
1、进程A创建内存文件,并进行数据写入,然后获取该文件的描述,并将其序列化(进程传输必须序列化)3、进程B获取到文件描述,通过常规读取文件方式获取数据。前言:binder通信存在1M限制,而共享内存无此限制。2、通过aidl讲文件描述提供给进程B。
2023-04-22 21:24:01
106
原创 Android8.0注意事项
2、fullscreen 表示Activity是否是透明的或者是否悬浮在Activity上。(2)“windowIsTranslucent” 为 false,但“windowSwipeToDismiss” 为 true;原因:在 8.0系统中,targetSdkVersion > 26,透明 Activity 不能设置方向。表示判断当前的 Activity是否固定了方向,true为固定了方向。3、重写设置屏幕方法,对于透明主题不执行相关设置。2、透明主题则设置屏幕方向为不固定方式。1、判断是否为透明主题。
2023-03-30 15:43:57
1157
原创 Java函数接口
有,在java.util.function包下,但Android中使用需要最新系统版本为24,不过我们可以按照系统提供的自己创建一个这个的接口就可以在低版本中使用了。Java1.8新增特性,即为只有一个抽象方法的接口(通过@FunctionalInterface进行约束),但可以允许存在默认方法、静态方法。三、是否有自带的函数接口?
2023-03-30 00:03:03
106
原创 Java接口
场景1:两个接口包含同名默认方法(或1个抽象1个默认或两个抽象),则实现此两个接口的实现类需要重写该同名方法(其中可以通过“父接口.super.方法名”调用父接口的默认方法)答:可以,从Java1.8版开始可以通过关键字default添加默认方法(只能用于接口)或static添加静态方法。接口添加抽象方法,则实现类都要去实现该方法,而默认方法只需在需要的实现类里重写该方法即可,不用改动其他实现类。爷接口定义抽象方法,父接口定义同名的默认方法,则子接口或类不用必须实现抽象方法。一、接口可以定义实现的方法吗?
2023-03-29 21:20:17
82
原创 Flow
介绍:Flow是google官方提供的一套基于kotlin协程的数据流处理模型,类似RxJava。另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险,这点又类似LiveData。因此Flow可以用来替代LiveData和RxJava。LiveData不支持线程切换,数据更新都是在主线程完成,对于频繁切换线程处理比较麻烦。RxRava操作符较多,入门门槛较高,另外未关联生命周期,需要自己处理取消订阅。使用:1、创建flow//方式1val
2022-05-11 19:37:45
614
原创 基于LiveData实现事件总线
前言:提及事件总线常常使用org.greenrobot:eventbus框架,而本文通过LiveData即可轻松实现Eventbus。实现:这里只定义了1个LiveData,通过TAG作事件的区分。1、定义事件基类data class BaseEvent<T>( val tag: Int, val msg: T)2、定义事件操作类object EventBus{ val onEventLiveData = MutableLiveData<Base
2022-04-26 17:23:06
658
原创 共享状态
前言:如页面A和页面B都需要数据Name,如果定义为全局变量,但当在B页面中修改后还需要手动通知A页面进行更新,增加维护成本和出错率。本文介绍通过Provider将数据和Widget进行关联,之后更新数据则相关联的Widget自动刷新。类似Android的DataBinding。正文:1、添加Provider依赖provider: ^3.0.02、定义有状态的数据(只需继承ChangeNotifier,并在set方法中添加notifyListeners()即可)import 'packag
2022-04-25 14:54:13
1473
原创 flutter代码提示失效
前言:Android studio打开Android项目编写代码能够正常提示,但在flutter项目中编写且没有代码提示。解决:在Terminal执行"flutter pubget"即可
2022-04-24 17:27:55
4109
原创 Android studio打jar包
原理:项目构建生成的class.jar即为我们需要的jar,下面的操作只是将这个jar包拷贝到指定的目录并重命名一下。1、创建新建Android Library 如名称为lib-test,编写业务代码。package com.lpf.lib;public class TestUtil { public static String getString(){ return "这是结果!"; }}2、lib-test的build.gradle中添加如下代码,检
2022-04-20 14:57:49
3608
原创 Isolate
前言:Isolate译为隔离,区别于java的线程,由于内存是隔离的,更类似进程。sync和await则是在Isolate中将任务添加到事件队列,await中的任务和await外的任务是并发的,但await中的任务之间是根据队列顺序执行的详见。使用: SendPort newSendPort; static int num = 0; //该方法内部运行在MainIsolate Future<void> test() async { //创建接收端口 Re
2022-04-15 09:52:09
326
原创 Flutter抓包
前言:通过Charles进行抓包步骤:1、查看Charles代理地址Help->SSL Proxying->Install Charles Root Certificate on a Mobile Device or Remote Browser2、配置代理 (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (HttpClient client) {
2022-04-11 16:48:29
2602
原创 Future
Future是通过Event队列(先进先出)处理的异步任务。因此需要注意:future并非并发执行,而是按加入到Event队列顺序执行,下面的例子即可说明。 void main(){ Future.delayed(Duration(seconds: 1), (){ print("*******事件1开始"); }); Future((){ print("*******事件2开始"); sleep(Duration(seconds: 5));
2022-04-08 15:31:18
291
原创 重载运算符plus
使用场景:通过+号实现对象属性的叠加class Test(var num: Int) { operator fun plus(t: Test): Test{ num += t.num return this }}private fun test(){ val t = Test(1) t + Test(2) + Test(3) val result = t.num//结果为6}理解了plus的原理,还可以通过+号实现链
2022-04-07 15:04:27
597
原创 密封函数sealed
sealed密封类使用场景:增强版的枚举类型,不同之处在于枚举的实例是唯一的,而密封类可以有很多实例(如下TestA实例是唯一的,而TestB则可以创建多个实例)sealed class Test { object TestA : Test() class TestB(value: String) : Test()} private fun test(t: Test) = when(t){ Test.TestA ->{} is Te
2022-04-07 14:22:40
378
原创 GreenDao
一、数据库升级(如增加字段)1、增加phone@Entitypublic class UserModel { @Id(autoincrement = true) private Long id; //主键 private String name; //姓名 private String phone;//电话}2、修改版本号1->2greendao { //数据库的版本 schemaVersion 2 //设置DaoMas
2022-03-25 11:57:03
2041
原创 Android Studio 无法搜索插件
前言:搜索插件一直在加载中或搜索不到,这里介绍一种方案解决:访问JetBrains Marketplace搜索下载插件,再通过磁盘方式导入即可
2022-03-23 14:13:44
474
原创 序列化和反序列化
前言:将继承Serializable的实体类通过如下方法序列化成字符串,并以SharedPreferences方式保存,当对该实体类添加属性后,再对存储的字符串进行反序列化则会触发java.io.InvalidClassException/** * 序列化对象 */ @Throws(IOException::class) private fun <A> serialize(obj: A): String { val byteArrayOu
2022-03-18 18:45:48
3612
原创 Collections.sort注意事项
排序无考虑相等情况,可能导致如下情况(不是必现的,场景依赖集合大小【>=32】和数据在排序算法关键位置恰好相等【如下例是倒序则有问题,正序则不发生异常】,具体原理)List<String> aa = new ArrayList();aa.add("2021-11-02 13:07:44.0");aa.add("2021-11-02 13:07:45.0");for (int i = 0; i < 10; i ++){ aa.add("2021-11-02 13:0
2022-01-26 18:40:47
282
原创 Stream
前言:Stream和Future均属于dart.async下的核心库,是dart提供的异步操作类。正文:一、Stream创建方式1、Stream.fromFuture通过future对象创建Stream.fromFuture(init(1));//初始化函数Future init(int a) async{ await Future.delayed(Duration(seconds: 10 - a));}2、Stream.fromIterable通过集合创建Strea
2021-12-23 11:52:56
1295
原创 减少shape文件
前言:通常设置控件背景色、圆角、边框大小、边框颜色,是通过自定义shape文件做为背景设置给控件,虽然在布局文件里能直接看到效果,同时还能让背景支持selector标签的资源文件,但对于简单的设置每次都要创建shape文件也挺繁琐的,于是本文通过动态代码方式进行设置进行简化分析:控件的背景样式其实是通过GradientDrawable来实现的,只要将GradientDrawable设置成自定义样式,然后将控件的背景设置为该GradientDrawable即可。实现:object ViewUti
2021-12-06 11:30:50
1405
原创 文本折叠展开效果
前言:当文本过长时(超过指定行数),打点省略显示并在其后添加“展开”,点击则展开显示全部,再次点击收起,效果如下分析:(1)超过n行折叠 (2)“【展开】”内嵌至文本中且通过颜色标识(3)点击展开收缩方案一:计算n行的总长度,获取“【更多】”所占长度,两者差值即为能容纳的字符串长度,截取字符串之后再拼接上“【更多】”即可object TextUtil{ /** * textView:文本控件 * textStr:文本内容 * lineWidth:行.
2021-11-19 12:00:32
355
原创 async、await
前言:1、问题1:在shared_preferences存储着是否登录的状态,然后根据状态决定跳转的页面,但获取该状态是异步,而页面需要同步方式获取Weight。解决:对shared_preferences在页面运行前进行初始化,将异步转换为同步。class SpUtil { static SharedPreferences _sp; static Future init() async{ _sp = await SharedPreferences.getInstance(
2021-10-21 12:11:36
154
原创 RecyclerView滑动到指定位置
需求:将recyclerview滑动到指定位置,且该位置为第一个可见位置方式一:LayoutManager.scrollToPositionWithOffsetint toPosition = 5;((LinearLayoutManager)rvSaleMonth.getLayoutManager()).scrollToPositionWithOffset(toPosition, 0);方式二:RecyclerView.scrollToPosition + RecyclerView.scro
2021-09-26 14:55:53
1597
原创 java替换括号内字符串
背景:例如字符串“这是[XX]”,XX为任意字符串,我们需求是将XX替换为想要的字符串解决:采用正则表达式.*?进行任意字符匹配String remark = "这是[苹果]";remark = remark.replaceAll("\\[.*?\\]", "[香蕉]");...
2021-09-23 17:24:53
1900
unlocker.rar
2020-05-09
Chrome工具包(附相应版本浏览器).rar
2019-12-30
openssll.exe下载
2017-11-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人