From 27f180efca808046df3f3e917ee5f98d2d54849b Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Wed, 04 May 2022 13:57:34 +0000 Subject: [PATCH] 滑动歌词 计算时间 --- app/src/main/java/com/auto/lyric/data/LyricObject.java | 10 +++++ app/src/main/java/com/auto/lyric/data/LyricServer.java | 1 app/src/main/java/com/auto/lyric/service/FloatingWindowService.java | 31 +++++++++++++++ app/src/main/java/com/auto/lyric/widgets/LyricView.java | 41 ++++++++------------ 4 files changed, 58 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/auto/lyric/data/LyricObject.java b/app/src/main/java/com/auto/lyric/data/LyricObject.java index d8379d7..5149137 100644 --- a/app/src/main/java/com/auto/lyric/data/LyricObject.java +++ b/app/src/main/java/com/auto/lyric/data/LyricObject.java @@ -8,4 +8,14 @@ public int endtime; // 结束时间 public int timeline; // 单句歌词用时 public String lrc; // 单句歌词 + + @Override + public String toString() { + return "LyricObject{" + + "begintime=" + begintime + + ", endtime=" + endtime + + ", timeline=" + timeline + + ", lrc='" + lrc + '\'' + + '}'; + } } diff --git a/app/src/main/java/com/auto/lyric/data/LyricServer.java b/app/src/main/java/com/auto/lyric/data/LyricServer.java index 8b8ef7e..2741d2c 100644 --- a/app/src/main/java/com/auto/lyric/data/LyricServer.java +++ b/app/src/main/java/com/auto/lyric/data/LyricServer.java @@ -18,6 +18,7 @@ public class LyricServer { + // key 时间戳 , obj 歌词 private static TreeMap<Integer, LyricObject> lrc_map = new TreeMap<>(); public static TreeMap<Integer, LyricObject> getLrc_map() { diff --git a/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java b/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java index 426ee8c..ed45dd9 100644 --- a/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java +++ b/app/src/main/java/com/auto/lyric/service/FloatingWindowService.java @@ -22,6 +22,7 @@ import androidx.annotation.Nullable; import com.auto.lyric.R; +import com.auto.lyric.data.LyricObject; import com.auto.lyric.data.LyricServer; import com.auto.lyric.databinding.FloatViewBinding; import com.auto.lyric.util.DeviceUtil; @@ -195,6 +196,36 @@ Log.e(TAG,"onStartCommand flags:"+flags+" startId:"+startId+ " intent:"+intent); manager.addView(binding.getRoot(),params); binding.lyric.setTextSize(); + binding.lyric.setOnTouchListener(new View.OnTouchListener() { + float touchY; //当触摸歌词View时,保存为当前触点的Y轴坐标 + @Override + public boolean onTouch(View v, MotionEvent event) { + float tt=event.getY(); + switch(event.getAction()){ + case MotionEvent.ACTION_DOWN: + break; + case MotionEvent.ACTION_MOVE: + touchY=tt-touchY; + binding.lyric.setOffsetY(binding.lyric.getOffsetY()+touchY); + Log.e("LyricView","offsety:"+binding.lyric.getOffsetY()); + binding.lyric.invalidate(); + break; + case MotionEvent.ACTION_UP: + if(binding.btnStart.getText().equals("开启") || pause) { + int index = binding.lyric.getIndexFromOffsetY(binding.lyric.getOffsetY()); + binding.lyric.setIndex(index); + binding.lyric.setOffsetY(220 - index * (binding.lyric.getSIZEWORD() + 44)); + LyricObject object = LyricServer.getLrc_map().get(index); + Log.e("LyricView", "object:" + object); + progress = object.begintime; + binding.lyric.invalidate(); + } + break; + } + touchY=tt; + return true; + } + }); return super.onStartCommand(intent, flags, startId); } diff --git a/app/src/main/java/com/auto/lyric/widgets/LyricView.java b/app/src/main/java/com/auto/lyric/widgets/LyricView.java index 864d1f2..77d8a77 100644 --- a/app/src/main/java/com/auto/lyric/widgets/LyricView.java +++ b/app/src/main/java/com/auto/lyric/widgets/LyricView.java @@ -6,7 +6,6 @@ import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; -import android.view.MotionEvent; import com.auto.lyric.data.LyricObject; import com.auto.lyric.data.LyricServer; @@ -21,7 +20,6 @@ private float mX; //屏幕X轴的中点,此值固定,保持歌词在X中间显示 private float offsetY; //歌词在Y轴上的偏移量,此值会根据歌词的滚动变小 - private float touchY; //当触摸歌词View时,保存为当前触点的Y轴坐标 private int lrcIndex=0; //保存歌词TreeMap的下标 private int SIZEWORD=0;//显示歌词文字的大小值 private int INTERVAL=45;//歌词每行的间隔 @@ -70,29 +68,6 @@ canvas.drawText("找不到歌词", mX, 310, paint); } super.onDraw(canvas); - } - - /* (non-Javadoc) - * @see android.view.View#onTouchEvent(android.view.MotionEvent) - */ - @Override - public boolean onTouchEvent(MotionEvent event) { - // TODO Auto-generated method stub - float tt=event.getY(); - switch(event.getAction()){ - case MotionEvent.ACTION_DOWN: - break; - case MotionEvent.ACTION_MOVE: - touchY=tt-touchY; - offsetY=offsetY+touchY; - Log.e("LyricView","offsety:"+offsetY); - invalidate(); - break; - case MotionEvent.ACTION_UP: - break; - } - touchY=tt; - return true; } public void init(){ @@ -177,6 +152,9 @@ return lrcIndex; } + public void setIndex(int lrcIndex) { + this.lrcIndex = lrcIndex; + } /** * @return the offsetY @@ -206,4 +184,17 @@ public void setSIZEWORD(int sIZEWORD) { SIZEWORD = sIZEWORD; } + + public int getIndexFromOffsetY(float offsetY){ + //220 - index * (binding.lyric.getSIZEWORD() + 44) + int index = (int) ((220 - offsetY) / (SIZEWORD + 44)); + Log.i("LyricView", "getIndexFromOffsetY index:"+index); + if(LyricServer.getLrc_map().keySet().size()>index){ + return index; + }else if(index < 0){ + return 0; + }else{ + return LyricServer.getLrc_map().keySet().size() -1; + } + } } -- Gitblit v1.9.1