自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

huang_xiao_yu的博客

专注移动互联网,研究新技术

  • 博客(105)
  • 资源 (7)
  • 收藏
  • 关注

原创 Kotlin学习之密封类

在when中使用的时候,编译器会提示我们要加else分支。但是在密封类中,就不会存在这个问题,因为编译器知道密封类所有的子类,但是抽象类不一样了,因为我们可以在任意地方来继承实现子类,子类可能是很多的,所以需要加上else分支。kotlin中的密封类,用关键词Sealed修饰,且还有一个规定:Sealed类的子类应该是Sealed类的嵌套类,或者应该在与Sealed类相同的文件中声明。可以看到,密封类的好处是,它的子类可以是普通类,data class, object等,而且子类可以自由扩展属性状态。

2023-08-29 12:05:46 1360

翻译 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 173

翻译 理解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 215

翻译 Andorid协程三部曲之三:实际使用

Coroutines On Android (part III): real work这是协程系列的第三篇文章1. 使用协程解决实际问题协程擅长完成两类任务:请求一次就完成的(比如,打开这个页面,发起一次请求,服务端返回数据,浏览器渲染展示,这次请求就完成了)流请求(这种请求类似于长连接)以下用例子来说明请求一次就完成的这种任务viewModel 中开启协程,因为它和生命周期绑定,在用户离开屏幕的时候,会自动取消协程里面的任务。class ProductsViewModel(val

2021-06-30 11:27:13 135

翻译 Andorid协程三部曲之二:开始使用协程

Coroutines on Android (part II): getting started这是Andoid 协程系列文章中的第二篇。这篇将关注协程是怎样开始运行的。1. 跟踪协程在第一篇文章中,讲述了协程擅长于解决的是哪类问题。回顾一下,协程擅长于解决的是如下两类常见的问题:会阻塞主线程的长时间耗时任务主线程安全。任何suspend 函数都可以在主线程被安全的调用。为了解决上述两个问题,协程通过在普通函数上增加suspend 和 resume。当特定线程上的所有协程都被挂起的时候,

2021-06-25 16:26:04 341

翻译 Andorid协程三部曲之一:了解协程的背景

这篇文章关注于协程是怎样工作的以及它们解决了什么问题1. 协程解决了什么问题kotlin协程简化了异步代码,kotlin的协程并不是一个新概念,很多语言比如c#,python ,go等在初始的时候就已经有这个东西了。对于Andorid,协程解决了以下两个问题:耗时任务, 这些任务会阻塞主线程。线程安全,任何挂起的函数可以在主线程调用。2. 耗时任务网络请求,读取数据库,从磁盘加载图片等等,这些都属于耗时任务,这些会让app 停下来并等待获取这些结果。在Andorid中,每个app都有一个

2021-06-24 12:11:48 125

原创 协程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 124

翻译 创建Splash 页面的另外一种方式

前言:这是翻译的一篇文章,How to Create a Splash Screen。这篇文章里,作者提出了一个很独特的实现闪屏的方案,代码也验证过,确实可行。现在,我们按照他的方案,一步一步来实现。ps:不习惯于一字一译,这样有时候会很生硬,所以我采用的是按照自己的理解,融合作者和自己想表达的意思翻译而来。目的也只是为了让文章既能好读,也能好懂。所谓Spalsh页面(闪屏页面)一般就是在app启动的时候,展示公司的logo或是name(当然,国内的app 可能不是这么简单的玩下)。我们实现闪屏可

2021-06-21 15:07:06 319

原创 自定义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 131

原创 城市字母索引列表

1. 项目需求:2. 思路:参考:SuspensionIndexBar说明:1 实际项目需求和IndexBar有些出入,所以将原作者项目有需求的部分引入过来,修改部分代码2. SuspensionIndexBar 在汉字转拼英的时候,用的还是TinyPinyin 1.0.0 的包,针对一些多音字,没做处理。故引入了TinyPinyin 最新版本,解决多音字问题。最终效果如下:3. 实现:替换最新的Tinypinyin @Override public IIndexBarDa

2021-04-16 16:39:14 513

原创 MotionLayout 动画使用

需求:页面有张背景图,随着下拉刷新,背景图也随之逐渐放大。分析:方案一:监听下拉刷新的控件,根据下拉的距离,动态设置拉伸比例方案二:采用MotionLayout效果如下:(因为动态图上传不了,所以,截取了个动画初始图,动画拉伸放大效果图)初始效果:拉伸放大之后的效果:实现如下:布局:<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout

2021-03-29 17:18:11 286

原创 仿唯品会/京东/淘宝搜索流式布局的隐藏与展示

1. 项目需求:如下,如果没有向下箭头(显示/隐藏剩余搜索词条)的话,采用flexbox-layout+Recycleview+FlexboxLayoutManager 可以实现流式布局。加了这个箭头,做起来有点复杂,体现在:1 怎么知道搜索词条总的数量超过2行了?2 箭头应该在哪个位置出现?原有的FlexboxLayoutManager 并没有提供类似的方法或是监听告知。可能需要用到自定义view来做特殊处理2. 代码实现:方案:采用FlowLayout,这里借鉴了FlowLayout,

2021-02-23 18:32:23 657 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 122

原创 扒一扒app

起因是这样的,拿到一个产品需求,如下,ui倒是一目了然,但是具体交互细节呢,美工小姐姐在设计稿上标了一小行字:去看看每日优鲜。既然如此,那就先看看别人家是怎么做的吧。1.工具篇:参考一片文章:查看布局先找到android sdk 的目录-》tools -》monitor.bat. 启动按照如下操作,之后就获取到别人app的布局视图了选取其中某个交互开始分析:打开app,在此分类界面,一只手不停下拉,不松手,另外一只手按照2进行操作,获取到的截图如下:看看红框我们能分析出哪些信息:①

2021-02-05 10:40:25 457 1

原创 售后进度控件

项目需求:实现:方案一:

2020-12-22 16:16:22 209 3

原创 一个简单的物流进度信息展示控件

1.效果图:2.实现思路:网上其实已经有一些现成的展示物流信息的控件,我写这个,纯粹是出于觉得可以不用自定义view,通过recycleview多布局可以实现,所以尝试写了个demo。假定已经获取到了数据:private val mVals = mutableListOf<LogisticsBean>( LogisticsBean(1,"已经送货完成"), LogisticsBean(0,"快递交给xxx,正在派送途中(联系电话:12345678912,

2020-10-16 17:57:37 1154

原创 关于View的移动问题

1. 背景:快端午节了,运营想搞个活动,根据用户交互次数的多少,让龙舟来划动。需求图如下:在此界面,每隔15s就要发一起请求,从而来更新龙舟的位置。涉及到的技术点就是:view坐标的移动。2.实现:先说走过的弯路:getLeft拿到的坐标为0的问题:这个很常见,因为获取时机不对,view 还没布置好,这个时候去拿坐标是拿不到的。具体怎么获取,可以参考:此处我是在onWindowFocusChanged中拿到了5条龙舟各自的onLeft值,而不再是0了。控件的移动问题:最初开始用的是

2020-06-08 16:07:07 228

原创 看书笔记 day1

《Android 群英传:神兵利器》一直知道有《Android 群英传:神兵利器》,但是没看, 今天抽看看了一点,将看到的知识汇总下。另外说下,所有的书本,都要结合实践,不能仅仅是停留在看的层次。这次决定以博客形式记录,也是自己总结+实践的一部分,可能会慢点,但是会学得更好一点。一. Android Studio 的使用技巧方面:查看一个类的结构,成员变量等信息:studio 左侧竖着的菜单栏选择structure:log信息区分得更明显:android studio 的tips:很多人可

2020-05-09 16:34:54 136

原创 RecycleView实现网格不一样的排列布局

需求原型图这次的需求和普通网格布局方式是不一样的,这个是先从左边排满8个,之后再从右边排。普通recycleView的排列方式是左右左右排的。两种途径可实现这种方式:第一是自定义layoutmanger,这个不会,哭晕。第二种就是重新组装数据,这个倒是会,就是有点麻烦。所以难点就集中体现在:第一,如何重新组装数据第二,每条item的底部bottom线如何去掉,可能有人认为是最后一...

2019-10-24 16:28:24 828

原创 vlayout的初始尝试使用

项目需求图可以看到,当item个数为奇数的时候,第一个元素要单独占据一行,有点类似于excel中的合并单元格;当item个数为偶数的时候,就当做普通网格展示就好。对于这种不规则的列表展示方式,vlayout就是最好的选择。由于初始使用这个,需要先做技术预研,所以就写了个简单的demo体验效果。效果如下:(1)当item个数为奇数的时候,展示效果如下:(2)当item个数为偶数的时候,展...

2019-10-15 17:55:43 294

原创 用贝塞尔曲线实现语音动画

项目需求效果图:原型是如下这个渐变的带着波浪起伏的语音动画控件,而且这3个起伏点随着唤醒的角度变化,而位置有所改变,目前只支持三个角度:唤醒在左边,中间和右边。实现思路:...

2019-09-03 14:58:02 524

原创 RecycleView实现网格整页滑动效果方案二

背景这个是接着上一篇继续做的一个替代或是说优化方案吧,因为从体验上效果来说,这次的会更好点,主要是滑动效果体验很好。需求和上一篇一样,没有变化,先展示做好的效果图:思路偶然间发现了一篇博客,讲解滑动与点击事件的冲突,想到了这样一个方案:最外面一层用这个处理了滑动点击事件的控件,包裹住RecycleView,这样父view负责处理滑动事件,当有滑动的手势的时候,让adapter更新数据,造...

2019-06-26 15:56:59 747

原创 RecycleView实现网格整页滑动

需求分析这篇博客写作来源也是项目需求产品经理说:六宫格展示一页数据,用户左滑/右滑的时候,要整页滑动的效果。解释这句话的意思就是:(1)一页只能展示6条数据;(2)只支持横向滑动,用户只能一页一页的滑(相当于用户一次要滑动6条数据);(3)用户左滑是向前翻页,右上角页码随之变换;(4)用户右滑是向后翻页,右上角页码随之变换;(5)点击单条数据,可以跳转这道菜的详情页面。以下是产品...

2019-04-22 14:30:59 2235 1

原创 Android Studio某些编译错误处理

Studio 有时候真的很奇怪,明明项目几天前都运行好好的,某天等你再次打开运行,就会出现特殊错误。现总结一些错误现象,减少开发人员不必要的时间浪费。第一个错误:Error:Failed to resolve: annotationProcessor如果你百度,你会发现大家说和butterknife 或者是apt等有问题,然后叫你更新google仓库。这种方案我试验过,但是往往都不凑效,请仔...

2019-03-05 11:53:21 4029

原创 仿ios 就寝控件

偶然有天发现朋友圈有人晒出苹果手机的一个就寝功能,里面一个显示睡眠时间的控件,觉得这个控件非常好看,而且正好看了一系列的自定义控件文章,那就模仿这个试一试。1 先看效果图:点击查看源码2.具体实现:(1)初始化一些画笔从图中可以分析出,我们需要如下画笔:画外面黑色大圆,画时钟数字,画中间文字,画时钟刻度等等,也就是需要什么画笔new出来就好。 /** * 初始化画笔: ...

2019-02-21 11:34:00 1032

原创 Volley源码解析

现在这个框架已经被用得很少了,但是目前我们项目中还有用到,那就尝试分析源码吧。 源码地址:https://github.com/google/volley一.源码解析步骤:1. volley类:public static RequestQueue newRequestQueue(Context context, BaseHttpStack stack) { Ba...

2018-09-10 14:30:02 181

原创 Universal-Image-Loader 源码的一些理解和分析

这个是一个非常好用的图片加载框架,虽然作者没有再维护了,但是我们项目中还是一直在使用,并且也很稳定。既然用到了该框架,那么是时候去看看该源码和学习学习。 源码地址:https://github.com/nostra13/Android-Universal-Image-Loader一.整体架构:先说怎么看整个源码:我是根据下面这种图开始看的,另外,我觉得作者源码包的分类也非常明确清晰,这个...

2018-08-31 09:53:20 872

原创 RecycleView实现画廊效果

先说项目ui需求图:滑动到第一项的时候,不可再向左滑动,并且左侧显示:“左侧没有内容”。滑动到最后一项的时候,不可再向右滑动,并且右侧显示:“右侧没有内容”。用户在开始滑动的时候,“左侧没有内容”或是“右侧没有内容”的view要立即消失。当前item需要有放大效果,并且有边框。不是当前的item需要有缩小效果,无边框。如下图所展示:需求实现:难点如下: 1. ...

2018-08-03 11:35:17 2995

原创 Kotlin学习笔记之一:Kotlin基础

1.函数:/** * 关键词fun 申明是函数 * 参数形式:参数名:类型 * Kotlin中数组是一个类 * 这是一个不带返回值的函数 */fun main(args: Array&amp;amp;lt;String&amp;amp;gt;){ println(&amp;quot;hello world&amp;quot;)}/** 1. 这是一个带返回值的函数 */fun sumNumber(a:Int,b:Int):In...

2018-06-12 06:46:44 216

原创 WebView控制h5视频播放页面

相信大家看到这个标题,就已经知道是通过在Webview中写入js,从而控制某个网页页面的播放。具体要如何实现呢?1. 全屏这里以爱奇艺的网页为例,当我们拿到它的一个网页url播放链接,用平板运行的时候,播放器不会是全屏状态,当我们点击全屏图标的时候,希望它能像网页那样全屏展示播放,但是实际情况是,你点击全屏,它也根本无动于衷。所以我们应该怎样做,才会自动实现全屏呢? 这里有1个难题要解决...

2018-05-28 14:19:44 7051

原创 仿Android 源码处理长按事件

项目中有个需求:当用户长按某个键,当有5秒的时候,提示用户松手。需求非常简单,如何用简单高效的方法来实现呢?刚开始是打算用个计时器,如果计时达到了5s,就提示用户松手,后面回想android button的长按点击事件,它又是如何实现的呢?view 的长按点击事件部分源码://这是一个runnableprivate CheckForLongPress mPendingCheckForLongPre

2018-05-07 17:03:15 597

原创 算法学习之七:链表

链表的概念:链表由一系列结点组成,每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。链表有单链表和双端链表代码实现单链表://先设计一个单链表的数据结构public class SingleLink { public int data; public SingleLink next; public Singl...

2018-04-02 09:48:20 143

原创 Android so库研究

一个so库引起的问题:我们项目一直是运行在32位系统的定制设备上,然后有一天,老板说我有一个华为平板,把项目移植到这个设备上看看效果,结果运行的时候有个出错提示:xxx.so is 32-bit instead of 64-bit,那怎么解决呢?还等着要给老板演示看呢。引发的思考:既然提示说这个so库不是64位的吗?那我就给你找一个64位的so库出来,很遗憾,厂商根本没做64位的...

2018-03-22 09:40:03 826

原创 视频播放比例问题研究

背景:针对视频满屏播放,有时候如果仅仅是设置某个控件宽高都是match_parent, 但是视频源却没有和设备的比例保持一致,就会存在画面被拉伸的情况,那么应该怎么避免呢?解决方法:第一步:确定视频源的比例:根据帧宽高算出比例大致是9:5 第二步:确定设备的宽高比例,我们设备屏幕是10寸,宽高是:1920*1200,比例是8:5第三步:分析,从上面两个比值来看,视频源比例和设...

2018-03-20 08:56:52 3171

原创 MVP的实践

背景:之前看到有朋友在项目中用mvp模式,他推荐我去看看google托管在github上的一个demo,然后我就下载下来看,结果是看得稀里糊涂的,感觉几个接口调来调去的,让我不够用的大脑更加混乱了。然后,我又在网上搜索一些文章看,结果绝大部分文章标题是:Retrofit+RxJava+Dragger2+MVP模式,一下子包装这么多框架进去,更是让看了之后,更是不会了。后面自己想:既然整体看不懂

2017-07-06 19:30:37 384

原创 自定义StepView

背景:先看自己写的demo图:项目中有一个需求:就是希望用户进行到哪步,哪步就高亮显示,并且每个步骤的图片都是不同的,完成的和未完成的线条和字也要做相应区分。我是参考了gtihub上一个开源的stepview(但是这个不完全符合我的项目需求),所以在其源码上,进行修改和相应调整,然后做出符合自己项目需求的stepview。 https://github.com/baoyac

2017-07-05 08:08:18 1061

原创 Handler实现倒计时的两种方式

背景:最近项目中,正好做到登录/注册这个功能快。它需要通过发送验证码,在规定的时间内用验证码来完成登录/注册。之前的项目中也有这个功能,但是觉得太复杂了,只好自己重新实现一遍。用Handler来做,觉得代码简介,逻辑也清楚。代码一://在向服务端发送获取验证码成功的回调函数中,开始发消息:mHandler.obtainMessage();mHandler.sendEmpty

2017-06-30 19:29:01 3607

原创 设计模式之二:iterator

用途:iterator 主要是针对不同容器,对外提供具有相同操作规范的遍历。因为不同容器内部具体实现不一样,所做的迭代也是不一样,为了便于程序的可扩展性,暴露一个接口,各个容器依据具体实现提供遍历方法。代码实现://自定容器之一:MyArrayList public class MyArrayList { private int[] datas = new int[5]

2017-06-24 09:46:33 230

原创 设计模式之一:责任链

概念:使多个对象都有机会处理请求,从而避免了请求的发送和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。 用图形定义:代码表示:比如新生开学流程:先去报到,再去买盆子、被子,再去买书,我们按照这个流程先来设计3个 处理器:分别处理报到,盆子和书的事情://通用接口public interface Processer {

2017-06-23 23:09:06 278

原创 算法学习之六:栈

栈的概念:栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。关键点:只能在一端进行插入和删除的操作。代码说明:用最常见的一个例子:用栈来判断某个字符串是否是回文字符串。大致说下回文字符串:就是正过来,反过来都是一样的,比如:abba, abcba

2017-05-03 17:38:03 363 3

Hands-On RESTful API Design Patterns and Best Practices

Hands-On RESTful API Design Patterns and Best Practices 2019年最新书籍

2019-04-30

Stream Processing with Apache Flink

Stream Processing with Apache Flink: Fundamentals, Implementation, and Operation of Streaming Applications 亚马逊最新的flink书籍, OREILLY出版社出版, epub格式原版 This book will teach you everything you need to know about stream processing with Apache Flink. It consists of 11 chapters that hopefully tell a coherent story. While some chapters are descriptive and aim to introduce high-level design concepts, others are more hands-on and contain many code examples.

2019-04-29

mystepview

仿快递流程,自定义实现显示各个步骤的stepview

2017-07-03

Android指引蒙版实现

Android指引蒙版的实现。

2016-10-25

TextView的展开与收缩

根据不同的内容,实现TextView的展开与收缩以及该相应指示箭头的处理

2016-05-13

TextView的展开与搜索

根据不同的内容,实现TextView的展开与收缩

2016-05-13

HistorySearchDemo

运用SQLite数据库存储用户搜索的词语。按照时间,过滤重复的词语展示在控件上。

2016-04-11

空空如也

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

TA关注的人

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