我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android歌词显示控件TextView自定义

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android歌词显示控件TextView自定义

======================================================================================
 1. 音乐播放,音乐播放,音乐播放放入服务中,那么App 退入后台音乐也可以播放

 2. 歌词显示控件TextView自定义:
   使用控件TextView,  为什么不用Listview,歌词不可以手动滚动
 如何实现:
 2.1  根据当前播放进度找到对应歌词
 2.2. 绘制当前
 2.2. 往前计算坐标,绘制之前歌词
 2.3. 往后计算坐标,绘制之后歌词
     
 int currentPosition = musicPlayerService.getCurrentPosition();
=========歌词格式=============================================
 [00:01.79]心碎了无痕
[00:02.94]作词:MICHEAL 作曲:吴旭文
[00:04.16]演唱:张学友
[00:05.41]
[00:26.62]闭上你的眼 我的爱人
[00:32.22]吻住你吻住疑问
[00:37.71]你的心已变像落叶飞远
[00:43.65]我宁愿瞎了眼看不见
[00:47.75]
[00:48.95]求求你千千万万不要走
==================================================================
 每句歌词播放时间都有,获取当前 currentPosition 播放时间,然后去歌曲中 找 对应歌词

布局xml文件:



    

 Java代码:MyLyricView1 


package com.itheima.videoplay.words;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.TextView;
import java.util.ArrayList;

public class MyLyricView1 extends TextView {
    // 歌词类
    private ArrayList lyrics;
    private Paint paint;
    private Paint whitepaint;
    private int width;
    private int height;
//歌词列表中的索引,是第几句歌词
    private int index=6;
//  每行的高
    private float textHeight ;
// 当前歌词内容
    private String content;
// 时间戳
    private long timePoint;
// 休眠时间或者高亮显示的时间
    private long sleepTime;
    // 当前播放位置
    private float currentPositon;
    public ArrayList getLyrics() {
        return lyrics;
    }
    public void setLyrics(ArrayList lyrics) {
        this.lyrics = lyrics;
    }
    public MyLyricView1(Context context) {
        this(context,null);
    }
    public MyLyricView1(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }
    public MyLyricView1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w;
        height = h;
    }
    public void setshowNextLyric(int currentPosition) {
//        this.currentPositon= currentPosition;
//        if(lyrics == null ||  lyrics.size() == 0 ){
//            return;
//        }
//        for (int i = 1; i < lyrics.size(); i++) {
//
//            if(currentPosition = lyrics.get(tempIndex).getTimePoint()){
//                    //当前正在播放的哪句歌词
//                    index = tempIndex;
//                    sleepTime = lyrics.get(index).getSleepTime();
//                    timePoint = lyrics.get(index).getTimePoint();
//                }
//
//            }
//        }
        currentPosition++;
        this.index=currentPosition;
        //重新绘制
        invalidate();//在主线程中
        //子线程
//        postInvalidate();
    }
    private void initView(Context context) {
        textHeight = DensityUtil.dip2px(context,18);//对应的像数
        //创建画笔 画中间内容
        paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setTextSize(DensityUtil.dip2px(context,16));
        paint.setAntiAlias(true);
        //设置居中对齐,画出来的内容会在View中居中
        paint.setTextAlign(Paint.Align.CENTER);
        // 画上下内容
        whitepaint = new Paint();
        whitepaint.setColor(Color.WHITE);
        whitepaint.setTextSize(DensityUtil.dip2px(context,16));
        whitepaint.setAntiAlias(true);
        //设置居中对齐
        whitepaint.setTextAlign(Paint.Align.CENTER);
  // 测试代码,假的歌词
        lyrics = new ArrayList();
        Lyric lyric = new Lyric();
        for (int i = 0; i 0 ){
            //1. 绘制歌词:绘制当前句
            String currentText = lyrics.get(index).getContent();
            canvas.drawText(currentText, width / 2, height / 2, paint);
            // 2. 绘制前面部分
            float tempY = height / 2;//Y轴的中间坐标
            for (int i = index - 1; i >= 0; i--) {
                //每一句歌词
                String preContent = lyrics.get(i).getContent();
                tempY = tempY - textHeight;
                if (tempY < 0) {
                    break;
                }
                
                canvas.drawText(preContent, width / 2, tempY, whitepaint);
            }
            // 3. 绘制后面部分
            tempY = height / 2;//Y轴的中间坐标
            for (int i = index + 1; i  height) {
                    break;
                }
                canvas.drawText(nextContent, width / 2, tempY, whitepaint);
            }
        }else{
            //没有歌词
            canvas.drawText("没有歌词", width / 2, height / 2, paint);
        }
    }
}

  使用:


public class LyricActivity extends Activity {
    MyLyricView1 myLyricView1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lyric);
        myLyricView1 = findViewById(R.id.mylyriceview1);
    }
    int index=6;
    public void nextSentence(View veiw){
        myLyricView1.setshowNextLyric(index++);
    }
}

效果图:


作者:小置同学


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android歌词显示控件TextView自定义

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android歌词显示控件TextView自定义

======================================================================================1. 音乐播放,音乐播放,音乐播放放入服务中,那么App 退入后台音
2022-06-06

Android如何自定义View歌词控件

本篇内容介绍了“Android如何自定义View歌词控件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言一、 歌词解析1.歌词实体类L
2023-06-20

Android继承现有控件拓展实现自定义控件textView

通常情况下,Android实现自定义控件无非三种方式。Ⅰ、继承现有控件,对其控件的功能进行拓展。Ⅱ、将现有控件进行组合,实现功能更加强大控件。Ⅲ、重写View实现全新的控件本文重点讨论继承现有控件进行拓展实现自定义控件。这是一个非常重要的自
2022-06-06

【Android自定义控件】自适应文字大小的TextView

Android8.0以上可以在TextView中添加autoSizeTextType实现 Android8.0以下要想达到根据TextView大小自动调整文字大小(不适合使用多行文字),只能自定义了 public class PZHelp_
2022-06-06

Android自定义控件制作显示进度的Button

最近看到一些应用在下载文件的时候,并没有额外弹出进度条,而是很炫的使用启动下载任务的Button直接显示文件的下载进度,通过改变其背景色,从左向右推进,直到填满整个Button时,意味着下载任务的完成。除了这种效果,还看到某酷的视频客户端,
2022-06-06

Android 自定义控件实现显示文字的功能

Android 自定义控件实现显示文字的功能 自定义控件—–逐个显示文字 ONE Goal ,ONE Passion ! 前言: 今天要实现的效果时.让我们的文字一个一个显示出来.上效果图吧:实现原理: 1,拿到要显示的文字. 2,计算文字
2022-06-06

Android自定义控件之自定义组合控件(三)

前言:前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本。使用自定义组合控件的好处? 我
2022-06-06

android自定义倒计时控件示例

自定义TextView控件TimeTextView代码:代码如下:import android.content.Context;import android.content.res.TypedArray;import android.gra
2022-06-06

Android 自定义 Toast 显示时间

Android 自定义 Toast 显示时间实现代码:package com.wm.realname.util;import android.content.Context;import android.os.Handler;import
2023-05-31

android自定义控件和自定义回调函数步骤示例

自定义控件的步骤: 1 View的工作原理2 编写View类3 为View类增加属性4 绘制屏幕5 响应用户消息6 自定义回调函数 java代码代码如下:private class MyText extends LinearLayout {
2022-06-06

Android自定义控件之自定义属性(二)

前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性。本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解。有关原理知识请参考Android自定义控件基本原理详解(一)这篇文章。 需求产生
2022-06-06

winform怎么自定义控件隐藏显示闪屏

如果您想自定义WinForm控件的隐藏和显示动画效果,可以使用以下方法:使用Windows API函数实现动画效果:您可以使用Windows API函数来实现自定义的动画效果,比如使用AnimateWindow函数来实现控件的显示和隐藏动画
winform怎么自定义控件隐藏显示闪屏
2024-04-09

Android中自定义控件之液位指示器

由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,只是做一个控件,液位指示,其实就是继承自progressbar,然后
2022-06-06

android 自定义控件 使用declare

在Android中,可以使用`declare-styleable`来定义和使用自定义控件的属性。下面是一个简单的示例:1. 在res/values/attrs.xml文件中定义自定义属性:```xml
2023-09-21

android 自定义控件 自定义属性详细介绍

自定义控件在android中无处不见,自定义控件给了我们很大的方便。比如说,一个视图为imageview ,imagebutton ,textview 等诸多控件的组合,用的地方有很多,我们不可能每次都来写3个的组合,既浪费时间,效率又低。
2022-06-06

Android自定义SeekBar滑动显示数字

先来上个效果图:当滑动时:数值显示,滑动停止时显示数字,使用FrameLayout结合SeekBar。 首先我们看看。 Layout:
2022-06-06

Android自定义控件(实现状态提示图表)

前面分析那么多系统源码了,也该暂停下来休息一下,趁昨晚闲着看见一个有意思的需求就操练一下分析源码后的实例演练—-自定义控件。 这个实例很适合新手入门自定义控件。先看下效果图: 横屏模式如下: 竖屏模式如下: 看见没有,这个控件完全自定义的
2022-06-06

Android实现自定义轮播图片控件示例

要完成一个轮播图片,首先想到的应该是使用ViewPager来实现。ViewPager已经有了滑动的功能,我们只要让它自己滚动。再加上下方的小圆点就行了。所以我们本次的自定义控件就是由ViewPager和LinearLayout叠加起来组成的
2022-06-06

Android TextView显示Html类解析的网页和图片及自定义标签用法示例

本文实例讲述了Android TextView显示Html类解析的网页和图片及自定义标签。分享给大家供大家参考,具体如下: Android系统显示HTML网页的最佳控件为WebView,有时候为了满足特定需求,需要在TextView中显示H
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录