前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现歌词滚动效果

Android实现歌词滚动效果

作者头像
砸漏
发布2020-11-04 15:53:46
2.3K0
发布2020-11-04 15:53:46
举报
文章被收录于专栏:恩蓝脚本

本文实例为大家分享了Android实现歌词滚动效果的具体代码,供大家参考,具体内容如下

自定义TextView

代码语言:javascript
复制
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(); // 
}
};
}

数据封装类

代码语言:javascript
复制
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;
}
}

布局

代码语言:javascript
复制
<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代码

代码语言:javascript
复制
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(); 

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档