Android实现歌词滚动效果
作者:书弋江山 发布时间:2023-11-08 04:29:54
标签:Android,歌词滚动
本文实例为大家分享了Android实现歌词滚动效果的具体代码,供大家参考,具体内容如下
自定义TextView
public class VerticalScrollTextView extends TextView {
private Paint mPaint;
private float mX;
private Paint mPathPaint;
public int index = 0;
private List<Sentence> list;
public float mTouchHistoryY;
private int mY;
private float middleY;//
private static final int DY = 40; //
public VerticalScrollTextView(Context context) {
super(context);
init();
}
public VerticalScrollTextView(Context context, AttributeSet attr) {
super(context, attr);
init();
}
public VerticalScrollTextView(Context context, AttributeSet attr, int i) {
super(context, attr, i);
init();
}
private void init() {
setFocusable(true);
if(list==null){
list=new ArrayList<Sentence>();
Sentence sen=new Sentence(0," ");
list.add(0, sen);
}
//
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setTextSize(24);
mPaint.setColor(Color.BLACK);
mPaint.setAlpha(80);
mPaint.setTypeface(Typeface.SERIF);
//
mPathPaint = new Paint();
mPathPaint.setAntiAlias(true);
mPathPaint.setColor(Color.RED);
mPathPaint.setTextSize(24);
mPathPaint.setTypeface(Typeface.SANS_SERIF);
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(0xEFeffff);
Paint p = mPaint;
Paint p2 = mPathPaint;
p.setTextAlign(Paint.Align.LEFT);
if (index == -1)
return;
p2.setTextAlign(Paint.Align.LEFT);
//
canvas.drawText(list.get(index).getName(), mX, middleY, p2);
float tempY = middleY;
//
for (int i = index - 1; i >= 0; i--) {
tempY = tempY - DY;
if (tempY < 0) {
break;
}
canvas.drawText(list.get(i).getName(), mX, tempY, p);
}
tempY = middleY;
//
for (int i = index + 1; i < list.size(); i++) {
//
tempY = tempY + DY;
if (tempY > mY) {
break;
}
canvas.drawText(list.get(i).getName(), mX, tempY, p);
}
}
protected void onSizeChanged(int w, int h, int ow, int oh) {
super.onSizeChanged(w, h, ow, oh);
mX = w * 0.3f;
mY = h;
middleY = h * 0.5f;
}
public long updateIndex(int index) {
if (index == -1)
return -1;
this.index=index;
return index;
}
public List<Sentence> getList() {
return list;
}
public void setList(List<Sentence> list) {
this.list = list;
}
public void updateUI(){
new Thread(new updateThread()).start();
}
class updateThread implements Runnable {
long time = 300;
int i=0;
public void run() {
while (true) {
long sleeptime = updateIndex(i);
time += sleeptime;
mHandler.post(mUpdateResults);
if (sleeptime == -1)
return;
try {
Thread.sleep(time);
i++;
if(i==getList().size())
{
i=0;
time = 300;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Handler mHandler = new Handler();
Runnable mUpdateResults = new Runnable() {
public void run() {
invalidate(); //
}
};
}
数据封装类
public class Sentence {
private String name;
private int index;
public Sentence(int index,String name){
this.name=name;
this.index=index;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
布局
<com.mypackager.ui.VerticalScrollTextView
android:id="@+id/scoll_textView"
android:layout_width="500dp"
android:layout_height="500dp"
android:text="@string/company_intrduce_text"
android:visibility="gone"
></com.mypackager.VerticalScrollTextView>
Activity代码
List lst=new ArrayList<Sentence>();
for(int i=0;i<8;i++){
if(i%2==0){
Sentence sen=new Sentence(i,i+1+"NanJINGXIXI");
lst.add(i, sen);
}else{
Sentence sen=new Sentence(i,i+1+"Hello world!");
lst.add(i, sen);
}
}
play_textView.setList(lst);
play_textView.updateUI();
来源:https://blog.csdn.net/bobbob32/article/details/72833686


猜你喜欢
- SSM Mapper查询出返回数据查不到个别字段原因开启了驼峰命名法则,Bean里的字段不识别_注释掉或者把实体类里的字段_去掉换位大写SS
- 在分布式系统架构中,如果一个应用不能对来自依赖的故障进行隔离,那该应用本身就处在被拖垮的风险中。 因此,为了构建稳定、可靠的分布式系统,我们
- 一、编码(转成字节数组)GetBytes 1、ASII码:字符串中的每个字符用一个字节表示。每个字符实际上只使用了7位,从00h
- 网上android播放器虽然挺多,感觉提供的歌词显示功能比较死板,要么搜索给的条件死死的,要么放置sdcard内部的歌词格式需要统一,应该提
- 本文实例为大家分享了Java实现猜拳游戏的具体代码,供大家参考,具体内容如下一、问题简介通过控制台方式实现一个人机对战的猜拳游戏,用户通过输
- 本文参考文档Add Flutter to existing apps。首先有一个可以运行的原生项目第一步:新建Flutter moduleT
- 前篇回顾:Spring源码解析容器初始化构造方法在上一篇文章中,我们介绍完了AnnotationConfigApplicationConte
- 先看看效果Like This↓一、公共WiFi 公用电脑什么的在我们日常在线上工作、玩耍时,不论开电脑、登录淘宝、玩网游统统都会用到键盘输入
- 记录:276场景:利用Spring的机制发布ApplicationEvent和监听ApplicationEvent。版本:Spring Bo
- 最近项目上的一个上传文件功能,项目是MVC+EF+LigerUI 来做的,贴出来大家一起分享下1、页面需要引用这个JS 和 CSS<s
- Java 从Set里面取出有序的记录详解及实例Set里面的记录是无序的,如果想使用Set,然后又想里面的记录是有序的,就可以使用TreeSe
- 前言SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文
- 目录截屏AudioRecord音频采集MediaCodec编码音频数据Rtp发送数据SDP文件配置音频config配置计算方式:vlc测试播
- 前言最近在学习安卓开发的时候遇到了一个问题,使用Android Studio在为Button设置背景颜色的时候发现设置好后却在运行 * 上失
- 直接上代码,代码中使用四种方法遍历Hashtable。using System;using System.Collections;names
- (1)编写接口Animal (Animal.java)public interface Animal{ public abstr
- 这篇文章主要介绍了Java GZIP压缩与解压缩代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 本文实例讲述了C#获取机器码的方法。分享给大家供大家参考,具体如下:using System.Runtime.InteropServices
- 项目数据库中出现许多值为中括号[]的数据,测试报了bug,经过排查是因为使用了json-lib 的jar包导致。json-lib在将xml字
- 这篇文章主要介绍了Java判断主机是否能ping通代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要