package com.wm.remusic.activity; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.media.AudioManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Scroller; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.facebook.common.executors.CallerThreadExecutor; import com.facebook.common.references.CloseableReference; import com.facebook.datasource.DataSource; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.wm.remusic.R; import com.wm.remusic.fragment.PlayQueueFragment; import com.wm.remusic.fragment.RoundFragment; import com.wm.remusic.fragment.SimpleMoreFragment; import com.wm.remusic.handler.HandlerUtil; import com.wm.remusic.info.MusicInfo; import com.wm.remusic.lrc.DefaultLrcParser; import com.wm.remusic.lrc.LrcRow; import com.wm.remusic.lrc.LrcView; import com.wm.remusic.provider.PlaylistsManager; import com.wm.remusic.service.MediaService; import com.wm.remusic.service.MusicPlayer; import com.wm.remusic.uitl.IConstants; import com.wm.remusic.uitl.ImageUtils; import com.wm.remusic.uitl.L; import com.wm.remusic.uitl.MusicUtils; import com.wm.remusic.widget.AlbumViewPager; import com.wm.remusic.widget.PlayerSeekBar; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static com.wm.remusic.service.MusicPlayer.getAlbumPath; /** * Created by wm on 2016/2/21. */ public class PlayingActivity extends BaseActivity implements IConstants { private ImageView mBackAlbum, mPlayingmode, mControl, mNext, mPre, mPlaylist, mCmt, mFav, mDown, mMore, mNeedle; private TextView mTimePlayed, mDuration; private PlayerSeekBar mProgress; private ActionBar ab; private ObjectAnimator mNeedleAnim, mRotateAnim; private AnimatorSet mAnimatorSet; private AlbumViewPager mViewPager; private FragmentAdapter mAdapter; private BitmapFactory.Options mNewOpts; private View mActiveView; private PlaylistsManager mPlaylistsManager; private WeakReference<ObjectAnimator> animatorWeakReference; private WeakReference<View> mViewWeakReference = new WeakReference<View>(null); private boolean isFav = false; private boolean isNextOrPreSetPage = false; //判断viewpager由手动滑动 还是setcruuentitem换页 private Toolbar toolbar; private FrameLayout mAlbumLayout; private RelativeLayout mLrcViewContainer; private LrcView mLrcView; private TextView mTryGetLrc; private LinearLayout mMusicTool; private SeekBar mVolumeSeek; private Handler mHandler; private Handler mPlayHandler; private static final int VIEWPAGER_SCROLL_TIME = 390; private static final int TIME_DELAY = 500; private static final int NEXT_MUSIC = 0; private static final int PRE_MUSIC = 1; private Bitmap mBitmap; private long lastAlbum; private PlayMusic mPlayThread; private boolean print = true; private String TAG = PlayingActivity.class.getSimpleName(); @Override protected void showQuickControl(boolean show) { //super.showOrHideQuickControl(show); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_playing); mPlaylistsManager = PlaylistsManager.getInstance(this); toolbar = (Toolbar) findViewById(R.id.toolbar); if (toolbar != null) { setSupportActionBar(toolbar); ab = getSupportActionBar(); ab.setDisplayHomeAsUpEnabled(true); ab.setHomeAsUpIndicator(R.drawable.actionbar_back); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } mAlbumLayout = (FrameLayout) findViewById(R.id.headerView); mLrcViewContainer = (RelativeLayout) findViewById(R.id.lrcviewContainer); mLrcView = (LrcView) findViewById(R.id.lrcview); mTryGetLrc = (TextView) findViewById(R.id.tragetlrc); mMusicTool = (LinearLayout) findViewById(R.id.music_tool); mBackAlbum = (ImageView) findViewById(R.id.albumArt); mPlayingmode = (ImageView) findViewById(R.id.playing_mode); mControl = (ImageView) findViewById(R.id.playing_play); mNext = (ImageView) findViewById(R.id.playing_next); mPre = (ImageView) findViewById(R.id.playing_pre); mPlaylist = (ImageView) findViewById(R.id.playing_playlist); mMore = (ImageView) findViewById(R.id.playing_more); mCmt = (ImageView) findViewById(R.id.playing_cmt); mFav = (ImageView) findViewById(R.id.playing_fav); mDown = (ImageView) findViewById(R.id.playing_down); mTimePlayed = (TextView) findViewById(R.id.music_duration_played); mDuration = (TextView) findViewById(R.id.music_duration); mProgress = (PlayerSeekBar) findViewById(R.id.play_seek); mNeedle = (ImageView) findViewById(R.id.needle); mViewPager = (AlbumViewPager) findViewById(R.id.view_pager); mNeedleAnim = ObjectAnimator.ofFloat(mNeedle, "rotation", -25, 0); mNeedleAnim.setDuration(200); mNeedleAnim.setRepeatMode(0); mNeedleAnim.setInterpolator(new LinearInterpolator()); mVolumeSeek = (SeekBar) findViewById(R.id.volume_seek); mProgress.setIndeterminate(false); mProgress.setProgress(1); mProgress.setMax(1000); loadOther(); setViewPager(); initLrcView(); mHandler = HandlerUtil.getInstance(this); mHandler.postDelayed(mUpAlbumRunnable, 0); mPlayThread = new PlayMusic(); mPlayThread.start(); } private void initLrcView() { mLrcView.setOnSeekToListener(onSeekToListener); mLrcView.setOnLrcClickListener(onLrcClickListener); mViewPager.setOnSingleTouchListener(new AlbumViewPager.OnSingleTouchListener() { @Override public void onSingleTouch(View v) { if (mAlbumLayout.getVisibility() == View.VISIBLE) { mAlbumLayout.setVisibility(View.INVISIBLE); mLrcViewContainer.setVisibility(View.VISIBLE); mMusicTool.setVisibility(View.INVISIBLE); } } }); mLrcViewContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mLrcViewContainer.getVisibility() == View.VISIBLE) { mLrcViewContainer.setVisibility(View.INVISIBLE); mAlbumLayout.setVisibility(View.VISIBLE); mMusicTool.setVisibility(View.VISIBLE); } } }); mTryGetLrc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(MediaService.TRY_GET_TRACKINFO); sendBroadcast(intent); Toast.makeText(getApplicationContext(), "正在获取信息", Toast.LENGTH_SHORT).show(); } }); final AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); int v = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); int mMaxVol = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); mVolumeSeek.setMax(mMaxVol); mVolumeSeek.setProgress(v); mVolumeSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.ADJUST_SAME); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } LrcView.OnLrcClickListener onLrcClickListener = new LrcView.OnLrcClickListener() { @Override public void onClick() { if (mLrcViewContainer.getVisibility() == View.VISIBLE) { mLrcViewContainer.setVisibility(View.INVISIBLE); mAlbumLayout.setVisibility(View.VISIBLE); mMusicTool.setVisibility(View.VISIBLE); } } }; LrcView.OnSeekToListener onSeekToListener = new LrcView.OnSeekToListener() { @Override public void onSeekTo(int progress) { MusicPlayer.seek(progress); } }; private List<LrcRow> getLrcRows() { List<LrcRow> rows = null; InputStream is = null; try { is = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/remusic/lrc/" + MusicPlayer.getCurrentAudioId()); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (is == null) { return null; } } BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; StringBuilder sb = new StringBuilder(); try { while ((line = br.readLine()) != null) { sb.append(line + "\n"); } rows = DefaultLrcParser.getIstance().getLrcRows(sb.toString()); } catch (IOException e) { e.printStackTrace(); } return rows; } private void loadOther() { setSeekBarListener(); setTools(); } private void setViewPager() { mViewPager.setOffscreenPageLimit(2); PlaybarPagerTransformer transformer = new PlaybarPagerTransformer(); mAdapter = new FragmentAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mAdapter); mViewPager.setPageTransformer(true, transformer); // 改变viewpager动画时间 try { Field mField = ViewPager.class.getDeclaredField("mScroller"); mField.setAccessible(true); MyScroller mScroller = new MyScroller(mViewPager.getContext().getApplicationContext(), new LinearInterpolator()); mField.set(mViewPager, mScroller); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(final int pPosition) { if (pPosition < 1) { //首位之前,跳转到末尾(N) MusicPlayer.setQueuePosition(MusicPlayer.getQueue().length); mViewPager.setCurrentItem(MusicPlayer.getQueue().length, false); isNextOrPreSetPage = false; return; } else if (pPosition > MusicPlayer.getQueue().length) { //末位之后,跳转到首位(1) MusicPlayer.setQueuePosition(0); mViewPager.setCurrentItem(1, false); //false:不显示跳转过程的动画 isNextOrPreSetPage = false; return; } else { if (!isNextOrPreSetPage) { if (pPosition < MusicPlayer.getQueuePosition() + 1) { // HandlerUtil.getInstance(PlayingActivity.this).postDelayed(new Runnable() { // @Override // public void run() { // // MusicPlayer.previous(PlayingActivity.this, true); // Message msg = new Message(); // msg.what = 0; // mPlayHandler.sendMessage(msg); // } // }, 500); Message msg = new Message(); msg.what = PRE_MUSIC; mPlayHandler.sendMessageDelayed(msg,TIME_DELAY); } else if (pPosition > MusicPlayer.getQueuePosition() + 1) { // HandlerUtil.getInstance(PlayingActivity.this).postDelayed(new Runnable() { // @Override // public void run() { // // MusicPlayer.mNext(); // // // } // }, 500); Message msg = new Message(); msg.what = NEXT_MUSIC; mPlayHandler.sendMessageDelayed(msg,TIME_DELAY); } } } //MusicPlayer.setQueuePosition(pPosition - 1); isNextOrPreSetPage = false; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int pState) { } }); } private void setTools() { mPlayingmode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MusicPlayer.cycleRepeat(); updatePlaymode(); } }); mPre.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // MusicPlayer.previous(PlayingActivity.this.getApplication(), true); Message msg = new Message(); msg.what = PRE_MUSIC; mPlayHandler.sendMessage(msg); } }); mControl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (MusicPlayer.isPlaying()) { mControl.setImageResource(R.drawable.play_rdi_btn_pause); } else { mControl.setImageResource(R.drawable.play_rdi_btn_play); } if (MusicPlayer.getQueueSize() != 0) { MusicPlayer.playOrPause(); } } }); mNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mRotateAnim != null) { mRotateAnim.end(); mRotateAnim = null; } // mHandler.removeCallbacks(mNextRunnable); // mHandler.postDelayed(mNextRunnable,300); Message msg = new Message(); msg.what = NEXT_MUSIC; mPlayHandler.sendMessage(msg); // MusicPlayer.mNext(); } }); mPlaylist.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlayQueueFragment playQueueFragment = new PlayQueueFragment(); playQueueFragment.show(getSupportFragmentManager(), "playlistframent"); } }); mMore.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SimpleMoreFragment moreFragment = SimpleMoreFragment.newInstance(MusicPlayer.getCurrentAudioId()); moreFragment.show(getSupportFragmentManager(), "music"); } }); mFav.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isFav) { mPlaylistsManager.removeItem(PlayingActivity.this, IConstants.FAV_PLAYLIST, MusicPlayer.getCurrentAudioId()); mFav.setImageResource(R.drawable.play_rdi_icn_love); isFav = false; } else { try { MusicInfo info = MusicPlayer.getPlayinfos().get(MusicPlayer.getCurrentAudioId()); mPlaylistsManager.insertMusic(PlayingActivity.this, IConstants.FAV_PLAYLIST, info); } catch (Exception e) { e.printStackTrace(); } mFav.setImageResource(R.drawable.play_icn_loved); isFav = true; } Intent intent = new Intent(IConstants.PLAYLIST_COUNT_CHANGED); sendBroadcast(intent); } }); } Runnable mNextRunnable = new Runnable() { @Override public void run() { MusicPlayer.next(); } }; @Override public boolean onOptionsItemSelected(MenuItem item) { // handle item selection if (item.getItemId() == R.id.menu_share) { MusicInfo musicInfo = MusicUtils.getMusicInfo(PlayingActivity.this, MusicPlayer.getCurrentAudioId()); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + musicInfo.data)); shareIntent.setType("audio/*"); this.startActivity(Intent.createChooser(shareIntent, getResources().getString(R.string.shared_to))); } return super.onOptionsItemSelected(item); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.playing_menu, menu); return true; } private void updatePlaymode() { if (MusicPlayer.getShuffleMode() == MediaService.SHUFFLE_NORMAL) { mPlayingmode.setImageResource(R.drawable.play_icn_shuffle); Toast.makeText(PlayingActivity.this.getApplication(), getResources().getString(R.string.random_play), Toast.LENGTH_SHORT).show(); } else { switch (MusicPlayer.getRepeatMode()) { case MediaService.REPEAT_ALL: mPlayingmode.setImageResource(R.drawable.play_icn_loop); Toast.makeText(PlayingActivity.this.getApplication(), getResources().getString(R.string.loop_play), Toast.LENGTH_SHORT).show(); break; case MediaService.REPEAT_CURRENT: mPlayingmode.setImageResource(R.drawable.play_icn_one); Toast.makeText(PlayingActivity.this.getApplication(), getResources().getString(R.string.play_one), Toast.LENGTH_SHORT).show(); break; } } } @Override protected void onStart() { super.onStart(); //设置ViewPager的默认项 mViewPager.setCurrentItem(MusicPlayer.getQueuePosition() + 1); } @Override public void onResume() { super.onResume(); lastAlbum = -1; if(MusicPlayer.isTrackLocal()) updateBuffer(100); else { updateBuffer(MusicPlayer.secondPosition()); } mHandler.postDelayed(mUpdateProgress,0); } public void updateQueue() { if (MusicPlayer.getQueueSize() == 0) { MusicPlayer.stop(); finish(); return; } mAdapter.notifyDataSetChanged(); mViewPager.setCurrentItem(MusicPlayer.getQueuePosition() + 1, false); } private void updateFav(boolean b) { if (b) { mFav.setImageResource(R.drawable.play_icn_loved); } else { mFav.setImageResource(R.drawable.play_rdi_icn_love); } } public void updateLrc() { List<LrcRow> list = getLrcRows(); if (list != null && list.size() > 0) { mTryGetLrc.setVisibility(View.INVISIBLE); mLrcView.setLrcRows(list); } else { mTryGetLrc.setVisibility(View.VISIBLE); mLrcView.reset(); } } public void updateTrack() { mHandler.removeCallbacks(mUpAlbumRunnable); if(MusicPlayer.getCurrentAlbumId() != lastAlbum) mHandler.postDelayed(mUpAlbumRunnable, 1600); isFav = false; long[] favlists = mPlaylistsManager.getPlaylistIds(IConstants.FAV_PLAYLIST); long currentid = MusicPlayer.getCurrentAudioId(); for (long i : favlists) { if (currentid == i) { isFav = true; break; } } updateFav(isFav); updateLrc(); ab.setTitle(MusicPlayer.getTrackName()); ab.setSubtitle(MusicPlayer.getArtistName()); mDuration.setText(MusicUtils.makeShortTimeString(PlayingActivity.this.getApplication(), MusicPlayer.duration() / 1000)); } private Runnable mUpAlbumRunnable = new Runnable() { @Override public void run() { new setBlurredAlbumArt().execute(); } }; public void updateTrackInfo() { if (MusicPlayer.getQueueSize() == 0) { return; } Fragment fragment = (RoundFragment) mViewPager.getAdapter().instantiateItem(mViewPager, mViewPager.getCurrentItem()); if (fragment != null) { View v = fragment.getView(); if(mViewWeakReference.get() != v && v != null){ ((ViewGroup) v).setAnimationCacheEnabled(false); if (mViewWeakReference != null) mViewWeakReference.clear(); mViewWeakReference = new WeakReference<View>(v); mActiveView = mViewWeakReference.get(); } } if (mActiveView != null) { // animatorWeakReference = new WeakReference<>((ObjectAnimator) mActiveView.getTag(R.id.tag_animator)); // mRotateAnim = animatorWeakReference.get(); mRotateAnim = (ObjectAnimator) mActiveView.getTag(R.id.tag_animator); } //mProgress.setMax((int) MusicPlayer.mDuration()); mAnimatorSet = new AnimatorSet(); if (MusicPlayer.isPlaying()) { mProgress.removeCallbacks(mUpdateProgress); mProgress.postDelayed(mUpdateProgress, 200); mControl.setImageResource(R.drawable.play_rdi_btn_pause); if (mAnimatorSet != null && mRotateAnim != null && !mRotateAnim.isRunning()) { //修复从playactivity回到Main界面null if (mNeedleAnim == null) { mNeedleAnim = ObjectAnimator.ofFloat(mNeedle, "rotation", -30, 0); mNeedleAnim.setDuration(200); mNeedleAnim.setRepeatMode(0); mNeedleAnim.setInterpolator(new LinearInterpolator()); } mAnimatorSet.play(mNeedleAnim).before(mRotateAnim); mAnimatorSet.start(); } } else { mProgress.removeCallbacks(mUpdateProgress); mControl.setImageResource(R.drawable.play_rdi_btn_play); if (mNeedleAnim != null) { mNeedleAnim.reverse(); mNeedleAnim.end(); } if (mRotateAnim != null && mRotateAnim.isRunning()) { mRotateAnim.cancel(); float valueAvatar = (float) mRotateAnim.getAnimatedValue(); mRotateAnim.setFloatValues(valueAvatar, 360f + valueAvatar); } } isNextOrPreSetPage = false; if (MusicPlayer.getQueuePosition() + 1 != mViewPager.getCurrentItem()) { mViewPager.setCurrentItem(MusicPlayer.getQueuePosition() + 1); isNextOrPreSetPage = true; } } @Override public void updateBuffer(int p) { mProgress.setSecondaryProgress(p*10); } @Override public void loading(boolean l) { mProgress.setLoading(l); } private Runnable mUpdateProgress = new Runnable() { @Override public void run() { if (mProgress != null) { long position = MusicPlayer.position(); long duration = MusicPlayer.duration(); if (duration > 0 && duration < 627080716){ mProgress.setProgress((int) (1000 * position / duration)); mTimePlayed.setText(MusicUtils.makeTimeString( position )); } if (MusicPlayer.isPlaying()) { mProgress.postDelayed(mUpdateProgress, 200); }else { mProgress.removeCallbacks(mUpdateProgress); } } } }; private void setSeekBarListener() { if (mProgress != null) mProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { int progress = 0; @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { i = (int) (i * MusicPlayer.duration() / 1000); mLrcView.seekTo(i, true, b); if (b) { MusicPlayer.seek((long)i); mTimePlayed.setText(MusicUtils.makeTimeString( i )); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private void stopAnim() { mActiveView = null; if (mRotateAnim != null) { mRotateAnim.end(); mRotateAnim = null; } if (mNeedleAnim != null) { mNeedleAnim.end(); mNeedleAnim = null; } if (mAnimatorSet != null) { mAnimatorSet.end(); mAnimatorSet = null; } } @Override public void onPause() { super.onPause(); } @Override public void onStop() { super.onStop(); } @Override public void onDestroy() { super.onDestroy(); mPlayHandler.removeCallbacksAndMessages(null); mPlayHandler.getLooper().quit(); mPlayHandler = null; mProgress.removeCallbacks(mUpdateProgress); stopAnim(); } @Override public void onBackPressed() { super.onBackPressed(); stopAnim(); mProgress.removeCallbacks(mUpdateProgress); } public class PlaybarPagerTransformer implements ViewPager.PageTransformer { @Override public void transformPage(View view, float position) { if (position == 0) { if (MusicPlayer.isPlaying()) { mRotateAnim = (ObjectAnimator) view.getTag(R.id.tag_animator); if (mRotateAnim != null && !mRotateAnim.isRunning() && mNeedleAnim != null) { mAnimatorSet = new AnimatorSet(); mAnimatorSet.play(mNeedleAnim).before(mRotateAnim); mAnimatorSet.start(); } } } else if (position == -1 || position == -2 || position == 1) { mRotateAnim = (ObjectAnimator) view.getTag(R.id.tag_animator); if (mRotateAnim != null) { mRotateAnim.setFloatValues(0); mRotateAnim.end(); mRotateAnim = null; } } else { if (mNeedleAnim != null) { mNeedleAnim.reverse(); mNeedleAnim.end(); } mRotateAnim = (ObjectAnimator) view.getTag(R.id.tag_animator); if (mRotateAnim != null) { mRotateAnim.cancel(); float valueAvatar = (float) mRotateAnim.getAnimatedValue(); mRotateAnim.setFloatValues(valueAvatar, 360f + valueAvatar); } } } } private class setBlurredAlbumArt extends AsyncTask<Void, Void, Drawable> { long albumid = MusicPlayer.getCurrentAlbumId(); @Override protected Drawable doInBackground(Void... loadedImage) { lastAlbum = albumid; Drawable drawable = null; mBitmap = null; if (mNewOpts == null) { mNewOpts = new BitmapFactory.Options(); mNewOpts.inSampleSize = 6; mNewOpts.inPreferredConfig = Bitmap.Config.RGB_565; } if (!MusicPlayer.isTrackLocal()) { L.D(print, TAG, "music is net"); if (getAlbumPath() == null) { L.D(print, TAG, "getalbumpath is null"); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder_disk_210); drawable = ImageUtils.createBlurredImageFromBitmap(mBitmap, PlayingActivity.this.getApplication(), 3); return drawable; } ImageRequest imageRequest = ImageRequestBuilder .newBuilderWithSource(Uri.parse(getAlbumPath())) .setProgressiveRenderingEnabled(true) .build(); ImagePipeline imagePipeline = Fresco.getImagePipeline(); DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, PlayingActivity.this); dataSource.subscribe(new BaseBitmapDataSubscriber() { @Override public void onNewResultImpl(@Nullable Bitmap bitmap) { // You can use the bitmap in only limited ways // No need to do any cleanup. if (bitmap != null) { mBitmap = bitmap; L.D(print, TAG, "getalbumpath bitmap success"); } } @Override public void onFailureImpl(DataSource dataSource) { // No cleanup required here. L.D(print, TAG, "getalbumpath bitmap failed"); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder_disk_210); } }, CallerThreadExecutor.getInstance()); if (mBitmap != null) { drawable = ImageUtils.createBlurredImageFromBitmap(mBitmap, PlayingActivity.this.getApplication(), 3); } } else { try { mBitmap = null; Bitmap bitmap = null; Uri art = Uri.parse(getAlbumPath()); L.D(print, TAG, "album is local "); if (art != null) { ParcelFileDescriptor fd = null; try { fd = getContentResolver().openFileDescriptor(art, "r"); } catch (FileNotFoundException e) { e.printStackTrace(); } if (fd != null) { bitmap = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor(), null, mNewOpts); } else { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder_disk_210, mNewOpts); } } else { bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder_disk_210, mNewOpts); } if (bitmap != null) { drawable = ImageUtils.createBlurredImageFromBitmap(bitmap, PlayingActivity.this.getApplication(), 3); } } catch (Exception e) { e.printStackTrace(); } } return drawable; } @Override protected void onPostExecute(Drawable result) { if (albumid != MusicPlayer.getCurrentAlbumId()) { this.cancel(true); return; } setDrawable(result); } } private void setDrawable(Drawable result) { if (result != null) { if (mBackAlbum.getDrawable() != null) { final TransitionDrawable td = new TransitionDrawable(new Drawable[]{mBackAlbum.getDrawable(), result}); mBackAlbum.setImageDrawable(td); //去除过度绘制 td.setCrossFadeEnabled(true); td.startTransition(200); } else { mBackAlbum.setImageDrawable(result); } } } class FragmentAdapter extends FragmentStatePagerAdapter { private int mChildCount = 0; public FragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { if (position == MusicPlayer.getQueue().length + 1 || position == 0) { return RoundFragment.newInstance(""); } // return RoundFragment.newInstance(MusicPlayer.getQueue()[position - 1]); return RoundFragment.newInstance(MusicPlayer.getAlbumPathAll()[position - 1]); } @Override public int getCount() { //左右各加一个 return MusicPlayer.getQueue().length + 2; } @Override public void notifyDataSetChanged() { mChildCount = getCount(); super.notifyDataSetChanged(); } @Override public int getItemPosition(Object object) { if (mChildCount > 0) { mChildCount--; return POSITION_NONE; } return super.getItemPosition(object); } } public class MyScroller extends Scroller { private int animTime = VIEWPAGER_SCROLL_TIME; public MyScroller(Context context) { super(context); } public MyScroller(Context context, Interpolator interpolator) { super(context, interpolator); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, animTime); } @Override public void startScroll(int startX, int startY, int dx, int dy) { super.startScroll(startX, startY, dx, dy, animTime); } public void setmDuration(int animTime) { this.animTime = animTime; } } // private Thread mPlayThread = new Thread(new Runnable() { // @Override // public void run() { // Looper.prepare(); // mPlayHandler = new Handler(){ // @Override // public void handleMessage(Message msg) { // super.handleMessage(msg); // switch (msg.what){ // case PRE_MUSIC: // MusicPlayer.previous(PlayingActivity.this,true); // break; // case NEXT_MUSIC: // MusicPlayer.next(); // break; // case 3: // MusicPlayer.setQueuePosition(msg.arg1); // break; // } // // // } // }; // // Looper.loop(); // } // }); public class PlayMusic extends Thread { public void run(){ if(Looper.myLooper() == null) Looper.prepare(); mPlayHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case PRE_MUSIC: MusicPlayer.previous(PlayingActivity.this,true); break; case NEXT_MUSIC: MusicPlayer.next(); break; case 3: MusicPlayer.setQueuePosition(msg.arg1); break; } } }; Looper.loop(); } } }