一、项目概述

来电模拟器 是一款 Android 模拟来电应用,旨在提供高度仿真的来电体验。支持自定义来电号码、归属地、SIM 卡序号,内置 5 种主流手机品牌铃声,配合炫彩流光特效、滑动接听挂断手势、持续震动反馈与壁纸实时高斯模糊,营造逼真的来电场景。

包名:com.jay.inmcomingcall
最低兼容:Android 8.0 (API 26)
目标版本:Android 15 (API 35)
构建工具:Gradle 8.11.1 + Kotlin DSL
• • •

二、技术栈与构建

环境版本
JDK11+
Gradle8.11.1
compileSdk35 (Android 15)
minSdk26 (Android 8.0)
targetSdk35
versionCode10
versionName2.0

构建使用 app/build.gradle.kts,Release 版本自动命名:来电模拟器_V2.0_2026.07.19.apk

依赖库:

• • •

三、工程结构

项目采用简洁的 3 + 2 架构:3 个 Activity + 2 个工具类。

inmcomingcall/
└── app/src/main/java/com/jay/inmcomingcall/
    ├── IncomingCallActivity.java   # 来电主界面 (552行)
    ├── ConnectedActivity.java      # 通话中界面 (150行)
    ├── SettingsActivity.java       # 设置界面 (225行)
    ├── VibratorUtil.java           # 震动反馈工具类 (98行)
    └── WallpaperBlurUtil.java      # 壁纸高斯模糊工具 (160行)Text

资源文件方面,包含 38 个可绘制资源、5 个机型铃声 MP3、3 个动画资源、日间/夜间双主题。

• • •

四、核心模块

4.1 IncomingCallActivity — 来电主界面

入口 Activity,包含以下核心功能:

功能实现方式
来电信息显示从 SharedPreferences 读取号码、归属地、卡号
机型铃声MediaPlayer 循环播放 raw 目录对应机型 MP3
持续震动VibratorUtil 800ms 震 + 800ms 停循环
按钮跳动动画AnimatorSet 两段跳动 + OvershootInterpolator 弹性复位
绿色涟漪特效View 缩放 + 透明度渐出,700ms 完成扩散淡出
左右流光光效8 种状态循环,HSV 色相 6 秒一圈连续过渡
滑动接听/挂断Touch 监听,以基准值计算位移,超过 320px 触发操作
沉浸模式适配 Android 11+ WindowInsetsController

滑动交互核心逻辑

button.setOnTouchListener((v, event) -> {
    switch (event.getAction()) {
        case ACTION_DOWN:
            cancelBounceAnimation();           // 立即停止跳动
            downY = event.getRawY();
            startTranslationY = v.getTranslationY();
            return true;

        case ACTION_MOVE:
            float delta = downY - event.getRawY();
            float newY = startTranslationY - delta;
            newY = Math.max(-maxOffset, Math.min(0, newY));
            v.setTranslationY(newY);            // 跟手滑动
            return true;

        case ACTION_UP:
            if (fingerDelta > THRESHOLD_Y) {    // 超过阈值
                if (isAnswer) {
                    VibratorUtil.vibrateAnswer(this);
                    startActivity(new Intent(this, ConnectedActivity.class));
                } else {
                    finishAffinity();            // 退出
                }
            } else {
                v.animate().translationY(0).start();  // 弹回
                restartBounceCycle();
            }
            return true;
    }
});Java

4.2 ConnectedActivity — 通话中界面

模拟通话接通界面:Handler 驱动每秒计时器(MM:SS),功能按钮包含录音、静音、挂断等 9 个操作。

4.3 SettingsActivity — 设置界面

ScrollView 内排列 4 张配置卡片:号码信息、位置信息、机型铃声选择(自定义 Dialog 替代 Spinner 解决滚动冲突)、震动开关。数据通过 SharedPreferences 持久化。

4.4 VibratorUtil — 震动工具类

兼容 Android 12+ 的 VibratorManager 新 API,提供三种震动模式:

4.5 WallpaperBlurUtil — 壁纸模糊

无需 RenderScript:壁纸 1/8 降采样 → 3 次快速均值模糊(Box Blur)→ 放大回目标尺寸,子线程执行不阻塞 UI。

• • •

五、功能清单

01来电信息显示
025 种机型铃声
03来电持续震动
04按钮跳动动画
05绿色涟漪特效
06边缘流光光效
07HSV 炫彩变色
08上滑接听/挂断
09接听震动反馈
10通话计时器
11挂断震动反馈
12设置持久化
13机型选择器
14震动开关控制
15壁纸实时模糊
16全屏沉浸模式
17APK 自动命名
18夜间主题适配
• • •

六、使用说明

安装方式

直接安装 Release APK 或通过 Android Studio 部署。首次打开自动进入来电界面,点击底部"设置"按钮配置号码、归属地、机型铃声。

交互方式

• • •

七、开发心得

滑动接听 — 手势交互的艺术

初次实现使用简单 translationY 累加,跟手性差。最终方案:ACTION_DOWN 记录当前 translationY 为基准,MOVE 时基准值减去手指位移计算新位置,彻底解决跳变。

HSV 色彩循环 — 炫彩光效的秘密

ValueAnimator 在 0°→360° HSV 色相空间线性插值,外层亮度 50%、内层 100%,配合 PorterDuff.SRC_IN 颜色滤镜,4 行代码完成着色。

壁纸模糊 — 无需 RenderScript

1/8 降采样 → 3 次快速均值模糊 → 放大回目标尺寸,兼容所有 API 级别,无需第三方依赖。

技术选型思考

为什么用 Java 而非 Kotlin?Java 生态成熟、兼容性处理更直观。为啥不用第三方框架?原生 View 系统完全足够,引入框架增加 APK 体积。所有动画使用系统属性动画(ObjectAnimator / ValueAnimator),性能与可控性兼得。