android 屏幕反馈 即时音效

Android AudioEffect 音效方案 Android2.3 增加了对音频混响的支持,通过 AudioEffect 可以方便地对 AudioTrack 和 MediaPlayer 播放的音乐进行音效控制。 Android 9.0 新增了用于 DynamicsProcessing 的 AudioEffect API,使用此类,我们可以构建基于通道的音频效果,包括各种类型的多个阶段,包括均衡,多频段压缩和限制。频段和活动阶段的数量是可配置的,并且大多数参数可以实时控制,例如增益、启动/释放时间、阈值等。...... 阅读详情

目前在做智能家居相关产品,移动端采用APICloud+android 原生模块开发。

下面我来说说为什么要做这个自定义的屏幕反馈、即时音效。首先原生的提示音被各大厂商封装又封装,导致开发者拿不到手机原生的屏幕反馈的提示声,更多的还是通知栏的声音,并且就算拿得到,适配也会更让人头疼的。还有在播放音频文件时。文件的格式还有学问:(我这里用的是wav格式,我也忘记在哪看到一篇博客,说是最好用wav的,解决了适配问题,目前我还没测试。。。)

音频格式比较:
音乐爱好者常见的音频格式有:flac、ape、wav、mp3、aac、ogg、wma
1.压缩比比较:
aac>ogg>mp3(wma)>ape>flac>wav(同一音源条件下)
mp3和wma以192kbps为分界线,192kbps以上mp3好,192kbps以下wma好。

2.音质比较:
wav=flac=ape>aac>ogg>mp3>wma

3.硬件支持比较:
MP3播放器:mp3>wma>wav>flac>ape aac ogg
手机:mp3>wma>aac wav>flac ogg>ape

4.综合性能(就是综合音质体积编码率):aac>ogg>flac ape>mp3>wav、wma


思路是:由于我是在自定义view中添加该功能。所以我在onTouchEvent的move里面实现了接口事件,接口回调监听中播放提示音,这样就能做到手指滑动就触发回调,触发屏幕反馈的提示音。

下面直接粘代码:

package com.face.zophar.modulenext.utils;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

import com.face.zophar.modulenext.R;

/**
 * 自定义播放 屏幕监听
 */

public class SoundPlayUtils {
    // SoundPool对象
    public SoundPool mSoundPlayer = new SoundPool(1,
            AudioManager.STREAM_SYSTEM, 1);
    public SoundPlayUtils soundPlayUtils;
    // 上下文
    public Context mContext;
    public int mCSoundId;

    /**
     * 初始化
     *
     * @param context
     */
    public SoundPlayUtils init(Context context) {
        if (soundPlayUtils == null) {
            soundPlayUtils = new SoundPlayUtils();
        }

        // 初始化声音
        mContext = context;
        mCSoundId = mSoundPlayer.load(mContext, R.raw.note7_b, 1);
        return soundPlayUtils;
    }

    /**
     * 播放声音
     *
     * @param
     */
    public void play() {
        mSoundPlayer.play(mCSoundId, 1, 1, 0, 0, 1);
    }
}

拓展:市面上有很多吉他、钢琴的软件 其实用SoundPool完全可以实现。

思路:可以定义6个view来代替吉他的六条琴弦,再定义一个bitmap(key:viewId,value:音频文件、开始时间、结束时间等(可以写成modle))。for循环添加到List中,结束时,就可以直接遍历这个List达到录制、播放的效果。


下面直接粘代码:

public class MainActivity extends Activity {

    // Helpful Constants
    private final int NR_OF_SIMULTANEOUS_SOUNDS = 7;
    private final float LEFT_VOLUME = 1.0f;
    private final float RIGHT_VOLUME = 1.0f;
    private final int NO_LOOP = 0;
    private final int PRIORITY = 0;
    private final float NORMAL_PLAY_RATE = 1.0f;
    private final static String TAG = "xylo";
    List<KeyTone> keyTones = new ArrayList<>();
    boolean recordingFlag = false;

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // TODO: Create a new SoundPool
        final SoundPool mSoundPool = (new SoundPool.Builder()).build();
        Log.d("Xylo", "" + mSoundPool);

        // TODO: Load and get the IDs to identify the sounds
        int mCSoundId = mSoundPool.load(getApplicationContext(), R.raw.note1_c, 1);
        int mDSoundId = mSoundPool.load(getApplicationContext(), R.raw.note2_d, 1);
        int mESoundId = mSoundPool.load(getApplicationContext(), R.raw.note3_e, 1);
        int mFSoundId = mSoundPool.load(getApplicationContext(), R.raw.note4_f, 1);
        int mGSoundId = mSoundPool.load(getApplicationContext(), R.raw.note5_g, 1);
        int mASoundId = mSoundPool.load(getApplicationContext(), R.raw.note6_a, 1);
        int mBSoundId = mSoundPool.load(getApplicationContext(), R.raw.note7_b, 1);

        final SparseIntArray keyNoteMap = new SparseIntArray();
        keyNoteMap.put(R.id.c_key, mCSoundId);
        keyNoteMap.put(R.id.d_key, mDSoundId);
        keyNoteMap.put(R.id.e_key, mESoundId);
        keyNoteMap.put(R.id.f_key, mFSoundId);
        keyNoteMap.put(R.id.g_key, mGSoundId);
        keyNoteMap.put(R.id.a_key, mASoundId);
        keyNoteMap.put(R.id.b_key, mBSoundId);

        for (int i = 0; i < keyNoteMap.size(); i++) {
            int buttonId = keyNoteMap.keyAt(i);
            int soundId = keyNoteMap.get(buttonId);
            findViewById(buttonId).setOnClickListener(view -> {
                if (recordingFlag) {
                    Log.d("Xylophone", "Recording Flag on");
                    Log.d("Xylophone", "Adding Id " + view.getId());
//                    buttonsClicked.add(view.getId());

                    long currentTime = new Date().getTime();
                    keyTones.add(new KeyTone(buttonId, currentTime, -100000L));

                    int keyTonesSize = keyTones.size();
                    if (keyTonesSize >= 2) {
                        keyTones.get(keyTonesSize - 2).setEndTime(currentTime);
                    }
                }
                mSoundPool.play(soundId, LEFT_VOLUME, RIGHT_VOLUME, PRIORITY, NO_LOOP, NORMAL_PLAY_RATE);
            });
        }

        Button playButton = (Button) findViewById(R.id.button_play);
        Button recordStopButton = (Button) findViewById(R.id.button_record_stop);

        playButton.setOnClickListener(View -> {
            Log.d(TAG, "Playbutton clicked ");
            for (int i = 0; i < keyTones.size(); i++) {
                KeyTone currentTone = keyTones.get(i);
                Button button = (Button) findViewById(currentTone.getButtonId());
                button.performClick();

                long endTime = currentTone.getEndTime();
                long startTime = currentTone.getStartTime();
                if (endTime > 0) {
                    try {
                        Thread.sleep(endTime - startTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        recordStopButton.setOnClickListener((View) -> {
            Log.d(TAG, "record stop clicked ");
            if (recordingFlag) {
                recordStopButton.setText(R.string.record);
                recordStopButton.setBackgroundColor(getResources().getColor(R.color.green));
                recordingFlag = false;
//                Log.d(TAG, "Buttons clicked: " + buttonsClicked);
                Log.d(TAG, "Keytones: " + keyTones);
            } else {
                recordStopButton.setText(R.string.stop);
                recordStopButton.setBackgroundColor(getResources().getColor(R.color.red));
                recordingFlag = true;
//                buttonsClicked = new ArrayList<>();
                keyTones = new ArrayList<>();
            }
        });

    }

}


Android按钮点击音效实现:从系统音效到自定义SoundPool的完整指南 在移动应用开发中,交互反馈是提升用户体验的关键技术之一。其核心原理是通过即时、明确的反馈信号,建立用户操作与系统响应之间的闭环。从技术实现角度看,Android系统提供了SoundPool和MediaPlayer两种音频播放机制,其中SoundPool因其低延迟、高并发的特性,成为处理UI音效的首选方案。这种技术方案的价值在于,它不仅增强了应用的操作确定感和品质感,还能服务于无障碍访问场景,为视障用户提供听觉辅助。在实际的Android开发中,为Button添加点击音效是这一技术的典型应用场景。开发者可以通 阅读详情

相关推荐

Android游戏开发必备:SoundPool音效池实战指南(附避坑技巧)

本文深入解析Android游戏开发中SoundPool音效池的核心优势与实战应用。针对游戏音效低延迟、多并发播放的需求,详细介绍了SoundPool的现代初始化方法、异步资源加载、高级播放控制及性能优化策略,并重点分享了避免内存限制和API调用崩溃等关键避坑技巧,帮助开发者构建高效稳定的游戏音效系统。

weixin_29204205的博客 571

浅谈Android O Touch声音播放流程

浅谈Android O Touch声音播放流程

l328873524的博客 1121

Unity3D音效系统全解析:从AudioSource到AudioManager的实战指南

在游戏开发中,音频系统是构建沉浸式体验的核心技术之一,它通过声音反馈连接玩家操作与虚拟世界。其原理基于数字信号处理与空间音频计算,通过AudioSource组件作为声音发射器,Audio Listener作为接收端,实现3D音效的空间定位与衰减。这一技术的价值在于显著提升游戏的交互质感与情感表达,是优化玩家体验的关键环节。在Unity3D开发中,音效系统广泛应用于角色动作反馈、环境氛围营造、UI交互提示等场景。本文聚焦于Unity音频模块的实战应用,深入探讨了AudioClip资源管理、对象池优化等热词技术

357

Android 9系统源码_音频管理(一)按键音效源码解析

通过Android9.0系统源码分析和控件点击音效相关的系统源码。

AfinalStone的专栏 2339

Android交互式宠物应用开发:触摸事件、帧动画与状态机实践

在移动应用开发中,触摸事件处理与动画系统是构建交互体验的核心技术。触摸事件通过MotionEvent传递用户操作,开发者需要将其映射为具体的界面反馈。动画系统则负责视觉呈现,帧动画适合表现角色连续动作,属性动画适用于视图变换。这些技术的工程价值在于能够创建即时、生动的用户交互,广泛应用于游戏、虚拟宠物、教育娱乐等场景。本文以Android平台为例,结合触摸事件分发和帧动画控制,详细解析如何构建一个类似“汤姆猫”的交互式应用,涵盖从事件映射到资源调度的完整实现流程。

weixin_34253126的博客 371

基于Qt/QML的Win11风格屏幕键盘开发与集成实战

在跨平台应用开发中,虚拟键盘是实现触摸屏交互的核心组件之一。其原理是通过软件模拟物理键盘的按键事件,将用户触摸操作转化为字符输入。这项技术对于提升触摸设备的用户体验至关重要,尤其在嵌入式系统、信息终端和特定行业应用中具有广泛价值。本文聚焦于一个基于Qt/QML技术栈实现的开源项目,它精准复刻了Windows 11的视觉风格与交互逻辑。该项目不仅是一个功能完备的虚拟键盘,更是一个优秀的QML组件化开发范例,涵盖了属性绑定、信号槽通信和状态机管理等关键技术点。开发者可以将其作为现成的解决方案,快速集成到自己的Q

weixin_34034670的博客 490

Android13音频子系统分析(三)---音效算法集成框架

Android的音效架构中,将所有的音效算法全部挂载到AudioHAL进程中运行。根据音效算法应用的位置,可以分为三类:Track音效、Stream音效、Device音效。即:针对某一个Track的处理音效、针对某种StreamType的处理音效、针对某个Device的处理音效。在中我们已经看到,Track只是在APP层和AudioServer框架层中的概念,到了AudioHAL层已经没有Track的概念,只有Stream和Device。

余静江的博客 1万+

Android Audio其他——按键音播放流程(一)

在我们日常使用Android设备的过程中,每一次按键操作——无论是点亮屏幕、调节音量,还是输入文字——往往都伴随着清脆或柔和的“滴答”声。这些看似微不足道的提示音,不仅提供了即时的操作反馈,增强了交互的确定性,也潜移默化地塑造着用户对系统响应速度和品质的感知。它们就是 Android 系统中无处不在的按键音(Key Tones)。

小旭的专栏 1023

Android音视频全面介绍与代码实践之音效(四)

Android在应用层提供丰富的多媒体接口,本文主要介绍音效处理:均衡器风格、预设混响、重低音调节、音量增强、可视化动态频谱,这些音效都使用audioSessionId进行绑定。让用户可选择/设置自己喜欢的风格,身临其境地感受不同歌曲的跳动旋律。方便开发者进行二次开发,打造出酷炫的音乐播放器。

徐福记456 2万+

告别CANoe?手把手教你用Python+PCAN搭建汽车诊断脚本(附完整代码)

本文详细介绍了如何利用Python和PCAN硬件搭建高性价比的汽车诊断自动化方案,替代昂贵的CANoe工具。通过开源库python-can和udsoncan实现UDS诊断协议,涵盖硬件选择、环境配置、核心功能实现及性能优化,附完整代码示例,助力开发者快速构建诊断脚本。

weixin_42551227的博客 373

CoppeliaSim(原V-REP)新手上路

CoppeliaSim(原V-REP)是一个机器人仿真平台,里面有很多来自别的公司的机器人模型以及完备的物理引擎,我们可以通过python,c++,matlab等语言控制里面的机器人。,您也可以在官网中Downloads里找您需要的版本,一般只需要下载EDU版本就可以了,我下载的是v4.1.0 windows EDU版本。在版本V4之前,CoppeliaSim叫V-REP,在官网可以下载到之前的V-REP版本。

qq_37051669的博客 4万+

Android16音频之加载音效loadSoundEffects:用法实例(一百零三)

本篇目的:Android16进阶之加载音效loadSoundEffects:用法实例基本概念loadSoundEffects通过AudioManager预加载系统级触摸、键盘、解锁等短音效至内存,减少首次播放延迟,适用于需即时反馈的UI交互。功能异步加载系统默认音效池;与playSoundEffect配套使用;支持全局复用;无需权限;与主题包联动,可替换资源。使用限制需Context获取AudioManager;仅加载系统预置音;首次调用延迟约100-300 ms;

Android系统攻城狮 1525

unity打包流程整理-Windows/Mac/Linux平台

1.Platform(平台)功能: 选择目标构建的目标平台选项PC, Mac & Linux Standalone: 适用于 Windows、Mac 和 Linux 平台2.Target Platform(目标平台)功能: 选择具体的操作系统版本选项Windows: 针对 Windows 操作系统Mac: 针对 macOS 操作系统Linux: 针对 Linux 操作系统3.Architecture(架构)功能: 选择应用程序的目标处理器架构选项x86: 针对 32 位系统。

weixin_42333247的博客 5136

终极跨平台即时通讯体验:HuLa如何用Rust+Vue3重构你的沟通方式

想象一下,当你需要在Windows上处理工作文件,在Mac上查看设计稿,在手机上回复紧急消息,而所有设备间的聊天记录、文件传输、在线状态都能实时同步——这正是HuLa带给你的无缝跨平台即时通讯体验。作为一款基于Rust+Vue3构建的极致性能即时通讯应用,HuLa不仅兼容Windows、macOS、Linux、Android、iOS五大平台,更将桌面级应用的性能与移动端的便捷完美融合,让你在任何设

gitblog_00058的博客 429

C#精准获取Windows已安装应用清单的完整方案

Windows已安装应用识别是IT资产管理、安全合规与自动化运维的基础能力。其核心原理在于突破文件系统表象,以注册表为可信数据源,分层解析HKLM/HKCU、64位/32位视图及MSI Products路径中的元数据。技术价值体现在可验证(如过滤SystemComponent=1)、可关联(通过ProductCode绑定补丁与许可证)、可操作(启动路径二次验证+卸载命令沙箱执行)。典型应用场景包括终端合规审计、软件资产清查、静默卸载脚本开发及多版本应用聚合分析。本文聚焦C#原生实现,覆盖注册表四路采集、La

weixin_33552698的博客 634

YOLO26模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了YOLO26模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 241

Cocos Creator集成RichTap SDK实现高品质游戏振动反馈

在移动游戏开发中,触觉反馈是提升用户体验的关键技术之一。其原理是通过控制设备振动马达的振幅与波形变化,模拟出丰富细腻的物理触感,从而增强游戏的沉浸感和操作反馈精确性。这项技术的核心价值在于将简单的开关式振动升级为可设计的触觉体验,尤其适用于动作、射击、竞速等对即时反馈要求高的游戏类型。通过集成如RichTap这样的专业SDK,开发者可以调用预定义的振动效果文件(.he文件),实现跨平台的高品质振动反馈。本文以Cocos Creator引擎为例,详细解析了从环境配置、SDK集成、效果资源管理到代码调用的完整实

weixin_34111790的博客 472

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

阿飞2018 1385

【亲测免费】 Mumble-Android: 打造高效沟通的开源语音聊天应用

Mumble-Android: 打造高效沟通的开源语音聊天应用 项目基础介绍 Mumble-Android是由开发者Benjamin Jemlich维护的一个开源项目,其源代码托管在GitHub上(pcgod/mumble-android)。这个项目专为Android平台打造,采用了Java为主要编程语言,并辅以少量C代码,确保了应用程序的高效性和广泛的设备兼容性。自2010年以来,它已经历了多个...

gitblog_00988的博客 594

【深度学习|学习笔记】广义线性模型Generalized linear model(GLM)模型详解,附代码。

【深度学习|学习笔记】广义线性模型Generalized linear model(GLM)模型详解,附代码。

2401_89898861的博客 1875

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。

数据与算法架构提升之路专栏 1985

游戏手感优化:从传奇皮肤到交互反馈的技术实现

在交互设计与游戏开发中,用户体验的核心指标之一是操作手感,它直接影响了用户的沉浸感与满意度。手感并非主观感受,而是由一系列可量化的技术指标构成,包括输入响应延迟、动画融合过渡、视听同步和多重感官反馈等。其技术原理在于通过优化底层代码逻辑与资源调度,减少操作与反馈之间的感知延迟,并增强交互确认感。这种优化具有显著的工程价值,能够提升用户留存、操作效率与产品整体质感。应用场景广泛,从游戏中的技能释放、攻击反馈到应用软件的按钮点击、列表滚动,都需要精心的手感设计。本文以游戏传奇皮肤带来的手感提升为切入点,深入剖析

weixin_30911451的博客 317

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

AI编程实战:零基础用Claude Code开发安卓猜拳游戏踩坑指南

AI辅助编程正成为开发者提升效率的热门工具,其核心原理是基于大语言模型理解自然语言需求并生成代码。这项技术为编程新手和快速原型开发带来了显著价值,能大幅降低语法学习门槛,加速功能实现。在实际应用场景中,如移动应用开发,AI助手可协助完成代码生成、错误调试和最佳实践推荐。本文以开发一个安卓猜拳游戏为例,聚焦使用Claude Code进行开发时遇到的环境配置、核心逻辑实现与真机测试等典型挑战,特别是如何解决Gradle依赖配置和Logcat日志分析等具体问题,为探索AI编程边界提供一手实践参考。

weixin_33767813的博客 391

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Unity AR射击游戏开发实战:从图像识别到安卓打包全流程解析

增强现实(AR)技术通过将虚拟信息叠加到现实世界,正在重塑游戏与交互体验。其核心原理基于计算机视觉与传感器融合,实现虚拟物体的空间锚定。在游戏开发领域,Unity引擎凭借其成熟的3D图形管线与跨平台能力,结合AR Foundation框架,为开发者提供了高效构建AR应用的解决方案。这种技术组合特别适用于需要虚实结合、实时交互的场景,例如AR射击游戏。本文以Unity AR射击游戏为例,深入探讨了图像识别、触摸输入控制、射线检测射击等核心模块的实现,并分享了移动端性能优化与安卓打包配置的实战经验,为开发者提供

anchang7456的博客 642

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

GraphRAG 10 分钟跑通知识图谱 RAG:从一堆文本到可提问的图谱

GraphRAG 是微软开源的模块化图检索增强生成(RAG)系统:用 LLM 从非结构化文本里提取实体与关系,自动建出分层知识图谱和社区报告,再基于图谱回答问题。它替你省掉手写实体标注和建图脚本的功夫。按这篇 GraphRAG 知识图谱入门走完最小流程,10 分钟内你的终端就能对一堆文本提问并拿到带引用的回答。 ## 跑通最小流程 🚀 - 前置依赖:Python 3.10-3.12、一个 L

gitblog_00666的博客 871

用快马AI快速原型24点棋牌游戏,打造流畅安卓操作体验

这里的一个关键点是算式构建的逻辑:用户点击数字或运算符,并不是立即计算,而是将对应的字符追加到一个字符串中,并在中间的预览区域实时显示出来,模拟手写公式的过程。”,并同时停止计时器,记录本次用时。在快马平台上,我直接描述了需求:“创建一个安卓应用,主界面显示4个随机数字,提供加减乘除和括号按钮,实时组合算式并验证是否等于24,包含计时和排行榜功能。对于想快速验证一个移动应用点子,尤其是关注核心操作流程和用户体验的朋友,这种快速生成和预览的方式,能让你更专注于设计本身,而不是被编码环境绊住手脚。

GoldEagle19的博客 57
上一篇: android 读取配置文件
下一篇: android 获取系统 日期 周几 上午 下午
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值