自定义 ImageSpan 之行居中,可设置左右间距
实现功能:
- Image 所在行居中显示
- 可以设置图片和前后文本的间距
1 | import android.content.Context |
使用场景
1 | val spanStr = SpannableStringBuilder("#") |
实现功能:
1 | import android.content.Context |
使用场景
1 | val spanStr = SpannableStringBuilder("#") |
RecyclerView+SnapHelper实现ViewPager滑动效果
SnapHelper结合RecyclerView使用,能很方便的实现ViewPager滑动效果。SnapHelper是一个抽象类,Google内置了两个默认实现类,LinearSnapHelper和PagerSnapHelper。
使当前Item居中显示,常用场景是横向的RecyclerView, 类似ViewPager效果,但是又可以快速滑动多个条目。
1 | LinearLayoutManager manager = new LinearLayoutManager(getContext()); |
使RecyclerView像ViewPager一样的效果,每次只能滑动一页。
1 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); |
示例代码如下:
1 | import android.content.Context; |
在 attrs.xml 文件中定义控件的圆角dp值属性:
1 | <declare-styleable name="RoundImageView"> |
使用示例
1 | <com.xx.ui.widget.RoundImageView |
当显示2个或2个以上文案时,每隔2秒切换气泡文案
核心实现代码如下:
1 |
|
由于动画要在顶部浮层,这样动画才能不被父类容器的大小所限制和切割,所以,直接在PopWindow中显示。
具体代码如下:
1 | import android.view.LayoutInflater |
添加布局代码如下:
1 |
|
drawable:
1 |
|
显示内容超出规定的行数之后,显示 展开 和 收起
1 | import android.content.Context; |
控件使用方式
1 | val tvContent = holder.getView<ExpandableTextView>(R.id.tv_content) |
1 | import android.content.ComponentName |
1 | class CenteredImageSpan(context: Context, drawableRes: Int) : ImageSpan(context, drawableRes) { |
1 | val spanStr = SpannableStringBuilder() |
下面介绍一下kotlin 线程安全的几种单例写法。
1 | // Kotlin实现 |
1 | // 反编译Kotlin实现的Java代码 |
双重校验锁式(Double Check)
1 | // Kotlin实现 |
1 | // 反编译Kotlin实现的Java代码 |
1 | //Java实现 |
1 | // Kotlin实现 |
1 | // 反编译Kotlin实现的Java代码 |
CrashHandler 处理 Java 异常流程:
CrashHandler 源码如下
1 | import android.os.Build |
使用方式:
在 Application 的 onCreate() 方法中, 调用 RrCrashHandler.install(BuildConfig.DEBUG, AppUtils.isMainProgress(this))
参考链接:
https://github.com/android-notes/Cockroach
https://github.com/android-notes/Cockroach/blob/master/%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md
SmartRefreshLayout 嵌套 ViewPager2 上拉加载更多,在 finishLoadMore() 方法之后,底部加载 Loading 位置会多出一段空白不消失。
解决方案:
1 | smartRefreshLayout.setEnableScrollContentWhenLoaded(false) |
自定义下拉刷新头部,使用 PAGView 做动画,可以在 onMoving(boolean b, float v, int i, int i1, int i2) 方法中设置 pagView.setProgress(v); 添加手势动画。
1 | import android.content.Context; |
1、msg 可空String解析 jsonReader.peek() == JsonToken.NULL
1 | import com.google.gson.Gson |
埋点需求,Android App 需要在onResume 和 onPause 方法中计算浏览的时长,同时上报浏览的进度。
浏览进度Rate具体的计算方式的具体过程:
1、在滚动屏幕过程中,通过 textContent?.viewTreeObserver?.addOnScrollChangedListener 来记录屏幕滚动的位置
2、在滚动监听里通过textContent?.getLocationOnScreen(location)获取在屏幕的具体位置,同时,
计算出visibleHeight = screenHeight - location[1] 当前文本的可见高度
3、当可见高度超过目标的高度,则认为已经全部浏览,rate = 100% ,同时移除滚动监听textContent?.viewTreeObserver?.removeOnScrollChangedListener(mScrollChangeListener)
核心代码如下:
1 | private var totalHeight: Int = 0 |
提供了注册加载更多,和判断是否不足一屏等工具方法
1 | import androidx.recyclerview.widget.GridLayoutManager |
这个自定义布局要求显示为 系列名称... + 第一季 ,后面的季内容显示完全,紧贴系列名称显示,系列名称在布局不允许的时候可以部分显示。
1 | /** |
Android专栏-BaseQuickAdapterHelper
1 | import android.view.View |
1 使用自定义 AlertDialog 实现
2 window?.setFlags 设置 dialog 的样式
3 window?.attributes 设置 dialog 的位置
4 返回键监听,兼容机型需要使用 setOnKeyListener
5 按一次音量键回调多次的问题,KeyEvent.action 事件分 KeyEvent.ACTION_UP 和 KeyEvent.ACTION_DOWN
6 音量加减需要获取系统音量 max 值来手动控制,不同手机 max 值域不同
示例代码如下:
1 | import android.app.Activity |
自定义Dialog的Style
1 | <style name="VolumeDialog" parent="android:style/Theme.Dialog"> |
观察者模式 + Kotlin 泛型实现的简易版消息中心
1 | class MessageCenter<T> { |
Update your browser to view this website correctly.&npsb;Update my browser now