天天看點

Android音樂播放器進度條實作

首先在Activity中設定相應參數,如下:

private ProgressBar pbar;

        private static final int REFRESH_TIME = 1;

private long mPosOverride = -1;

// Handler used to update the current time

private TimeHandler mTimeHandler;

private boolean mIsPaused = false;
           

實作重新整理進度的方法:

private long refreshCurrentTime() {
		if (mService == null) {
			return 500;
		}
		try {
			final long pos = mPosOverride < 0 ? MusicUtils.position()
					: mPosOverride;
			if (pos >= 0 && MusicUtils.duration() > 0) {
				// refreshCurrentTimeText(pos);
				final int progress = (int) (1000 * pos / MusicUtils.duration());
				pbar.setProgress(progress);
			} else {
				pbar.setProgress(1000);
			}
			// calculate the number of milliseconds until the next full second,
			// so
			// the counter can be updated at just the right time
			final long remaining = 1000 - pos % 1000;
			// approximate how often we would need to refresh the slider to
			// move it smoothly
			int width = pbar.getWidth();
			if (width == 0) {
				width = 320;
			}
			final long smoothrefreshtime = MusicUtils.duration() / width;
			if (smoothrefreshtime > remaining) {
				return remaining;
			}
			if (smoothrefreshtime < 20) {
				return 20;
			}
			return smoothrefreshtime;
		} catch (final Exception ignored) {

		}
		return 500;
	}

	/**
	 * @param delay
	 *            When to update
	 */
	private void queueNextRefresh(final long delay) {
		if (!mIsPaused) {
			final Message message = mTimeHandler.obtainMessage(REFRESH_TIME);
			mTimeHandler.removeMessages(REFRESH_TIME);
			mTimeHandler.sendMessageDelayed(message, delay);
		}
	}
           

實作Handler:

/**
	 * Used to update the current time string
	 */
	private static final class TimeHandler extends Handler {

		private final WeakReference<MusicWaveActivity> mAudioPlayer;

		/**
		 * Constructor of <code>TimeHandler</code>
		 */
		public TimeHandler(final MusicWaveActivity player) {
			mAudioPlayer = new WeakReference<MusicWaveActivity>(player);
		}

		@Override
		public void handleMessage(final Message msg) {
			switch (msg.what) {
			case REFRESH_TIME:
				final long next = mAudioPlayer.get().refreshCurrentTime();
				mAudioPlayer.get().queueNextRefresh(next);
				break;
			default:
				break;
			}
		}
	};
           

最後在Activity 中的操作;

@Override
	protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.home);
                mTimeHandler = new TimeHandler(this);
        }
        @Override
	protected void onDestroy() {
          mIsPaused = false;
        mTimeHandler.removeMessages(REFRESH_TIME);
        }
        @Override
	protected void onResume() {
            queueNextRefresh(1);
        }