移动开发

Vue如何检测数组变化

原理分析: 在数据初始化时调用initData方法,然后通过new Observer对数据进行监测,然后对数据进行判断,如果是数组并且支持原型链,就会执行protoAugment让目标原型链指向arrayMethods,arrayMethods用来改写数组的原型方法。内部会采用函数劫持的方式,当用户调用这些方法(push,pop,shift,unshift,sort,splice,reverse)

3分钟看懂Android Studio下拉框组件

什么是下拉框? 实现步骤:一、布局文件中添加Spinner组件<LinearLayout xmlns:android="#34; android:layout_width="match_parent" android:lay

iOS - 自定义弹窗

通过xib创建一个自定义弹窗: 该弹窗可以自定义view的背景,颜色,字体的大小,颜色调整 方便编写,调用简单: image.png LoginAlertTableView.h image.png LoginAlertTableView.m import "LoginAlertTableView.h" @interface LoginAlertTableView() @pr

对iOS定位授权弹窗机制的理解

一、概述 由于最近在开发跑步相关的功能,涉及到地图定位功能,因此需要申请定位权限,之前APP中有定位需要,但因之前未细致的研究授权模式的配置,导致在开发跑步功能时产生了从未遇到的异常问题。 二、遇到的问题 问题描述: 问题描述:首次安装APP,授权定位权限为WhenInUse使用期间定位定位,然后开启跑步,此时接收定位回调,将APP切入后台等待3-5秒钟后,发现定位回调不再继续回调给APP,

Android ViewPager嵌套的手势冲突,分别用`内部拦截法` 和 `外部拦截法` 两种方式。看懂你就明白所有的手势处理的流程了

简介: 用内部拦截法 和 外部拦截法 两种方式处理两个横向的ViewPager嵌套的手势冲突 最终实现效果:按住右侧部分横滑就是滑动大ViewPager。类似抖音的首页 这个demo看懂你就明白所有的手势处理的流程了 github地址 功能: ✅Demo展示了 内部拦截法 和 外部拦截法 两种方式 ✅海量的代码注释,且注明了为什么要调用这行代码,如果不调用会怎么样 ✅看懂这个demo,所有的手势

【Android Studio】如何卸载干净(详细步骤)

Android SDK(软件开发工具包)是Android应用程序开发的重要工具,当你不再需要它、准备重新安装或迁移到其他系统时,完全卸载它是非常重要的步骤。因为一般电脑卸载 Android Studio 时容易落下一堆配置文件没删,卸载不干净导致无用文件占用空间或者影响其他版本软件的安装使用。总之,为什么需要完全卸

Android10.0 锁屏分析——KeyguardPINView PIN锁分析

学习笔记: PIN 解锁流程跟Android10.0 锁屏分析——KeyguardPatternView图案锁分析一样,这里就不过多讲解了。 在这里主要分析下 PIN 键盘的按钮事件。 1. 确认按钮 // KeyguardPinBasedInputView.java @Override protected void onFinishInflate() { // 省略部分

Lifecycle:生命周期感知型组件的基础 —— Jetpack 系列(1)

请点赞,你的点赞对我意义重大,满足下我的虚荣心。 🔥 Hi,我是小彭。本文已收录到 GitHub · Android-NoteBook 中。这里有 Android 进阶成长知识体系,有志同道合的朋友,跟我一起成长。 前言 生命周期是 Activity 的核心特性之一,也是 Android 视图开发无法规避的重要问题。 为了更加健壮地处理生命周期问题,Google 的解决方案是将

Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救

这是 MVI 架构的第三篇,系列文章目录如下: Android 架构之 MVI 雏形 | 响应式编程 + 单向数据流 + 唯一可信数据源 Android 架构之 MVI 初级体 | Flow 替换 LiveData 重构数据链路 Android 架构之 MVI 完全体 | 重新审视 MVVM 之殇,PartialChange & Reducer 来拯救 Android 架构之 MVI 究

Android 获取手机已安装的应用列表

1、扫描已安装的应用列表 var queryIntentActivities = mutableListOf<ResolveInfo>() val intent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) if (android.os.Build.VERSION.S