使用 Android Studio 开发一款弹钢琴app

A. 项目描述

本项目主要实现了【钢琴键盘的模拟】、【弹奏引导】以及【乐曲库】等功能。
piano

钢琴键盘模拟:提供全尺寸键盘,并且根据用户的喜好来调整键盘的颜色样式。
弹奏引导:用户可以根据键盘上的提示符号 👆 来学习演奏。对于钢琴萌新/小白来说这个功能太方便了,可以像老手一样轻松弹奏各种曲目。
乐曲库:内置了曲谱,包括经典音乐、流行歌曲。用户可以跟随引导演奏这些曲目。
总之,这个app可以使得学习钢琴变得有趣和便捷,无论是钢琴初学者还是已经有一定经验的音乐爱好者,都可以从中受益。

B. 开发工具

  • Android Studio Dolphin | 2021.3.1 Patch 1
  • Java , JDK 11.0.13
  • Gradle , gradle-7.4

C. 功能设计

钢琴键盘模拟

PianoCanvasView类实现了钢琴键盘的绘制,它继承SurfaceView,可以在子线程中更新UI;

  • draw_all_keys方法,绘制了钢琴的所有键;
    void draw_all_keys(final Canvas canvas) {
        // 重置 canvas
        {
            Paint p = new Paint();
            p.setColor(Color.BLACK);
            canvas.drawPaint(p);
        }

        if (KEY_COLORS == null || null == PRESSED_KEY_COLORS || KEY_COLORS.length <1 || PRESSED_KEY_COLORS.length <1) {
            setKeyboardStyleColorful();
        }

        for (int i = 0; i < piano.get_keys_count(); i += 2) {
            // 绘制大琴键
            final int col_idx = (i / 2) % KEY_COLORS.length;
            Paint big_key_paint = new Paint();
            big_key_paint.setColor(piano.is_key_pressed(i) ? PRESSED_KEY_COLORS[col_idx] : KEY_COLORS[col_idx]);
            Piano.Key key = piano.get_area_for_key(i);
            if (key != null) {
                draw_key(canvas, key, big_key_paint);

                piano.onDrawPianoKey(this, canvas, i, key);
            }
        }

        // 在大键之后绘制小键
        for (int i = 1; i < piano.get_keys_count(); i += 2) {
            // 绘制小琴键
            Paint flat_key_paint = new Paint();
            flat_key_paint.setColor(piano.is_key_pressed(i) ? Color.GRAY : 0xFF333333);
            Piano.Key key = piano.get_area_for_flat_key(i);
            if (key != null) {
                draw_key(canvas, key, flat_key_paint);
            }
        }

        appConfigHandler.onPianoRedrawFinish(this, canvas);
        piano.onPianoRedrawFinish(this, canvas);
    }
  • onTouchEvent 方法捕捉屏幕上手指按下、抬起等动作;

钢琴键盘

弹奏引导

app通过在钢琴键上绘制手指符号(👆)来引导用户弹奏曲目,用户每按下一个键就发出一个对应的琴音。跟随着手指符号(👆)的变化,用户就可以弹奏出一个完整的曲调了。

  1. PianoConst类中,note2keyIdx常量就保存了音符与琴键位置的映射关系;
  2. Piano类中,updateMelodyFromAssets方法将乐曲资源转换成音符集合;
  3. 通过 Piano类的draw_emoji_on_piano_key方法将引导手指符号(👆)绘制在对应的琴键上。
    private void draw_emoji_on_piano_key(PianoCanvasView piano, Canvas canvas, int key_idx) {
        if (piano == null || canvas == null || key_idx < 0) {
            return;
        }
        // black: 1, 3, 7, 9, 11, 15 —— 奇数
        // white: 偶数

        // 👆 ✋
        String emoji = "\uD83D\uDC46";
        if (key_idx % 2 == 1) {
            piano.draw_emoji_on_black_key(canvas, emoji, key_idx);
        } else {
            piano.draw_emoji_on_white_key(canvas, emoji, key_idx);
        }
    }

乐曲库

乐曲库是内置的,在assets/jsongs目录下,json格式文件保存;
乐曲选择界面是 SongsActivity,使用RecyclerView 展现乐曲列表,供用户选择;

乐曲选择

D. 项目演示

用 Android Studio 开发了一款弹钢琴app | 牛弹琴

下载安装包试玩

E. 项目源码

project-cap

关注公众号『数字森林』,后台发送:弹钢琴,获取源码。
数字森林

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值