![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
android
文章平均质量分 72
ganduwei
你好,世界
展开
-
实现TextView尾部追加可点击的Icon和文本
就到国庆节了,上一次写还是五一的时候,真的好快好快,时间按周的单位在奔跑,一周,一周,又一周…七天,没有计划,人多,哪里都堵,还有疫情(主要还是没人一起玩😂)就窝在小出租屋里写写代码,看看书好了。祝祖国繁荣昌盛,世界和平共处。今天写的是 TextView 相关的效果,是之前项目中写过的,感觉还是有必要记录一下,还是花了一些时间,现在整理一下,方便以后使用。如果你看到了觉得有用那更好。看下效果1:在文本尾部显示一个icon。原创 2022-10-02 18:07:37 · 5310 阅读 · 1 评论 -
RecyclerView嵌套RecyclerView的滑动问题如何解
一、概述虽然今天我们要说的是Rv嵌套Rv的问题,但多数情况下我们都不会使用Rv嵌套Rv,去实现复杂的列表,而使用多个itemType实现,再难点的配合GridLayoutManager.SpanSizeLookup一起解决。因为Rv嵌套Rv会有问题,如果嵌套的Rv高度没有设置明确的值,会一次创建所有的item,造成卡顿问题。类似我们在NestedScrollView里面嵌套Rv,Rv的高度写的是wrap_content/match_parent,一样的情况。既然高度不确定,那我们给嵌套的Rv指定高度,原创 2022-05-29 01:19:50 · 3473 阅读 · 1 评论 -
RecyclerView列表中的倒计时实现
一、概述五一到了,劳动人民万岁!放假还要加班的程序员们,原本的回家或出行计划被迫放弃,他们辛苦了,希望老板们玩的开心。五一过完半年就差不多过去了,离十一也不远了。一年就这两个节点,过完这两个节点一年也到头了。今天来说一下列表中倒计时的实现,这是我在实际项目用到的方案,不知道那些大厂是怎么实现的,他们一定有很好的方案。我这只是记录下我自己的实现,如果大家知道更好的实现,可以告诉我。场景是有一个列表,比如购物车列表,item中会出现倒计时,比如秒杀倒计时。列表还支持分页,滑到第一页底部会加载下一页,下一页原创 2022-05-01 23:14:12 · 2398 阅读 · 0 评论 -
常见的App主页实现
一、概述再过两个月,我就30周岁了,开启人生的第四个十年。人生有几个十年,我已经度过了三个。我内心并未感觉自己三十岁,但每次听到同事们说出他们的年龄,心里暗暗比较比他们大了好几岁,才意识到他们真好,我曾经也是他们这样。自古三十而立,成家立业,我现在既没有成家,也不知道我这个写码的工作算不算立业,因为我还不知道过了30岁,还能写几年代码。但不管未来如何,当下好好写码,保持学习,未来也应该不会很差吧。上面纯属扯淡,下面开始今天的正文。现在主流的app首页都是底部几个Tab,上面是Fragment展示内容,就原创 2022-03-23 00:03:37 · 3148 阅读 · 0 评论 -
PopupWindow的使用和注意事项
一、概述Android常见的PopupWindow,显示在某个view的附近。这个经常会用到,而且还有些需要注意的地方,如果没有第一次使用或者对它不是很熟悉,可能会遇到一些坑:键盘弹起时,PopupWindow会挡住键盘;Android5.0上不显示。记录在这里,方便日后查阅,避免踩坑。二、代码class TipWindow(context: Context, val amount: String) : PopupWindow(context) { init { v原创 2022-03-17 18:48:38 · 3707 阅读 · 0 评论 -
浮在页面上可拖动的View
转眼到2022年了,回想第一次在csdn上写东西是2017年,距现在已过去5年。这5年之间,身边的人有的结婚了,有的生小孩了,有的买房了,有的升级做管理不再写代码了。而我,与这些都没有关系,还是一个菜,只不过从一个小菜变成了一个老菜,功不成名不就。原创 2022-01-23 16:05:25 · 1866 阅读 · 0 评论 -
改造Switch为IOS风格
改造Switch的样式为IOS效果布局 <androidx.appcompat.widget.SwitchCompat android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@null" android:checked="false" an原创 2021-09-04 23:50:48 · 626 阅读 · 0 评论 -
Android加载框LoadingDialog
加载中的菊花,背景透明,不会有阴影遮盖层class LoadingDialog(context: Context) : Dialog(context, R.style.LoadingDialogStyle) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setCancelable(false) setContentV原创 2021-09-04 23:39:38 · 1730 阅读 · 0 评论 -
全屏DialogFragment
全屏的dialog,并且还有弹出关闭动画,从底部弹出class MyDialogFragment : DialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //设置无标题,无背景色 setStyle(STYLE_NO_TITLE, R.style.Dialog) } ove原创 2021-09-04 23:25:51 · 2552 阅读 · 0 评论 -
Retrofit是如何支持协程
一、概述Kotlin的协程很好用,相信大家都用上了,也觉得很香,这不,Retrofit在最近的几个版本中就支持协程了,更加方便我们处理网络请求了。这里不说协程的用法,我比较好奇Retrofit是怎么识别并处理我们写的suspend方法,下面就以retrofit:2.8.1的版本来看看究竟是如何实现的。二、java眼中的suspend在研究Retrofit代码之前,我们先看一个问题,kotlin完全兼容java,但suspend是kotlin中的,java中并没有,那这是怎么兼容的呢?为了看看究竟,我们原创 2021-06-30 22:11:00 · 2204 阅读 · 4 评论 -
Android开发中遇到的问题
1、自定义View ,wrap_content 不处理时和父布局大小一样(占满父布局)。可以查看View的getDefaultSize方法。2、NestedScrollView 嵌套 竖向的RecyclerView 时,item会被全部创建出来。具体可看 measureChildWithMargins方法,传给RecyclerView的是UNSPECIFIED。3、https://www.jianshu.com/p/023a5f60e6d0RxJava : repeatWhen() 和 retryWhe原创 2020-12-14 10:43:33 · 1341 阅读 · 0 评论 -
Android TV开发之焦点控制
一、概述在Android TV开发中,最常处理的事情就是焦点的控制了,就像手机APP开发中的触摸事件的处理一样。但两者的处理有很大的区别,手机上是用手指触摸,可以随意点击任意的位置。而TV主要是通过遥控器上下左右移动焦点来操作,下一个焦点在哪,并不是随意的,都是由系统默认的规则和我们的设置来控制的。系统默认规则是,当方向键按下时,会把事件分发到ViewGroup中,这就涉及到哪些控件可以获取焦点,哪些控件优先获取焦点,以及哪里控件...原创 2020-09-02 20:41:56 · 5884 阅读 · 0 评论 -
Android卡顿监控
一、概述如果想要自己实现一个简单的卡顿监控功能,可以看下这编文章。我们都知道,Android程序 是基于事件驱动的,程序主线程一直在执行Looper的loop,loop的循环不断的读取事件进行处理,没有事件就等待着,退出程序也就退出这个循环。在Looper中,处理消息前后会打印log: // This must be in a local variable, in case a UI event sets the logger final Printer l原创 2020-09-02 13:36:08 · 728 阅读 · 0 评论 -
Android BLE开发指南三:中央设备端开发详解
Android 系统从4.3开始支持BLE,但当时只支持手机作为中心设备,后来从5.0开始,手机亦可作为外围设备。这里我们讲解手机作为中心设备是如何扫描和连接外围设备的,这是我们BLE开发中最常用到的。原创 2019-09-22 15:20:30 · 1391 阅读 · 0 评论 -
Android BLE 开发指南二:广播数据解析
BLE 外设开始工作时,会发出广播让中心设备发现,广播的数据包中带有外设的相关信息,比如设备的MAC地址,名字,Service 列表的 UUID 等等。广播包的数据结构都是固定的,按照蓝牙相关规范规定好的。每个包都是 31 字节,数据包中分为有效数据(significant)和无效数据(non-significant)两部分。原创 2019-07-14 16:25:06 · 4284 阅读 · 1 评论 -
Android BLE 开发指南一:GAP和GATT
1、概述蓝牙分为经典蓝牙和BLE。我们经常使用的蓝牙耳机和蓝牙音箱就属于经典蓝牙。BLE(Bluetooth Low Energy)称为低功耗蓝牙,是在蓝牙 4.0中引入的,相比经典蓝牙,其特点是功耗低,连接快,同时正是因为它功耗低,导致它的传输速率低,但它设计出来就是用来传输数据量不大的场景。BLE广泛用在可穿戴设备和物联网中。BLE 中有两种角色,一种是中心设备(Central),或者叫主...翻译 2019-07-12 22:54:56 · 3367 阅读 · 0 评论 -
RxJava笔记3:操作符
RxJava笔记3:操作符原创 2019-06-13 22:52:20 · 654 阅读 · 0 评论 -
RxJava笔记4:背压Backpressure
RxJava笔记4:背压原创 2019-06-13 22:51:58 · 195 阅读 · 0 评论 -
RxJava笔记2:线程控制
RxJava笔记2:线程切换原创 2019-06-11 01:25:18 · 263 阅读 · 0 评论 -
RxJava笔记1:Observable
基本概念ObservableSource 可观察源Publisher 事件发布者subscribe 订阅Observer 观察者Subscriber 事件订阅者Observer 通过subscribe 观察ObservableSourceSubscriber通过subscribe 订阅Publisher事件发布者,称为上游,事件订阅者,称为下游。Observable.create...原创 2019-06-08 00:10:27 · 457 阅读 · 0 评论 -
android学习记录4:解决as 导入依赖包时报错:com.android.dex.DexException和com.android.build.api.transform.TransformExc
今天导入v7和design的包时,build后没有问题,但是运行时,一直报错,如下图: 后来google了一下,在Stack Overflow里面找到了答案,因为我依赖了另一个Moudle,而这个Moudle里面的libs文件夹的jar文件与我运行的Moudle中libs里的jar重复,导致报了这些错误。去掉重复的jar后,clean了一下项目,然后运行成功。原创 2017-02-05 18:22:38 · 731 阅读 · 0 评论 -
android学习记录5:自定义控件
今天在项目中写了一个自定义的控件,是一个页面的title,基本每个页面都要用到。没有使用actionbar或者toolbar,看看以后是否能够改用toolbar来实现。这是效果图: 第一步首先我写了title的布局文件,放了三个控件,左边,中间,和右边:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="htt原创 2017-02-05 19:16:52 · 302 阅读 · 0 评论 -
android学习记录1:android自定义Dialog
自定义Dialog: Dialog mDialog = new Dialog(MainActivity.this); //设置没有标题区域 mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); //设置背景 mDialog.getWindow().getD原创 2017-02-01 16:30:43 · 319 阅读 · 0 评论 -
android学习记录2:DatePicker的使用及设置其主题
DatePickerDiaLog 在android 4.n的版本中,取消选择日期时,仍会调用OnDateSetListener 。故使用DatePick+AlertDialog来实现日期选择功能。代码如下:DatePicker date = new DatePicker(OrderPickingActivity.this);date.setCalendarViewShown(fals原创 2017-02-02 00:43:43 · 1739 阅读 · 0 评论 -
android学习记录6:实现ViewPager的Indicator
虽然在android5.0中design中有了TabLayout来实现ViewPager的Indicator,简单好用。但这个是我自己实现的,学习了很多,记录在这里。效果图: 第一步新建一个类继承LinearLayout,用来绘制指示器,及提供Viewpager滑动时重绘指示器的额方法:public class ViewPagerIndicator extends LinearLayout{原创 2017-02-05 20:56:57 · 440 阅读 · 0 评论 -
ProgressBar:自定义旋转图片
自定义旋转图分三步:1、在layout中为ProgressBar设计布局; 2、在style中为ProgressBar设置Style; 3、新建一个类继承ProgressBar,在构造方法中设置style,加载布局;下面是我写的一个例子,先看第一步,布局:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="htt原创 2017-04-25 17:51:24 · 1615 阅读 · 0 评论 -
实现圆形ImageView
现在很多App的头像都使用圆形来展示,于是自己想了想如何去实现,先在网上搜了下资料,其核心是通过设置Paint的PorterDuffXfermode 合成模式来实现。先来了解下PorterDuffXfermode 的合成模式(图片来自网上): Src为原图,Dst为目标图,图片显示的是先绘制目标图,然后设置Xfermode,再绘制Src后的效果。有13种不同的合成模式,我们看SrcIn和Dst原创 2017-04-25 18:18:05 · 324 阅读 · 0 评论 -
流式布局
流式布局public class FlowLayout extends ViewGroup { private ArrayList<View> lineViews; private ArrayList<ArrayList<View>> allViews; public FlowLayout(Context context) {...转载 2017-08-14 20:23:13 · 286 阅读 · 0 评论 -
使用单Activity多Fragment架构的一些总结
前段时间用单Activity架构写完了项目,在整个过程中遇到了很多问题,现在记录一下,避免再次踩坑。首先对项目做一个概述:整个app只有一个MainActivity,首次进入app显示登入注册相关Fragment页面,登入后进入MainFragment页面,MainFragment布局由ViewPager和5个RadioButton构成,ViewPager承载5个fragment,Radio...原创 2018-04-23 13:43:34 · 11543 阅读 · 3 评论 -
使用RecyclerView优雅的实现折线图
众所周知,RecyclerView是个强大的控件,拥有很大的可扩展性,但是使用起来比ListView的难度会大一点。 今天我们就使用RecyclerView结合她的ItemDecoration来实现一个可左右滑动的折线图,静态效果图如下: 想想如何来实现呢?首先分析下要解决几个问题: 1、每个点的位置坐标如何计算; 2、每个点,及点与点之间的连线通过什么方法绘制; 3、每个点都有点击...原创 2018-09-16 00:59:43 · 1248 阅读 · 0 评论 -
记一次关于Fragment的内存泄漏
之前使用单Activity多Fragment架构完成过一个项目,在后期维护时发现一个很严重的问题,很多页面在关闭之后,内存无法被回收,出现了内存泄漏问题。leakcanary显示信息如下:...原创 2018-09-25 22:48:10 · 12722 阅读 · 0 评论 -
自定义带进度的Button
前段时间做了一个应用市场的项目,项目中需要一个带进度的Button:如图,可以观察到大致有三点要求:1、Button有各种状态;2、下载过程中要显示下载进度;3、被进度覆盖的文字颜色与未被覆盖的文字颜色不同。首先可以肯定的是必须通过自定义View来实现,那怎么实现了,我们来一点一点分析。第一点,状态比较容易实现,直接忽略。看第二点,如何实现进度?进度的计算倒不难,难的是如何将它画出...原创 2018-10-13 19:31:31 · 1039 阅读 · 0 评论 -
Android实现app内的语言切换功能
我在目前所在的公司负责一个app项目的维护,最近需要对这个项目进行国际化,适配10多个国家的语言,在实现国际化过程中,遇到了很多问题,最麻烦的就是翻译了,得一个个将翻译从excel复制到资源文件中,还得保证key和value一一对应,稍不注意就容易出错,当然也有一些自动化的工具可以替代手工复制,但需要excel满足一定的规范,不然会出现一些差错。还有就是其他语言下的ui适配,有些文字翻译成其他语言...原创 2019-03-09 20:36:32 · 5424 阅读 · 0 评论 -
妙用RecyclerView的ItemDecoration
ItemDecoration 是item的装饰器,item间的分割线就是使用她来实现的,但她还可以搞出其他事来, 因为她有canvas,我们可以像自定义view一样,来使用她。比如我们可以实现如下图的效果:这个列表显示了每天的数据,数据按时间倒序排列,数据按天的单位进行分割,并显示出日期,每天的数据个数是不一样的。相信这样的效果大家会经常碰到,实现方法很多也很容易,但我相信使用ItemDec...原创 2019-03-26 21:57:44 · 1163 阅读 · 0 评论 -
对动态代理(DynamicProxy)的理解
1、动态代理属于AOP(面向切面编程)的一种思想。2、代理对象和被代理对象都实现了相同接口。3、动态代理是指系统根据要代理的接口,自动帮我们生成并编译代理类(实现了要代理接口),并将代理类中的代理逻辑抽象到 InvocationHandler 中,由开发者实现。静态代理中,我们需要自己实现代理类,将代理逻辑也写在代理类里面。而动态代理省去了我们自己写代理类的工作,系统只需要知道要代理的接口,然...原创 2019-04-30 15:03:00 · 1748 阅读 · 0 评论 -
一个像尺子的滑动选择控件 - RulerSelectView
1、简述项目中,需要做一个可滑动选择的控件,如下图:可左右滑动,滑动结束后,刻度与红色刻度线对齐。红色刻度线上的刻度为选中的刻度。这种可滑动选择的交互比较常见,比如app中的日期、地区选择等等,常常会有这样的设计。通常我们可能因为项目时间紧或其他原因而直接使用别人写好的开源库,集成到项目中来使用。但其实我并不推荐大家这么干,使用别人的虽然快速,但这样会导致你的项目依赖的三方库越来越多,隐藏...原创 2019-05-31 01:03:19 · 1417 阅读 · 2 评论 -
android学习记录3:自定义状态栏颜色(android4.4以上)
从android4.4开始可以设置透明状态栏,可以根据这个功能来实现自定义状态栏的颜色;而在android5.0开始,可以直接修改状态栏的颜色。下面是我在项目中做的,实现了自定义状态栏颜色(只有在android4.4以上有效)。 首先看下主题: v19\styles.xml <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoA原创 2017-02-05 17:58:49 · 319 阅读 · 0 评论