自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

安卓开发-顺 的博客

个人总结心得、个人开源框架

  • 博客(75)
  • 收藏
  • 关注

原创 Glide 源码分析(4.13.2)

前言:Glide 作为Android 图片加载领域最火的一款框架,其背后的源码设计同样精彩,今天就来一探究竟(基于Glide4.8.0版本)。由于Glide框架的源码非常庞大,我们不会把所有细节分析一遍,本文只分析其核心源码,重点分析其对生命周期的监听和缓存的处理。目录一、with二、load三、into我们的分析思路就从最简单的开始,来看看其背后的源码到底是怎么样的。Glide有5个with的重载方法..................................................

2022-07-11 20:23:30 1267 1

原创 Retrofit 源码分析

上一篇文章我们分析了OKHttp3的源码,趁热打铁我们接着分析下Retrofit的源码。首先,先明确一个问题,Retrofit并不是一个网络框架,它是一个对OKHttp的使用封装框架,其内部依赖了OKHttp,真正的网络请求都是由OKHttp来实现。..................

2022-06-23 11:11:46 152

原创 OkHttp3 源码分析

提起Android网络框架就不得不聊一下square公司开源的OKHttp 框架,今天就请跟着本文的思路来看下OKHttp3的源码。目录一、分发器1、同步任务分发2、异步任务分发3、线程池的封装二、拦截器1、重试重定向拦截器:RetryAndFollowUpInterceptor2、桥接拦截器:BridgeInterceptor3、缓存拦截器:CacheInterceptor4、连接拦截器:ConnectInterceptor5、请求服务器拦截器:CallServerInterceptor本文会从两大主线来

2022-06-13 16:19:25 514

原创 Android 让滑动冲突变的简单(含源码分析)

目录一、滑动冲突的统一解决方案1、外部拦截(推荐方案)2、内部拦截二、从源码角度看滑动冲突是如何被解决的1、外部拦截2、内部拦截一、滑动冲突的统一解决方案1、外部拦截(推荐方案)(1)什么是外部拦截?外部拦截的意思就是在两层嵌套的情况下,由外层去主导滑动的分工以实现该是谁滑动就谁滑动。(2)如何实现外部拦截?我们举一个具体的例子来看看外部拦截是如何实现的,这样我们用一个ViewPager来包裹一个ListView说明一下:此冲突系统已经帮我们解决,在.

2022-02-13 21:33:44 1570

原创 Android 手写实现插件化换肤框架 兼容Android10 Android11

实现插件化换肤,有以下几个关键问题要处理收集所有需要换肤的view及相关属性 统一处理所有Activity的换肤工作(每一个Activity都要进行换肤处理) 加载皮肤包资源 处理支持库或者自定义view的换肤 处理状态栏换肤 对代码动态设置颜色、背景的业务场景进行单独处理接下来,我们将完成以上6步的内容,继续阅读前,建议先阅读我的另外两篇文章作为基础知识:Activity setContentView背后的一系列源码分析Android 让反射变的简单建议先阅读.

2022-01-27 11:49:34 3141

原创 Activity setContentView背后的一系列源码分析

本文将涉及到Activity、PhoneWindow、DecorView、LayoutInflater的相关源码分析。下面从Activity onCreate 中的 setContentView开始

2022-01-12 21:11:52 1979

原创 Android 11(platfrom 30)APP启动流程(含Activity)核心点记录

前言:边分析,边记录 不断更新场景一、从桌面点击APP图标进行启动设计dao

2021-06-14 21:40:45 12681 12

原创 Android 个人开源框架: 图片精确压缩框架、指定大小、指定尺寸压缩(原理:采样率压缩 + Matrix缩放 + 质量压缩)

EasyImageCompressorgithub:https://github.com/ZS-ZhangsShun/EasyImageCompressor简介通过采样率压缩 + 质量压缩,使用简单的配置即可完成图片指定大小指定尺寸的压缩使用方法第一步:在project的build.gradle 文件中添加JitPack依赖allprojects { repositories { ... maven { url 'https://jitpac

2020-05-24 18:36:34 2403

原创 Android Mqtt 开源框架 EasyMqttAndroidClient

EasyMqttAndroidClient使Mqtt安卓客户端变的更简单、更好用github地址:https://github.com/ZS-ZhangsShun/EasyMqttAndroidClient简介基于第三方开源框架Mqtt Android客户端封装的用于接收、发布推送消息的组件。功能1.支持消息的订阅与发布2.支持服务器的连接与断开3.支持连接状态的判断...

2017-12-28 17:52:52 8512 12

原创 iOS ijkplayer 硬解H265(hevc)4k视频问题解决

上一篇基于B站开源项目编译成功iOS版本的ijkplayer以后,进行了h265并且是4K(3840x2160)码流的播放测试,发现不管怎么尝试上层暴露的软硬解、丢帧等参数的配置。

2022-09-21 11:00:46 3549 1

原创 Android、iOS ijkplayer编译步骤及相关问题解决

执行命令:./init-ios-openssl.sh 初始化https相关内容、修改 ios文件夹下compile-ffmpeg.sh第24行 改为: FF_ALL_ARCHS_IOS8_SDK="arm64 i386 x86_64"第120行 改为: if [ "FFTARGET"="armv7s"−o" FF_TARGET" = "arm64" ];then第159行 改为: echo " compile-ffmpeg.sh arm64|i386|x86_64"

2022-09-16 14:59:58 1598

原创 Android 实现分组标题吸顶效果,支持上下左右padding

先上gif效果图:技术方案:RecycleView + ItemDecoration具体实现:第一步:先实现相关业务代码,让数据加载出来Activity:/** * 实现吸顶效果 演示 */class RecyclerViewActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

2022-02-28 11:29:09 4871

原创 Android 嵌套滚动NestedScrollView+TabLayout+ViewPager+Fragment+RecyclerView 实现京东、美团首页效果Tab页滚动到顶部时自动吸附

Android 嵌套滚动NestedScrollView+TabLayout+ViewPager+Fragment+RecyclerView 实现京东、美团首页效果Tab页滚动到顶部时自动吸附

2022-02-06 19:18:55 4277 4

原创 Android 自定义View 手写瀑布流组件FlowLayout

纸上得来终觉浅,绝知此事要躬行。FlowLayout实现关键步骤:1、创建一个view继承自ViewGroup2、重写并实现onMeasure方法3、重写并实现onLayout方法

2022-01-18 20:57:40 2779

原创 Android 认识注解、学习注解、使用注解

1、什么是注解?就像最常见的 @override注解一样,注解是一种通过一些标注就能自动完成一些代码实现的一种机制。2、注解的好处(1)使用注解可以降低项目的耦合度(2)能自动完成一些代码,实现代码的复用,减轻开发者工作量(3)代码侵入性较低,使用起来也很方便。3、什么是元注解?元注解有哪些元注解是java提供的基础注解,负责注解其他注解。元注解有以下几种@Retention:注解保留的生命周期 (源码阶段、编译阶段、运行阶段 例如 butternkife 中代替finid.

2022-01-12 16:07:50 932

原创 Android 让反射变的简单

前言:在网上搜索反射的相关知识,会得到各种各样的答案,有的是正儿八经的官方定义,有的是突然贴出的一段代码,看的一头雾水,下面用一个简单的例子来理解下反射。

2022-01-11 20:26:29 1974

原创 kotlin协程

一、子线程与UI线程切换典型场景示例示例一GlobalScope.launch(Dispatchers.Main) { toast("开始请求,请等待...") withContext(Dispatchers.IO){ log("向后台请求数据") } toast("请求完毕,更新UI...")}示例二CoroutineScope(Dispatchers.Main).launch { //这里是主线程 可以 执行弹出提示框等ui操作 log

2021-12-30 16:31:35 1343

原创 kotlin高阶函数部分场景示例

一、函数作为形参传入函数需求:写一个方法名为“show”的函数,有两个入参,参数1是个boolean类型,参数2是一个回调函数,返回一个String类型的值首先咱们先看下不用高阶怎么实现:第一步:定义一个回调接口函数interface KtCallback { fun show(info: String): String}第二步:写出此函数/** * 普通函数 接口回调的形式 */fun show(isShow: Boolean, callback: KtCall

2021-12-27 09:45:16 1218

原创 我理解的Rxjava

通过两个线索来理解rxjava原理线索一:订阅流程 subscribe线索二:事件执行流程 以onNext为例示例代码:Observable.create( new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emit

2021-08-31 13:39:00 119

原创 Serializable & Parcelable 原理和区别

文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言一个中国人碰到一个美国人(假设大家只会本国语言),中国人写了个一二三,美国人写了个one two three,结果双方都看不懂,于是中国人写了123,美国人也写了个123,结果双方都看懂了。这个变成123的过程就叫序列化,123变成一二三或one two three的过程就叫反序列化。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:panda...

2021-08-18 22:14:44 394

原创 Android布局代码设置尺寸用px值还dp呢?

场景一、new LinearLayout.LayoutParams(width, height);这里的h就是LayoutParams中的width 和 height 要的就是px值注意:通过下面这种方式拿到的值也是px值 如果dimen文件里写的是dp 到这里取出来后系统会换算成pxint dimen = getResources().getDimensionPixelOffset(R.dimen.star_film_banner_height)场景二、...

2021-03-17 11:10:55 1429

原创 Android APP之间的跳转与传参数

方式一、只知道目标app包名的情况下:启动方:Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);intent.putExtra("param1","value1");intent.putExtra("param2","value2");context.startActivity(intent);接收方:Intent intent = getIntent();if.

2021-01-18 17:56:41 1366

原创 Android TV开发 视频窗口选中放大效果的实现

先上效果图视频模块的布局是这样的:<RelativeLayout android:id="@+id/first_view_rl" android:layout_width="510dp" android:layout_height="291dp" android:layout_marginLeft="@dimen/smart_hospital_home_marginLeft" android:layout_marginTop="@dimen/sma

2020-12-25 10:39:56 863

原创 Android Handler机制的几个疑问点验证

前提场景:Activity中new一个Handler并重写handleMessage方法public class SingleTopActivity extends Activity {@SuppressLint("HandlerLeak")Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg);

2020-12-06 18:21:14 255

原创 Android 直播时移功能的三种技术方案

一、准备知识:先了解下直播的播放原理(1)首先拿到一个在线播放地址,例如:http://xxx:8080/live/161347.stream/playlist.m3u8?ext=m3u8(2)然后把播放地址扔给播放器(3)播放器通过地址拿到m3u8文件 如下,没有结束标识,因为直播一直在持续更新,点播是有结束标识的。#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:16424144#EXT-X-ALLOW-CACHE:YES#EXT-X

2020-09-17 12:10:37 1331

原创 Android开发 如何计算最小屏幕宽度sw

问题:1、如何计算设备的最小屏幕宽度呢?2、布局文件里一个view的宽我写多少dp能刚好充满呢?3、res下有values-sw384、values-sw392、...values-sw1280等等我怎么知道一个设备会自动去找哪个适配文件呢?这三个问题其实是一个问题,下面来解答:首先获取屏幕宽、高、像素密度 单位是pxDisplayMetrics dm = context.getResources().getDisplayMetrics();int width = dm.w.

2020-08-17 16:03:48 2751

原创 浅谈Android手机cpu架构适配

常见手机端cpu架构 armeabi armeabi-v7a arm64-v8a (x86、x86_64 手机端可以忽略,大都是平板设备)场景一、只有armeabi-v7a架构的so或包含so的aar优点:1、兼容市场99.9%以上的设备,armeabi大概10年前手机会用,可以忽略。2011年以后的手机基本是armeabi-v7a、arm64-v8ax86的手机其实也有自己的兼容机制,可以兼容armeabi-v7a,不过x86手机几乎不存在2、体积小缺点:在arm64-...

2020-08-13 15:38:32 1764

原创 Android 拦截Tablayout 点击事件

背景:特定需求,点击某一个tab时,直接跳转到其他页面,不做任何选中操作,如下图点击小视频要跳转而不是选中这个tab思考:Tablayout是安卓官方提供的,内部的点击事件都在内部封装,没有暴露类似的回调接口让用户自己处理某个tab的点击事件,但是通过看源码发现 每一个tab的点击事件其实是一个内部封装的继承自LinearLayout的一个TabView来触发的看14...

2020-04-28 11:08:47 4015 8

原创 ScrollView嵌套RecyclerView再嵌套RecyclerView导致的布局展示不完整问题

背景:页面布局,最外层有个ScrollView,然后里面有个RecyclerView,然后每个RecyclerView的item都是一个RecyclerView异常:页面展示不完整,最底下的Item 展示一半,在往上滑就滑不动了解决:// 每一个item渲染完后重新计算外层recyclerview高度// 因为外层的recyclerview是先渲染的,渲染时 内部recy...

2020-03-30 16:19:16 645 1

原创 如何获取Android project下 build.gradle、gradle.properties、local.properties文件中定义的属性或变量

1、读取project下 build.gradle属性:ext { compileSdk = 28 minSdk = 17 targetSdk = 28 support = "28.0.0" buildTools = "28.0.0" supportLibraryVersion = "28.0.0" versionCode = 4...

2020-03-06 11:48:43 12930 1

原创 机顶盒App安装在sd卡的目录

/mnt/asec/com.Yinyou.sdjqTV-1/pkg.apk是mnt asec 不是mnt sdcard 记录一下,当data分区空间不足时,会安装到此目录下

2019-12-03 10:14:43 2106

原创 三处设置实现一个状态栏沉浸底部虚拟键不沉浸的底部弹出的全屏Dialog

先看下面的效果图,这个页面并不是一个Activity 而是一个Dialog,这个Dialog是全屏、顶部状态栏沉浸、底部虚拟器露出且支持从底部弹出的对话框,下面让我们通过三处设置来实现这个效果。一、给Dialog添加Stylepublic BaseDialog(@NonNull Context context) { super(context, R.style.ActionS...

2019-10-23 11:27:14 787

原创 开发细节备忘录

代码动态设置文件读写权限String command = "chmod 644 /data/data/com.xxx.xxx/cache/tmp.ts";Runtime runtime = Runtime.getRuntime();runtime.exec(command);机顶盒的启动Activity SplashActivity 断电重启会被启动两次怎么办?设置启动模式 a...

2019-10-21 11:17:32 612

原创 使用悬浮窗居中的问题 -- 有效果图

今天写了个全局可以弹出的悬浮窗来显示重要提示,结果自己把自己绕进去了,一直居中不生效,最后恍然大悟,是全屏状态下背景是透明的,都全屏铺满了,还咋居中啊,解决方法是内部在套一层布局,随便指定位置即可 ,另外这里的文字可以自动滚动显示,下面是截图和关键代码:效果图:布局文件:关键是第二个RelativeLayout 的android:layout_centerInParent="t...

2019-09-19 16:21:09 1226

原创 Android 自定义Apk编译名称

例如自定义名称+当前时间来命名:android { ... android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = "Test-${releaseTime()}.apk" } }}def r...

2019-09-11 15:40:03 558

转载 将自己的工程开源到GitHub---转载记录保存

1.1 工程中创建Module  最开始你可能自己写了个工程,感觉不错,进行了一定的封装和优化,想留作开发下一个App时用或者给别人用。但是每次复制粘贴代码显得繁琐,还要处理一堆的package name和import错误。于是你想着把它改造成独立的工程,每次整个工程复制进去,设置引用就可以了。这就要使用Android Studio的module了。以前,你的工程只有一个Module,就是(M...

2019-09-11 14:00:04 127

原创 Android编译报错---持续记录中

编译项目时经常遇到各种错误,各种版本冲突,依赖找不到等,之前遇到了就解决一下,下次遇到又忘记了,有得查资料改,现在写篇博客把遇到的记录下来。错误1:Android dependency 'com.android.support:support-fragment' has different version for the compile (24.2.1) and runtime (27....

2019-09-09 15:32:07 295

原创 Android data/data/包名 下相关路径记录

这里的this用的是Activity的contextString s2 = this.getFilesDir().getAbsolutePath();String s3 = this.getFilesDir().getParent();String s5 = this.getDir("zhangsan",Context.MODE_PRIVATE).getAbsolutePath();S...

2019-07-24 14:41:02 2382

原创 Android 调用第三方so中方法记录

背景:公司其他部门提供了一些c语言写的方法 用ndk封装成了 so文件 我们Android上层app需要调用开始:第一步:拷贝so文件到AS工程这里注意 如果你是放在module的 libs下 还要在module的build.gradle中 android{}里面加上这个配置sourceSets { main { ... ...

2019-07-24 10:27:47 6387 1

原创 Android Retrofit注解和postman各种参数类型的对应关系

一、Get请求 没啥区别都是拼在url串上二、Post请求 本文重点 1、form-urlencoded 方式 postman 是这个样子 retrofit是这个样子 后台收到是这个样子 Content-Type: application/x-www...

2019-05-29 11:35:10 777

空空如也

空空如也

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

TA关注的人

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