android播放器实现歌词显示功能

 更新时间:2018年11月12日 14:40:19   作者:ishelf  
这篇文章主要为大家详细介绍了android播放器实现歌词显示功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

网上android播放器虽然挺多,感觉提供的歌词显示功能比较死板,要么搜索给的条件死死的,要么放置sdcard内部的歌词格式需要统一,应该提供类似文件夹浏览的功能。^_^,不过在这之前先搞定歌词的现实界面:

播放器的歌词界面实现以下几个功能

  • 根据歌曲的播放进度自下而上滚动;
  • 提供上下拖动调整歌曲进度的功能;
  • 突出显示当前进度的歌词段,并保证该歌词段处于布局中心

不多说了直接贴代码,首先开启一个线程每隔一段时间往view中送入一串字符

Java代码

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。这里就不给代码了

Java代码

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(); 
    } 
  } 

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

相关文章

  • Android中fragment+viewpager实现布局

    Android中fragment+viewpager实现布局

    这篇文章主要为大家详细介绍了Android中fragment+viewpager实现布局效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android 中两个Activity 之间的传值问题

    Android 中两个Activity 之间的传值问题

    这篇文章主要介绍了Android 中两个Activity 之间的传值问题的相关资料,需要的朋友可以参考下
    2017-08-08
  • Android自定义View九宫格手势密码解锁

    Android自定义View九宫格手势密码解锁

    这篇文章主要为大家详细介绍了Android自定义View九宫格手势密码解锁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android Navigation重建Fragment问题分析及解决

    Android Navigation重建Fragment问题分析及解决

    这篇文章主要介绍了Android Navigation重建Fragment问题分析及解决,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • RecyclerView实现仿支付宝应用管理

    RecyclerView实现仿支付宝应用管理

    这篇文章主要为大家详细介绍了RecyclerView实现仿支付宝应用管理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Android Studio如何查看源码并调试的方法步骤

    Android Studio如何查看源码并调试的方法步骤

    这篇文章主要介绍了Android Studio如何查看源码并调试的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Android开发之获取单选与复选框的值操作示例

    Android开发之获取单选与复选框的值操作示例

    这篇文章主要介绍了Android开发之获取单选与复选框的值操作,结合实例形式分析了Android针对单选按钮、复选框的事件响应、数值获取等相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • Android仿京东搜索框渐变效果

    Android仿京东搜索框渐变效果

    这篇文章主要为大家详细介绍了Android仿京东搜索框渐变效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • RxJava+Retrofit+OkHttp实现多文件下载之断点续传

    RxJava+Retrofit+OkHttp实现多文件下载之断点续传

    本篇文章主要介绍了RxJava+Retrofit+OkHttp实现多文件下载之断点续传,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Android 实现左滑出现删除选项

    Android 实现左滑出现删除选项

    滑动删除的部分主要包含两个部分, 一个是内容区域(用于放置正常显示的view),另一个是操作区域(用于放置删除按钮)。下面通过本文给大家介绍Android 实现左滑出现删除选项,需要的朋友可以参考下
    2017-06-06

最新评论