NewSongLyricActivity.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package com.xunao.effectdemo.activity;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.graphics.Color;
  5. import android.media.MediaPlayer;
  6. import android.os.Bundle;
  7. import android.os.Handler;
  8. import android.os.Message;
  9. import android.util.Log;
  10. import android.view.LayoutInflater;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.TextView;
  14. import androidx.annotation.NonNull;
  15. import androidx.annotation.Nullable;
  16. import com.xunao.effectdemo.R;
  17. import com.xunao.effectdemo.bean.MediaBean;
  18. import com.xunao.effectdemo.bean.WordTimeBean;
  19. import com.xunao.effectdemo.net.ApiHttpClient;
  20. import com.xunao.effectdemo.net.ApiUrl;
  21. import com.xunao.effectdemo.net.CSMHttpCallback;
  22. import com.xunao.effectdemo.view.SongLyricTextView;
  23. import java.io.IOException;
  24. import java.util.ArrayList;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. import java.util.Timer;
  29. import java.util.TimerTask;
  30. import com.xunao.effectdemo.bean.MediaBean.ResultBean.ListBean.*;
  31. import com.zhy.view.flowlayout.FlowLayout;
  32. import com.zhy.view.flowlayout.TagAdapter;
  33. import com.zhy.view.flowlayout.TagFlowLayout;
  34. /**
  35. * author : 程中强
  36. * e-mail : 740479946@qq.com
  37. * date : 2022/9/2214:43
  38. * desc :
  39. * version: 1.0
  40. */
  41. public class NewSongLyricActivity extends Activity {
  42. private SongLyricTextView textView;
  43. private Button start,stop,test;
  44. private MediaPlayer mediaPlayer;
  45. private String TAG = "NewSongLyricActivity";
  46. private TagFlowLayout flowLayout;
  47. private String lyric = "你发如雪\n" +
  48. "凄美了离别\n" +
  49. "我焚香感动了谁\n" +
  50. "邀明月让回忆皎洁\n" +
  51. "爱在月光下完美\n" +
  52. "你发如雪\n" +
  53. "纷飞了眼泪\n" +
  54. "我等待苍老了谁\n" +
  55. "红尘醉微醺的岁月\n" +
  56. "我用无悔\n" +
  57. "刻永世爱你的碑";
  58. private String token = "MWIzYmVmOTdiYzI5Y2UwM2ZiOThlMTI3YjRmYWJlNzA=";
  59. private String member_id = "61128";
  60. private String steps_id = "48671";
  61. private String student_id = "180721";
  62. private String[] lyricList;
  63. private List<StepsLyricjsonBean> wordList = new ArrayList<>();
  64. private List<String> list = new ArrayList<>();
  65. private List<String> timeList = new ArrayList<>();
  66. private List<WordTimeBean> beanList = new ArrayList<>();
  67. private WordTimeBean timeBean,currBean;
  68. @Override
  69. protected void onCreate(@Nullable Bundle savedInstanceState) {
  70. super.onCreate(savedInstanceState);
  71. setContentView(R.layout.activity_songe);
  72. init();
  73. }
  74. void init(){
  75. textView = findViewById(R.id.text);
  76. start = findViewById(R.id.start);
  77. stop = findViewById(R.id.end);
  78. start.setOnClickListener(v->{
  79. if(mediaPlayer.isPlaying()){
  80. mediaPlayer.seekTo(0);
  81. }else{
  82. mediaPlayer.start();
  83. }
  84. startPlay();
  85. });
  86. stop.setOnClickListener(v->{
  87. mediaPlayer.pause();
  88. textView.stopPlay();
  89. handler.removeCallbacks(runnable);
  90. });
  91. test = findViewById(R.id.test);
  92. test.setOnClickListener(v->textView.startNormalLine(
  93. 0,
  94. startIndex));
  95. mediaPlayer = new MediaPlayer();
  96. flowLayout = findViewById(R.id.tab_flowlayout);
  97. getMedia();
  98. // setFlowData();
  99. }
  100. void getMedia(){
  101. Map<String, String> params = new HashMap<>();
  102. params.put("member_id",member_id);
  103. params.put("token",token);
  104. params.put("student_id",student_id);
  105. params.put("steps_id",steps_id);
  106. ApiHttpClient.get(ApiUrl.getMapsStepsMedias,params, new CSMHttpCallback() {
  107. @Override
  108. protected void onSuccess(String jsonStr) {
  109. MediaBean mediaBean = MediaBean.parse(jsonStr);
  110. wordList = mediaBean.getResult().getList().getSteps_lyricjson();
  111. setWord(wordList);
  112. mediaPlayer.setOnPreparedListener(mp -> Log.i(TAG,"onPrepared:准备完成"));
  113. mediaPlayer.setOnCompletionListener(mp -> {
  114. textView.release();
  115. handler.removeCallbacks(runnable);
  116. playFinish();
  117. });
  118. try {
  119. mediaPlayer.setDataSource(mediaBean.getResult().getList().getSteps_mp3url());
  120. mediaPlayer.prepareAsync();// 开始在后台缓冲音频文件并返回
  121. } catch (IOException e) {
  122. e.printStackTrace();
  123. }
  124. }
  125. @Override
  126. protected void onFail(String msg) {
  127. }
  128. });
  129. }
  130. private void setWord(List<StepsLyricjsonBean> wordList){
  131. String msg = "";
  132. list.clear();
  133. for (StepsLyricjsonBean bean:wordList) {
  134. for (int i = 0; i < bean.getWord().size(); i++) {
  135. String w = bean.getWord().get(i).replaceAll("<i>","\n ");
  136. if (w.contains("\n"))Log.e("MyTag","长度"+w.length());
  137. list.add(w);
  138. timeList.add(bean.getWordtims().get(i));
  139. timeBean = new WordTimeBean();
  140. timeBean.setStartTime(Integer.parseInt(bean.getStarttime()));
  141. timeBean.setEndTime(Integer.parseInt(bean.getEndtime()));
  142. timeBean.setWord(w);
  143. timeBean.setTime(Integer.parseInt(bean.getWordtims().get(i)));
  144. beanList.add(timeBean);
  145. msg+=w;
  146. }
  147. }
  148. textView.setText(msg);
  149. setFlowData();
  150. }
  151. private int num = 0;
  152. private int canTime = 0;
  153. private int normal = 0;
  154. private Handler handler = new Handler(){
  155. @SuppressLint("HandlerLeak")
  156. @Override
  157. public void handleMessage(@NonNull Message msg) {
  158. super.handleMessage(msg);
  159. switch (msg.what){
  160. case 1001:
  161. if (currBean==null){timeBean = beanList.get(num);}
  162. // Log.e("MyTag","当前:"+timeBean.toString()+" "+time);
  163. if (timeBean.getStartTime()+canTime > time&& timeBean.getStartTime() + canTime-time <100){
  164. num++;
  165. if (num==beanList.size()){
  166. num = 0;
  167. }
  168. textView.startPlayLine(
  169. startIndex,
  170. startIndex + timeBean.getWord().length(), // 因为有个换行符,所以 + 1
  171. normal,1);
  172. startIndex += timeBean.getWord().length();
  173. if (timeBean.getTime()+timeBean.getStartTime()+canTime == timeBean.getEndTime()){
  174. canTime =0;
  175. normal = startIndex ;
  176. Log.e("MyTag","结束标志:"+normal);
  177. }else{
  178. if (canTime==0){
  179. }
  180. canTime +=timeBean.getTime();
  181. }
  182. timeBean = beanList.get(num);
  183. }
  184. break;
  185. }
  186. }
  187. };
  188. int startIndex = 0;
  189. long delayTime = 0L;
  190. void startPlay(){
  191. // String[] lyricList = lyric.split("\n");
  192. handler.post(runnable);
  193. }
  194. private void playFinish(){
  195. time = 0;
  196. startIndex = 0;
  197. num = 0;
  198. canTime = 0;
  199. normal = 0;
  200. }
  201. Timer timer;
  202. int time = 0;
  203. private Runnable runnable = new Runnable() {
  204. @Override
  205. public void run() {
  206. Message msg=new Message();
  207. msg.what=1001;
  208. handler.sendMessage(msg);
  209. time+=50;
  210. handler.postDelayed(runnable,50);
  211. }
  212. };
  213. @Override
  214. protected void onDestroy() {
  215. super.onDestroy();
  216. mediaPlayer.stop();
  217. }
  218. /**
  219. * 给流式布局设置值
  220. */
  221. private void setFlowData() {
  222. flowLayout.setAdapter(new TagAdapter<String>(list) {
  223. @Override
  224. public View getView(FlowLayout parent, int position, String s) {
  225. LayoutInflater inflater = LayoutInflater.from(getApplication());
  226. TextView textView = (TextView) inflater.inflate(R.layout.item_word_sound, flowLayout, false);
  227. textView.setText(s);
  228. return textView;
  229. }
  230. //当选中的时候
  231. @Override
  232. public void onSelected(int position, View view) {
  233. super.onSelected(position, view);
  234. TextView textView = (TextView) view;
  235. textView.setTextColor(Color.parseColor("#FFFFFF"));
  236. }
  237. //当没选中的时候
  238. @Override
  239. public void unSelected(int position, View view) {
  240. super.unSelected(position, view);
  241. TextView textView = (TextView) view;
  242. textView.setTextColor(Color.parseColor("#000000"));
  243. }
  244. });
  245. }
  246. }