- 博客(106)
- 资源 (7)
- 收藏
- 关注
原创 自定义NestedScrollView 解决嵌套滑动问题
所以,为了解决这个滑动问题,原有的NestedScrollView已经不满足需求了。所以我们继承NestedScrollView,在onNestedPreScroll的时候,判断是不是要由自己来消耗滚动。理想的效果是:当手指在recycleview上滑动的时候,如果其他view还没被滑出去,优先scrollview来滑动,当其他view被划出屏幕的时候,recycleview才能滑动。现实情况是:当其他view还被划出屏幕,有可能是recycleview优先来滑动了。
2025-01-08 16:03:28
307
原创 Kotlin学习之密封类
在when中使用的时候,编译器会提示我们要加else分支。但是在密封类中,就不会存在这个问题,因为编译器知道密封类所有的子类,但是抽象类不一样了,因为我们可以在任意地方来继承实现子类,子类可能是很多的,所以需要加上else分支。kotlin中的密封类,用关键词Sealed修饰,且还有一个规定:Sealed类的子类应该是Sealed类的嵌套类,或者应该在与Sealed类相同的文件中声明。可以看到,密封类的好处是,它的子类可以是普通类,data class, object等,而且子类可以自由扩展属性状态。
2023-08-29 12:05:46
1476
翻译 coroutines,livedata,flow
LiveData with Coroutines and Flow 我们经常在viewModel 中做些数据的操作:1. 如果是one short 数据,我们可以这样使用:val currentWeather: LiveData<String> = dataSource.fetchWeather()2. 如果是flow数据,我们可以这样使用:val currentWeatherFlow: LiveData<String> = dataSource.fetchWeather
2021-07-01 15:59:28
239
翻译 理解kotlin中的泛型,协变,逆变
Understanding Generics and Variance in Kotlin起源于继承,所以就有了标题说到的这些东西先说结论:1. Out 适用于生产者模式,会返回一个T2. In 适用于消费者模式,作为参数传递进来消费掉,不会返回T继承关系:我们可以将子类实例赋值给一个父类Integer integer = new Integer(1);Number number = integer;得益于此,我们可以写一个方法,参数是父类,这样子类也可以往里面传:参数需要Number
2021-06-30 18:50:56
289
翻译 Andorid协程三部曲之三:实际使用
Coroutines On Android (part III): real work这是协程系列的第三篇文章1. 使用协程解决实际问题协程擅长完成两类任务:请求一次就完成的(比如,打开这个页面,发起一次请求,服务端返回数据,浏览器渲染展示,这次请求就完成了)流请求(这种请求类似于长连接)以下用例子来说明请求一次就完成的这种任务viewModel 中开启协程,因为它和生命周期绑定,在用户离开屏幕的时候,会自动取消协程里面的任务。class ProductsViewModel(val
2021-06-30 11:27:13
174
翻译 Andorid协程三部曲之二:开始使用协程
Coroutines on Android (part II): getting started这是Andoid 协程系列文章中的第二篇。这篇将关注协程是怎样开始运行的。1. 跟踪协程在第一篇文章中,讲述了协程擅长于解决的是哪类问题。回顾一下,协程擅长于解决的是如下两类常见的问题:会阻塞主线程的长时间耗时任务主线程安全。任何suspend 函数都可以在主线程被安全的调用。为了解决上述两个问题,协程通过在普通函数上增加suspend 和 resume。当特定线程上的所有协程都被挂起的时候,
2021-06-25 16:26:04
419
翻译 Andorid协程三部曲之一:了解协程的背景
这篇文章关注于协程是怎样工作的以及它们解决了什么问题1. 协程解决了什么问题kotlin协程简化了异步代码,kotlin的协程并不是一个新概念,很多语言比如c#,python ,go等在初始的时候就已经有这个东西了。对于Andorid,协程解决了以下两个问题:耗时任务, 这些任务会阻塞主线程。线程安全,任何挂起的函数可以在主线程调用。2. 耗时任务网络请求,读取数据库,从磁盘加载图片等等,这些都属于耗时任务,这些会让app 停下来并等待获取这些结果。在Andorid中,每个app都有一个
2021-06-24 12:11:48
174
原创 协程vs回调的一次使用demo
从一个例子开始:写一个方法,判断textview 文本是否超过了一行。1. 协程方式实现:suspend fun TextView.isOneLine(str: String?) = suspendCoroutine<Boolean> { if(str.isNullOrEmpty()){ it.resume(true) return@suspendCoroutine } val viewTreeObserver = this.viewT
2021-06-24 11:56:16
177
翻译 创建Splash 页面的另外一种方式
前言:这是翻译的一篇文章,How to Create a Splash Screen。这篇文章里,作者提出了一个很独特的实现闪屏的方案,代码也验证过,确实可行。现在,我们按照他的方案,一步一步来实现。ps:不习惯于一字一译,这样有时候会很生硬,所以我采用的是按照自己的理解,融合作者和自己想表达的意思翻译而来。目的也只是为了让文章既能好读,也能好懂。所谓Spalsh页面(闪屏页面)一般就是在app启动的时候,展示公司的logo或是name(当然,国内的app 可能不是这么简单的玩下)。我们实现闪屏可
2021-06-21 15:07:06
385
原创 自定义TextView折叠文本
项目需求:某折扣字符串:“满10减30·满20减30·满30减30·满40减40·满50减30·满60减30·满70减30·满80减30·满90减40·满100减30”如果将上述文案使用maxline:1 和ellipsize:end 显示到一行中,显示如下:在满60减30的时候因为放不下,被折叠起来了。现产品要求如下:也就是说:当在某单条折扣(如满60减30)已经放不下一行的时候,就要获取到上一个能放下的折扣(以点做区分)此案例中满60减30放不下,他的上一条折扣是满50减30,因此就展示
2021-05-25 17:04:04
200
原创 城市字母索引列表
1. 项目需求:2. 思路:参考:SuspensionIndexBar说明:1 实际项目需求和IndexBar有些出入,所以将原作者项目有需求的部分引入过来,修改部分代码2. SuspensionIndexBar 在汉字转拼英的时候,用的还是TinyPinyin 1.0.0 的包,针对一些多音字,没做处理。故引入了TinyPinyin 最新版本,解决多音字问题。最终效果如下:3. 实现:替换最新的Tinypinyin @Override public IIndexBarDa
2021-04-16 16:39:14
641
原创 MotionLayout 动画使用
需求:页面有张背景图,随着下拉刷新,背景图也随之逐渐放大。分析:方案一:监听下拉刷新的控件,根据下拉的距离,动态设置拉伸比例方案二:采用MotionLayout效果如下:(因为动态图上传不了,所以,截取了个动画初始图,动画拉伸放大效果图)初始效果:拉伸放大之后的效果:实现如下:布局:<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout
2021-03-29 17:18:11
358
原创 仿唯品会/京东/淘宝搜索流式布局的隐藏与展示
1. 项目需求:如下,如果没有向下箭头(显示/隐藏剩余搜索词条)的话,采用flexbox-layout+Recycleview+FlexboxLayoutManager 可以实现流式布局。加了这个箭头,做起来有点复杂,体现在:1 怎么知道搜索词条总的数量超过2行了?2 箭头应该在哪个位置出现?原有的FlexboxLayoutManager 并没有提供类似的方法或是监听告知。可能需要用到自定义view来做特殊处理2. 代码实现:方案:采用FlowLayout,这里借鉴了FlowLayout,
2021-02-23 18:32:23
811
1
原创 观察者模式的一次实践
1. 项目需求背景:直播端有个美颜设置功能,如下:2. 实现方式:先说布局:看完交互之后,决定采用tablayout+viewpagertablayout指示器长度的改变:网上有采用反射或是第三方控件来改变indicator长度,这里我们直接用drawable方式<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:width
2021-02-05 15:56:57
189
原创 扒一扒app
起因是这样的,拿到一个产品需求,如下,ui倒是一目了然,但是具体交互细节呢,美工小姐姐在设计稿上标了一小行字:去看看每日优鲜。既然如此,那就先看看别人家是怎么做的吧。1.工具篇:参考一片文章:查看布局先找到android sdk 的目录-》tools -》monitor.bat. 启动按照如下操作,之后就获取到别人app的布局视图了选取其中某个交互开始分析:打开app,在此分类界面,一只手不停下拉,不松手,另外一只手按照2进行操作,获取到的截图如下:看看红框我们能分析出哪些信息:①
2021-02-05 10:40:25
544
1
原创 一个简单的物流进度信息展示控件
1.效果图:2.实现思路:网上其实已经有一些现成的展示物流信息的控件,我写这个,纯粹是出于觉得可以不用自定义view,通过recycleview多布局可以实现,所以尝试写了个demo。假定已经获取到了数据:private val mVals = mutableListOf<LogisticsBean>( LogisticsBean(1,"已经送货完成"), LogisticsBean(0,"快递交给xxx,正在派送途中(联系电话:12345678912,
2020-10-16 17:57:37
1265
原创 关于View的移动问题
1. 背景:快端午节了,运营想搞个活动,根据用户交互次数的多少,让龙舟来划动。需求图如下:在此界面,每隔15s就要发一起请求,从而来更新龙舟的位置。涉及到的技术点就是:view坐标的移动。2.实现:先说走过的弯路:getLeft拿到的坐标为0的问题:这个很常见,因为获取时机不对,view 还没布置好,这个时候去拿坐标是拿不到的。具体怎么获取,可以参考:此处我是在onWindowFocusChanged中拿到了5条龙舟各自的onLeft值,而不再是0了。控件的移动问题:最初开始用的是
2020-06-08 16:07:07
276
原创 看书笔记 day1
《Android 群英传:神兵利器》一直知道有《Android 群英传:神兵利器》,但是没看, 今天抽看看了一点,将看到的知识汇总下。另外说下,所有的书本,都要结合实践,不能仅仅是停留在看的层次。这次决定以博客形式记录,也是自己总结+实践的一部分,可能会慢点,但是会学得更好一点。一. Android Studio 的使用技巧方面:查看一个类的结构,成员变量等信息:studio 左侧竖着的菜单栏选择structure:log信息区分得更明显:android studio 的tips:很多人可
2020-05-09 16:34:54
189
原创 RecycleView实现网格不一样的排列布局
需求原型图这次的需求和普通网格布局方式是不一样的,这个是先从左边排满8个,之后再从右边排。普通recycleView的排列方式是左右左右排的。两种途径可实现这种方式:第一是自定义layoutmanger,这个不会,哭晕。第二种就是重新组装数据,这个倒是会,就是有点麻烦。所以难点就集中体现在:第一,如何重新组装数据第二,每条item的底部bottom线如何去掉,可能有人认为是最后一...
2019-10-24 16:28:24
951
原创 vlayout的初始尝试使用
项目需求图可以看到,当item个数为奇数的时候,第一个元素要单独占据一行,有点类似于excel中的合并单元格;当item个数为偶数的时候,就当做普通网格展示就好。对于这种不规则的列表展示方式,vlayout就是最好的选择。由于初始使用这个,需要先做技术预研,所以就写了个简单的demo体验效果。效果如下:(1)当item个数为奇数的时候,展示效果如下:(2)当item个数为偶数的时候,展...
2019-10-15 17:55:43
337
原创 用贝塞尔曲线实现语音动画
项目需求效果图:原型是如下这个渐变的带着波浪起伏的语音动画控件,而且这3个起伏点随着唤醒的角度变化,而位置有所改变,目前只支持三个角度:唤醒在左边,中间和右边。实现思路:...
2019-09-03 14:58:02
651
原创 RecycleView实现网格整页滑动效果方案二
背景这个是接着上一篇继续做的一个替代或是说优化方案吧,因为从体验上效果来说,这次的会更好点,主要是滑动效果体验很好。需求和上一篇一样,没有变化,先展示做好的效果图:思路偶然间发现了一篇博客,讲解滑动与点击事件的冲突,想到了这样一个方案:最外面一层用这个处理了滑动点击事件的控件,包裹住RecycleView,这样父view负责处理滑动事件,当有滑动的手势的时候,让adapter更新数据,造...
2019-06-26 15:56:59
822
原创 RecycleView实现网格整页滑动
需求分析这篇博客写作来源也是项目需求产品经理说:六宫格展示一页数据,用户左滑/右滑的时候,要整页滑动的效果。解释这句话的意思就是:(1)一页只能展示6条数据;(2)只支持横向滑动,用户只能一页一页的滑(相当于用户一次要滑动6条数据);(3)用户左滑是向前翻页,右上角页码随之变换;(4)用户右滑是向后翻页,右上角页码随之变换;(5)点击单条数据,可以跳转这道菜的详情页面。以下是产品...
2019-04-22 14:30:59
2347
1
原创 Android Studio某些编译错误处理
Studio 有时候真的很奇怪,明明项目几天前都运行好好的,某天等你再次打开运行,就会出现特殊错误。现总结一些错误现象,减少开发人员不必要的时间浪费。第一个错误:Error:Failed to resolve: annotationProcessor如果你百度,你会发现大家说和butterknife 或者是apt等有问题,然后叫你更新google仓库。这种方案我试验过,但是往往都不凑效,请仔...
2019-03-05 11:53:21
4188
原创 仿ios 就寝控件
偶然有天发现朋友圈有人晒出苹果手机的一个就寝功能,里面一个显示睡眠时间的控件,觉得这个控件非常好看,而且正好看了一系列的自定义控件文章,那就模仿这个试一试。1 先看效果图:点击查看源码2.具体实现:(1)初始化一些画笔从图中可以分析出,我们需要如下画笔:画外面黑色大圆,画时钟数字,画中间文字,画时钟刻度等等,也就是需要什么画笔new出来就好。 /** * 初始化画笔: ...
2019-02-21 11:34:00
1104
原创 Volley源码解析
现在这个框架已经被用得很少了,但是目前我们项目中还有用到,那就尝试分析源码吧。 源码地址:https://github.com/google/volley一.源码解析步骤:1. volley类:public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) { Ba...
2018-09-10 14:30:02
208
原创 Universal-Image-Loader 源码的一些理解和分析
这个是一个非常好用的图片加载框架,虽然作者没有再维护了,但是我们项目中还是一直在使用,并且也很稳定。既然用到了该框架,那么是时候去看看该源码和学习学习。 源码地址:https://github.com/nostra13/Android-Universal-Image-Loader一.整体架构:先说怎么看整个源码:我是根据下面这种图开始看的,另外,我觉得作者源码包的分类也非常明确清晰,这个...
2018-08-31 09:53:20
921
原创 RecycleView实现画廊效果
先说项目ui需求图:滑动到第一项的时候,不可再向左滑动,并且左侧显示:“左侧没有内容”。滑动到最后一项的时候,不可再向右滑动,并且右侧显示:“右侧没有内容”。用户在开始滑动的时候,“左侧没有内容”或是“右侧没有内容”的view要立即消失。当前item需要有放大效果,并且有边框。不是当前的item需要有缩小效果,无边框。如下图所展示:需求实现:难点如下: 1. ...
2018-08-03 11:35:17
3115
原创 Kotlin学习笔记之一:Kotlin基础
1.函数:/** * 关键词fun 申明是函数 * 参数形式:参数名:类型 * Kotlin中数组是一个类 * 这是一个不带返回值的函数 */fun main(args: Array&amp;lt;String&amp;gt;){ println(&quot;hello world&quot;)}/** 1. 这是一个带返回值的函数 */fun sumNumber(a:Int,b:Int):In...
2018-06-12 06:46:44
277
原创 WebView控制h5视频播放页面
相信大家看到这个标题,就已经知道是通过在Webview中写入js,从而控制某个网页页面的播放。具体要如何实现呢?1. 全屏这里以爱奇艺的网页为例,当我们拿到它的一个网页url播放链接,用平板运行的时候,播放器不会是全屏状态,当我们点击全屏图标的时候,希望它能像网页那样全屏展示播放,但是实际情况是,你点击全屏,它也根本无动于衷。所以我们应该怎样做,才会自动实现全屏呢? 这里有1个难题要解决...
2018-05-28 14:19:44
7197
原创 仿Android 源码处理长按事件
项目中有个需求:当用户长按某个键,当有5秒的时候,提示用户松手。需求非常简单,如何用简单高效的方法来实现呢?刚开始是打算用个计时器,如果计时达到了5s,就提示用户松手,后面回想android button的长按点击事件,它又是如何实现的呢?view 的长按点击事件部分源码://这是一个runnableprivate CheckForLongPress mPendingCheckForLongPre
2018-05-07 17:03:15
670
原创 算法学习之七:链表
链表的概念:链表由一系列结点组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表有单链表和双端链表代码实现单链表://先设计一个单链表的数据结构public class SingleLink { public int data; public SingleLink next; public Singl...
2018-04-02 09:48:20
178
原创 Android so库研究
一个so库引起的问题:我们项目一直是运行在32位系统的定制设备上,然后有一天,老板说我有一个华为平板,把项目移植到这个设备上看看效果,结果运行的时候有个出错提示:xxx.so is 32-bit instead of 64-bit,那怎么解决呢?还等着要给老板演示看呢。引发的思考:既然提示说这个so库不是64位的吗?那我就给你找一个64位的so库出来,很遗憾,厂商根本没做64位的...
2018-03-22 09:40:03
897
原创 视频播放比例问题研究
背景:针对视频满屏播放,有时候如果仅仅是设置某个控件宽高都是match_parent, 但是视频源却没有和设备的比例保持一致,就会存在画面被拉伸的情况,那么应该怎么避免呢?解决方法:第一步:确定视频源的比例:根据帧宽高算出比例大致是9:5 第二步:确定设备的宽高比例,我们设备屏幕是10寸,宽高是:1920*1200,比例是8:5第三步:分析,从上面两个比值来看,视频源比例和设...
2018-03-20 08:56:52
3566
原创 MVP的实践
背景:之前看到有朋友在项目中用mvp模式,他推荐我去看看google托管在github上的一个demo,然后我就下载下来看,结果是看得稀里糊涂的,感觉几个接口调来调去的,让我不够用的大脑更加混乱了。然后,我又在网上搜索一些文章看,结果绝大部分文章标题是:Retrofit+RxJava+Dragger2+MVP模式,一下子包装这么多框架进去,更是让看了之后,更是不会了。后面自己想:既然整体看不懂
2017-07-06 19:30:37
417
原创 自定义StepView
背景:先看自己写的demo图:项目中有一个需求:就是希望用户进行到哪步,哪步就高亮显示,并且每个步骤的图片都是不同的,完成的和未完成的线条和字也要做相应区分。我是参考了gtihub上一个开源的stepview(但是这个不完全符合我的项目需求),所以在其源码上,进行修改和相应调整,然后做出符合自己项目需求的stepview。 https://github.com/baoyac
2017-07-05 08:08:18
1138
原创 Handler实现倒计时的两种方式
背景:最近项目中,正好做到登录/注册这个功能快。它需要通过发送验证码,在规定的时间内用验证码来完成登录/注册。之前的项目中也有这个功能,但是觉得太复杂了,只好自己重新实现一遍。用Handler来做,觉得代码简介,逻辑也清楚。代码一://在向服务端发送获取验证码成功的回调函数中,开始发消息:mHandler.obtainMessage();mHandler.sendEmpty
2017-06-30 19:29:01
3714
原创 设计模式之二:iterator
用途:iterator 主要是针对不同容器,对外提供具有相同操作规范的遍历。因为不同容器内部具体实现不一样,所做的迭代也是不一样,为了便于程序的可扩展性,暴露一个接口,各个容器依据具体实现提供遍历方法。代码实现://自定容器之一:MyArrayList public class MyArrayList { private int[] datas = new int[5]
2017-06-24 09:46:33
250
原创 设计模式之一:责任链
概念:使多个对象都有机会处理请求,从而避免了请求的发送和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 用图形定义:代码表示:比如新生开学流程:先去报到,再去买盆子、被子,再去买书,我们按照这个流程先来设计3个 处理器:分别处理报到,盆子和书的事情://通用接口public interface Processer {
2017-06-23 23:09:06
318
Hands-On RESTful API Design Patterns and Best Practices
2019-04-30
Stream Processing with Apache Flink
2019-04-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人