package com.lingju.assistant.activity.index.view; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import com.lingju.assistant.R; import com.lingju.assistant.entity.Lyric; import com.lingju.assistant.entity.Sentence; import com.lingju.assistant.player.audio.LingjuAudioPlayer; import com.lingju.model.PlayMusic; import com.lingju.common.log.Log; import com.lingju.util.PlayList; import com.lingju.util.ScreenUtil; import java.util.concurrent.atomic.AtomicBoolean; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; /** * Created by Administrator on 2016/11/23. */ public class PlayerListLrcFragment extends PlayerListFragment { private final static String TAG = "PlayerListLrcFragment"; View root; @BindView(R.id.player_lyric_listView) RecyclerView lyricListView; @BindView(R.id.player_list_lrc_play_mode) ImageButton setPlayModeBt; @BindView(R.id.player_list_lrc_duration) TextView durationText; @BindView(R.id.player_list_lrc_favorite_bt) ImageButton favoriteBt; private Lyric lyric = new Lyric(); private boolean move = false; private int mIndex = 0; private boolean lyricOpen; private int current_lrc_index = -1; private int lrcListViewHeight; private int listBoxHeight; private AtomicBoolean isRuning = new AtomicBoolean(false); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { root = inflater.inflate(R.layout.frag_player_music_list_lrc, container, false); ButterKnife.bind(this, root); init(); return root; } protected void init() { super.init(); lyricListView.setHasFixedSize(true); lyricListView.setLayoutManager((linearLayoutManager = new LinearLayoutManager(getActivity()))); lyricListView.setAdapter(lyricListAdapter); lyricListView.addOnScrollListener(new RecyclerViewListener()); if (title != null) titleText.setText(title); if (list != null && list.size() > 0) { tipsText.setVisibility(View.GONE); } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setPlayMode(this.playMode); updateFavorte(); } public void updateFavorte() { setFavoriteState(LingjuAudioPlayer.get().currentPlayMusic()); refresh(); } @OnClick({R.id.player_list_lrc_play_mode, R.id.player_list_lrc_favorite_bt}) public void onClick(View v) { switch (v.getId()) { case R.id.player_list_lrc_play_mode: LingjuAudioPlayer lp = LingjuAudioPlayer.get(); lp.setPlayMode((lp.getPlayMode() + 1) % 3); break; case R.id.player_list_lrc_favorite_bt: /* 在数据库中操作数据 */ PlayMusic playMusic = LingjuAudioPlayer.get().currentPlayMusic(); if (playMusic != null) { /* playMusic.setFavorite(!playMusic.getFavorite()); if (playMusic.isFavorite()) LingjuAudioPlayer.get().addToFavoites(playMusic); else { LingjuAudioPlayer.get().removeFromFavoites(playMusic); LingjuAudioPlayer.get().removeFavoriteFromList(playMusic); }*/ if (playerListItemClickListener != null) { playerListItemClickListener.onItemFavoriteClick(playingPosition, v); setFavoriteState(playMusic); } } break; } } @Override public void refresh() { super.refresh(); refreshLyric(); } private void refreshLyric() { if (lyric != null && lyricListView != null) { lyricListAdapter.notifyDataSetChanged(); /*lyricListView.post(new Runnable() { @Override public void run() { lyricListView.smoothScrollToPosition(location); } });*/ } } public void setLyric(Lyric lyric) { this.lyric = lyric; refreshLyric(); } public void setPlayMode(int playMode) { this.playMode = playMode; switch (playMode) { case PlayList.PlayMode.ORDER: setPlayModeBt.setImageLevel(PlayList.PlayMode.ORDER); return; case PlayList.PlayMode.RANDOM: setPlayModeBt.setImageLevel(PlayList.PlayMode.RANDOM); return; case PlayList.PlayMode.SINGLE: setPlayModeBt.setImageLevel(PlayList.PlayMode.SINGLE); return; default: return; } } public void showCurrentMusic(PlayMusic music) { durationText.setText(toTime(music.getDuration())); tipsText.setVisibility(View.GONE); //有播放歌曲时,隐藏提示文本 setFavoriteState(music); } /** * 设置收藏按钮状态 **/ @Override public void setFavoriteState(PlayMusic music) { if (favoriteBt != null) { // LevelListDrawable ld = (LevelListDrawable) favoriteBt.getBackground(); if (music != null) // ld.setLevel(music.isFavorite() ? 1 : 0); favoriteBt.setImageLevel(music.isFavorite() ? 1 : 0); else favoriteBt.setImageLevel(0); } } public void updateProgress(int play_current_time, int play_all_time) { if (lyric != null) { int index = lyric.getNowSenPosition(play_current_time); updateLrc(index, play_all_time); } } private int location = 0; public void updateLrc(int index, int duration) { // lyricListView.smoothScrollToPosition(location); int firstPosition = linearLayoutManager.findFirstVisibleItemPosition(); int lastPosition = linearLayoutManager.findLastVisibleItemPosition(); int temp = (lastPosition - firstPosition) / 2; // Log.i("LingJu", "current_lrc_index is :" + current_lrc_index); if (current_lrc_index != index) { if (lyricOpen) { if (index > temp && index < (lyricListAdapter.getItemCount() - temp)) { location = index - temp; } else if (index <= temp) { location = 0; } else { location = lyricListAdapter.getItemCount() - 1; } /*int b=index-(l-f)/2; b=b<0?0:b; Log.i(TAG, "f="+f+",l="+l+",b="+b+",index="+index); if(f!=b&&(f<b||f>index)){ Log.w(PlayerListLrcFragment.class.getName(), "scroll to "+b+">>"+lyric.getList().get(b).getContent()); lyricListView.smoothScrollToPosition(b); }*/ } else { if (lyricListView != null) location = index == (lyric.size() - 1) ? index : index + 1; } durationText.setText(duration > 0 ? toTime(duration) : ""); /*Log.i("LingJu", "歌词滚动>>> first:" + firstPosition + " last:" + lastPosition + " index" + index + " location:" + location);*/ current_lrc_index = index; if (lyricOpen) { move(location); } else { lyricListView.scrollToPosition(location); } lyricListAdapter.notifyDataSetChanged(); // lyricListView.smoothScrollToPosition(location); } // else { // if (firstPosition > index) // location = index - temp <= 0 ? 0 : index - temp; // Log.i("LingJu", "持续滚动:" + location); // lyricListAdapter.notifyDataSetChanged(); // lyricListView.smoothScrollToPosition(location); // } /* refreshLyric(); lyricListView.smoothScrollToPosition(location);*/ } public void switchLyricBox() { if (isRuning.get()) return; listBoxHeight = root.findViewById(R.id.player_list_lrc_listbox).getHeight(); if (!lyricOpen) { //展开 LinearLayout.LayoutParams layout = (LinearLayout.LayoutParams) lyricListView.getLayoutParams(); if (layout != null) { lrcListViewHeight = layout.height; Log.e(TAG, "open>>>>lrcListViewHeight====" + lrcListViewHeight); animation.reset(); animation.setDuration(200); animation.setInterpolator(new AccelerateInterpolator()); animation.setAnimationListener(animationListener); isRuning.set(true); lyricOpen = true; lyricListView.startAnimation(animation); } } else { if (lrcListViewHeight > 0) { Log.e(TAG, "close>>>>>>lrcListViewHeight====" + lrcListViewHeight); animation.reset(); animation.setDuration(200); animation.setInterpolator(new AccelerateInterpolator()); animation.setAnimationListener(animationListener); isRuning.set(true); lyricOpen = false; lyricListView.startAnimation(animation); } } } public boolean isLrcOpen() { return lyricOpen; } private Animation animation = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if (lyricOpen) { lyricListView.getLayoutParams().height = lrcListViewHeight + (int) ((listBoxHeight - lrcListViewHeight) * interpolatedTime); } else { lyricListView.getLayoutParams().height = listBoxHeight - (int) ((listBoxHeight - lrcListViewHeight) * interpolatedTime); } lyricListView.requestLayout(); if (android.os.Build.VERSION.SDK_INT < 11) { lyricListView.invalidate(); } } }; private Animation.AnimationListener animationListener = new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { isRuning.set(true); Log.i(TAG, "onAnimationStart"); } @Override public void onAnimationEnd(Animation animation) { isRuning.set(false); Log.i(TAG, "onAnimationEnd"); } @Override public void onAnimationRepeat(Animation animation) { } }; View.OnClickListener lyricClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Log.i(TAG, "lyricListView.onClick......................."); switchLyricBox(); } }; private class LyricItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView itemView; int position; public LyricItemViewHolder(TextView itemView) { super(itemView); this.itemView = itemView; } void bind(int position, Sentence st) { this.position = position; itemView.setText(st.getContent()); if (current_lrc_index == position) { itemView.setTextColor(current_color); //holder.itemView.setTextSize(TypedValue.COMPLEX_UNIT_SP,20); } else { itemView.setTextColor(getResources().getColorStateList(R.color.music_second_text_color)); //holder.itemView.setTextSize(TypedValue.COMPLEX_UNIT_SP,16); } } @Override public void onClick(View v) { if (v.getId() != R.id.player_list_item_favorite_bt) { if (playerListItemClickListener != null) playerListItemClickListener.onItemClick(position, v); } else { if (playerListItemClickListener != null) { playerListItemClickListener.onItemFavoriteClick(position, v); } } } } private RecyclerView.Adapter<LyricItemViewHolder> lyricListAdapter = new RecyclerView.Adapter<LyricItemViewHolder>() { /** * <TextView android:id="@+id/player_music_lyric_line_text" android:layout_width="match_parent" android:layout_height="28dp" android:gravity="center" android:textSize="14sp" android:textColor="@color/music_second_text_color" android:paddingLeft="30dp" android:paddingRight="30dp" android:clickable="false" /> * @param parent * @param viewType * @return */ @Override public LyricItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ScreenUtil.getInstance().dip2px(28)); LyricItemViewHolder holder = new LyricItemViewHolder(new TextView(getActivity())); holder.itemView.setGravity(Gravity.CENTER); holder.itemView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); holder.itemView.setTextColor(getActivity().getResources().getColor(R.color.music_second_text_color)); holder.itemView.setPadding(ScreenUtil.getInstance().dip2px(30), 0, ScreenUtil.getInstance().dip2px(30), 0); holder.itemView.setClickable(false); holder.itemView.setOnClickListener(lyricClickListener); parent.addView(holder.itemView, layoutParams); return holder; } @Override public void onBindViewHolder(LyricItemViewHolder holder, int position) { // Log.i("lingju", "position is :" + position); holder.bind(position, lyric.getList().get(position)); } @Override public int getItemCount() { return lyric == null ? 0 : lyric.size(); } }; private void move(int n) { if (n < 0 || n >= lyricListAdapter.getItemCount()) { // Toast.makeText(this,"超出范围了",Toast.LENGTH_SHORT).show(); return; } mIndex = n; lyricListView.stopScroll(); moveToPosition(n); } private void moveToPosition(int n) { int firstItem = linearLayoutManager.findFirstVisibleItemPosition(); int lastItem = linearLayoutManager.findLastVisibleItemPosition(); if (n <= firstItem) { lyricListView.scrollToPosition(n); } else if (n <= lastItem) { int top = lyricListView.getChildAt(n - firstItem).getTop(); lyricListView.scrollBy(0, top); } else { lyricListView.scrollToPosition(n); move = true; } } class RecyclerViewListener extends RecyclerView.OnScrollListener { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (move && newState == RecyclerView.SCROLL_STATE_IDLE) { move = false; int n = mIndex - linearLayoutManager.findFirstVisibleItemPosition(); if (0 <= n && n < lyricListView.getChildCount()) { int top = lyricListView.getChildAt(n).getTop(); lyricListView.smoothScrollBy(0, top); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (move) { move = false; int n = mIndex - linearLayoutManager.findFirstVisibleItemPosition(); if (0 <= n && n < lyricListView.getChildCount()) { int top = lyricListView.getChildAt(n).getTop(); lyricListView.scrollBy(0, top); } } } } }