网上androi播放器虽然挺多,感觉提供的歌词显示功能比较死板,要么搜索给的条件死死的,要么放置sdcard内部的歌词格式需要统一,应该提供类似文件夹浏览的功能。^_^,不过在这之前先搞定歌词的现实界面:
转载请注明http://ishelf.iteye.com/admin/blogs/740402
播放器的歌词界面实现以下几个功能
- 根据歌曲的播放进度自下而上滚动;
- 提供上下拖动调整歌曲进度的功能;
- 突出显示当前进度的歌词段,并保证该歌词段处于布局中心
不多说了直接贴代码,首先开启一个线程每隔一段时间往view中送入一串字符
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class TextAlign extends GraphicsActivity implements OnClickListener {
private SampleView mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Animation in = AnimationUtils.loadAnimation(this, R.anim.push_up_in);
// mView.setAnimation(in);
setContentView(R.layout.main);
mView =(SampleView) findViewById(R.id.text01);
Button bt = (Button) findViewById(R.id.Button01);
bt.setOnClickListener(this);
new Thread(new UIUpdateThread()).start();
}
class UIUpdateThread implements Runnable {
long time = 40000;
long sleeptime = 100;
public void run() {
try {
while (time < 200000) {
Thread.sleep(sleeptime);
mView.updateIndex(time);//.index = mLyric.getNowSentenceIndex(time);
// Log.v("UIThread", mView.index + ":" + time);
time += sleeptime;
mHandler.post(mUpdateResults);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Handler mHandler = new Handler();
Runnable mUpdateResults = new Runnable() {
public void run() {
mView.invalidate(); // 更新视图
}
};
@Override
public void onClick(View v) {
mView.mTouchHistoryY -=30;
mHandler.post(mUpdateResults);
}
}
这里将时间送到SampleView中,该类对此时间进行加工得到一系列list(该list是动态生成的),从而根据时间的推移递增的得到一系列的字串。这个过程模拟了歌词的显示过程
接下来的SampleView继承了TextView并重载了onDraw方法.注意,这里只给了个sample,里面歌词怎么生成的见YOYOPlayer。这里就不给代码了
import java.io.File;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.TextView;
import android.widget.Toast;
import com.android.lyric.Lyric;
import com.android.lyric.PlayListItem;
import com.android.lyric.Sentence;
public class SampleView extends TextView {
private Paint mPaint;
private float mX;
private static Lyric mLyric;
private Path mPath;
private Paint mPathPaint;
public String test = "test";
public int index = 0;
private List<Sentence> list;
private float mTouchStartY;
private float mTouchCurrY;
public float mTouchHistoryY;
private int mY;
private long currentTime;
private long currentDunringTime;
private long sentenctTime;
private float middleY;
private String middleContent="Empty";
private static final int DY = 30;
private static void makePath(Path p) {
p.moveTo(10, 0);
p.cubicTo(100, -50, 200, 50, 300, 0);
}
public SampleView(Context context) {
super(context);
init();
}
public SampleView(Context context,AttributeSet attr) {
super(context,attr);
init();
}
public SampleView(Context context,AttributeSet attr,int i) {
super(context,attr,i);
init();
}
private void init() {
setFocusable(true);
PlayListItem pli = new PlayListItem("", "", 1000L, true);
mLyric = new Lyric(new File("/sdcard/M0005044007.lrc"), pli);
list = mLyric.list;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setTextSize(20);
mPaint.setTypeface(Typeface.SERIF);
mPath = new Path();
makePath(mPath);
mPathPaint = new Paint();
mPathPaint.setAntiAlias(true);
mPathPaint.setColor(0x800000FF);
mPathPaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint p = mPaint;
float x = mX;
float plus =currentDunringTime==0?index*30: index*30 +(((float)currentTime - (float)sentenctTime)/(float)currentDunringTime)*(float)30;
float y = mY- plus+mTouchCurrY - mTouchStartY+mTouchHistoryY;
canvas.translate(0,y);
for (int i = 0; i < index; i++) {
String text = list.get(i).getContent();
if((y+i*30)<=middleY&&(y+i*30+30)>=middleY)
middleContent = text;
p.setTextAlign(Paint.Align.CENTER);
canvas.drawText(text, x, 0, p);
// mY- mY/lines*(index - i)
canvas.translate(0, DY);
}
}
@Override
protected void onSizeChanged(int w, int h, int ow, int oh) {
super.onSizeChanged(w, h, ow, oh);
mX = w * 0.5f; // remember the center of the screen
mY = h;
middleY = h*0.5f;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchHistoryY += mTouchCurrY - mTouchStartY;
mTouchStartY =mTouchCurrY= y;
invalidate();
break;
case MotionEvent.ACTION_MOVE:
mTouchCurrY = y;
invalidate();
break;
case MotionEvent.ACTION_UP:
Log.v("Lyric content", middleContent.length()+"");
CharSequence chars = new CharSequence(){
@Override
public char charAt(int index) {
// TODO Auto-generated method stub
return middleContent.charAt(index);
}
@Override
public int length() {
// TODO Auto-generated method stub
return middleContent.length();
}
@Override
public CharSequence subSequence(int start, int end) {
// TODO Auto-generated method stub
return middleContent.subSequence(start, end);
}
@Override
public String toString(){
return middleContent;
}
};
Toast toast = Toast.makeText(SampleView.this.getContext(),chars, 1000);
toast.show();
invalidate();
break;
}
return true;
}
public void updateIndex(long time) {
this.currentTime = time;
index = mLyric.getNowSentenceIndex(time);
Sentence sen = list.get(index);
currentDunringTime = sen.getDuring();
sentenctTime = sen.getFromTime();
}
}
分享到:
相关推荐
Leaflet.Canvas-Markers-0.2.0 https://github.com/corg/Leaflet.Canvas-Markers
html2canvas-1.0.0-rc.4版本
这会将JavaScript文件相对于当前目录安装在./node_modules/blueimp-canvas-to-blob/js/ ,您可以从中将它们复制到Web服务器提供的文件夹中。 接下来,在HTML标记中包含缩小JavaScript Canvas to Blob脚本: < ...
资源分类:Python库 所属语言:Python 资源全名:orange-canvas-core-0.1.0b2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
海报合成 canvas vue组件 二维码合成 页面走命令可以直接运行 合成海报 商城的海报也ok ......
资源分类:Python库 所属语言:Python 资源全名:Oasys-Canvas-Core-1.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
npm: npm i react-canvas-dom 纱线: yarn add react-canvas-dom 导入组件并使用它: Import Canvas from 'react-canvas-dom' const draw = ( ctx , i ) => { ctx . clearRect ( 0 , 0 , ctx . canvas . width ...
npm i --save-dev jest-canvas-mock设置在jest下的package.json ,创建一个setupFiles数组,然后将jest-canvas-mock添加到该数组中。 { " jest " : { " setupFiles " : [ " jest-canvas-mock " ] }} 如果已经具有...
见http://blog.csdn.net/carllucasyu/article/details/79022775
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:streamlit_drawable_canvas-0.5.1-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
canvas-keyframes.min.js添加序列帧动画,动态添加,无论是横版序列图还是竖版序列图
canvas-nest.js一个基于html5 canvas绘制的网页背景效果
python库。资源全名:UW_RestClients_Canvas-1.2.4-py3-none-any.whl
资源分类:Python库 所属语言:Python 资源全名:orange-canvas-core-ml-0.1.5.dev0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
canvas绘制基础图形(canvas 气泡框 网格线 三角形 圆角矩形 箭头)1.初始化画布 initCanvas * 2.绘制网格线 drawGridlines * 3.绘制圆点 drawDot * 4.绘制圆环 drawRing
HCL Canvas Mandelbrot Explorer 我在为 HTML5 画布编写了一个 mandelbrot 集资源管理器设置使用资源管理器git clone git@github.com:olleicua/hcl-canvas-mandelbrot.git 在网络浏览器中打开 hcl-canvas-mandelbrot...
使用新版canvas-2d接口在微信小程序中生成二维码(外部二维码)的js包
前端项目-javascript-canvas-to-blob,javascript canvas to blob是一个将画布元素转换为blob对象的函数。