文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android歌词显示控件TextView自定义

2022-06-06 13:29

关注

======================================================================================
 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯