a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 系統(tǒng) > Android > 正文

Android仿音樂(lè)播放器帶進(jìn)度的播放暫停按鈕

2019-10-21 21:31:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

因?yàn)轫?xiàng)目需要,要做一個(gè)下載暫停開(kāi)始的按鈕,要求按鈕上顯示進(jìn)度。網(wǎng)上找了找沒(méi)有合適的,不太滿(mǎn)意,于是自己動(dòng)手寫(xiě)了一個(gè)。

效果如下:

Android,音樂(lè)播放器,進(jìn)度,按鈕

主要步驟:

1、最外側(cè)的圓環(huán)。

2、圓環(huán)內(nèi)側(cè)代表進(jìn)度的圓弧。

3、暫停時(shí)在中心部位畫(huà)出三角形。

4、播放時(shí)在中心部位畫(huà)出矩形。

5、重寫(xiě)onTouch方法,DOWN事件時(shí)設(shè)置播放或者暫停的狀態(tài)。

6、添加一個(gè)狀態(tài)監(jiān)聽(tīng)器,在調(diào)用者中監(jiān)聽(tīng)狀態(tài)。

7、設(shè)置進(jìn)度,重繪。

代碼比較簡(jiǎn)單,所以貼出來(lái)View的代碼,Activity和布局文件就不寫(xiě)了:

/** Created by xuzhilei on 2016/8/16. 模仿音樂(lè)暫停開(kāi)始按鈕的View */public class PlayButtonView extends View {  /** 中心點(diǎn)X軸坐標(biāo) */ private int viewCenterX;  /** 中心點(diǎn)Y軸坐標(biāo) */ private int viewCenterY;  /** 有效長(zhǎng)度的一般(View長(zhǎng)寬較小者的一半) */ private int viewHalfLength;  /** 三角形右側(cè)頂點(diǎn) */ private Point pointA = new Point();  /** 三角形左上頂點(diǎn) */ private Point pointB = new Point();  /** 三角形左下頂點(diǎn) */ private Point pointC = new Point();  /** 矩形左邊界 */ private int RectLeft;  /** 矩形上邊界 */ private int RectTOP;  /** 矩形右邊界 */ private int RectRight;  /** 矩形下邊界 */ private int RectBottom;  /** 三角形的三條邊路徑 */ private Path path = new Path();  /** 包圍最外側(cè)圓環(huán)的矩形 */ private RectF rectF = new RectF();  /** 包圍進(jìn)度圓弧的矩形 */ private RectF rectF2 = new RectF();  /** 進(jìn)度 */ private int progress;  /** 暫停中還是播放中 */ private boolean isPlaying = false;  /** 是否進(jìn)行過(guò)了測(cè)量 */ private boolean isMeasured = false;  /** 畫(huà)筆顏色 */ private int color = 0xffff0099;  /** 最外側(cè)圓環(huán)畫(huà)筆 */ private Paint paintA = new Paint();  /** 進(jìn)度圓弧畫(huà)筆 */ private Paint paintB = new Paint();  /** 暫停開(kāi)始畫(huà)筆 */ private Paint paintC = new Paint();  /** 狀態(tài)監(jiān)聽(tīng)器 */ private OnStatusChangeListener onStatusChangeListener;  /** 構(gòu)造器 */ public PlayButtonView(Context context, AttributeSet attrs) { super(context, attrs); }  @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (!isMeasured) {  getWidthAndHeight();  isMeasured = true; } }  /** 得到視圖等的高度寬度尺寸數(shù)據(jù) */ private void getWidthAndHeight() {  int viewHeight = getMeasuredHeight(); int viewWidth = getMeasuredWidth(); viewCenterX = viewWidth / 2; viewCenterY = viewHeight / 2; viewHalfLength = viewHeight < viewWidth ? viewHeight / 2 : viewWidth / 2;  int paintAwidth = viewHalfLength / 15; int paintBwidth = viewHalfLength / 8;  rectF.left = viewCenterX - (viewHalfLength - paintAwidth / 2); rectF.top = viewCenterY - (viewHalfLength - paintAwidth / 2); rectF.right = viewCenterX + (viewHalfLength - paintAwidth / 2); rectF.bottom = viewCenterY + (viewHalfLength - paintAwidth / 2);  rectF2.left = viewCenterX - (viewHalfLength - paintBwidth / 2); rectF2.top = viewCenterY - (viewHalfLength - paintBwidth / 2); rectF2.right = viewCenterX + (viewHalfLength - paintBwidth / 2); rectF2.bottom = viewCenterY + (viewHalfLength - paintBwidth / 2);  paintA.setColor(color); paintA.setStrokeWidth(paintAwidth); paintA.setAntiAlias(true); paintA.setStyle(Paint.Style.STROKE);  paintB.setColor(color); paintB.setStrokeWidth(paintBwidth); paintB.setAntiAlias(true); paintB.setStyle(Paint.Style.STROKE);  paintC.setColor(color); paintC.setStrokeWidth(1); paintC.setAntiAlias(true); paintC.setStyle(Paint.Style.FILL);  pointA.x = viewCenterX + viewHalfLength / 2; pointA.y = viewCenterY;  double sin = Math.sin(Math.toRadians(60)); // √(3) / 2 double cos = Math.cos(Math.toRadians(60)); // 1/ 2  pointB.x = (float) ((viewCenterX - cos * viewHalfLength + viewCenterX) / 2); pointB.y = (float) ((viewCenterY - sin * viewHalfLength + viewCenterY) / 2);  pointC.x = (float) ((viewCenterX - cos * viewHalfLength + viewCenterX) / 2); pointC.y = (float) ((viewCenterY + sin * viewHalfLength + viewCenterY) / 2);  RectLeft = viewCenterX - viewHalfLength / 3; RectTOP = viewCenterY - viewHalfLength / 3; RectRight = viewCenterX + viewHalfLength / 3; RectBottom = viewCenterY + viewHalfLength / 3; }  @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);  // 畫(huà)未完成進(jìn)度的圓環(huán) canvas.drawArc(rectF, 0, 360, false, paintA);  // 畫(huà)已經(jīng)完成進(jìn)度的圓弧 從-90度開(kāi)始,即從圓環(huán)頂部開(kāi)始 canvas.drawArc(rectF2, -90, progress * 3.6f, false, paintB);  if (isPlaying) {  canvas.drawRect(RectLeft, RectTOP, RectRight, RectBottom, paintC); } else {  path.reset();  path.moveTo(pointA.x, pointA.y);  path.lineTo(pointB.x, pointB.y);  path.lineTo(pointC.x, pointC.y);  path.close();  canvas.drawPath(path, paintC); } }  /** 監(jiān)聽(tīng)觸摸DOWN時(shí)間,開(kāi)始播放,暫停播放 */ @Override public boolean onTouchEvent(MotionEvent event) {  if (event.getAction() == MotionEvent.ACTION_DOWN) {  isPlaying = !isPlaying;  invalidate();  if (isPlaying) {  onStatusChangeListener.play();  } else {  onStatusChangeListener.pause();  } } return super.onTouchEvent(event); }  /** 設(shè)置進(jìn)度 0-100區(qū)間 */ public void setProgress(int progress) {  if (progress < 0) {  progress = 0; } if (progress > 100) {  progress = 100; } this.progress = progress; invalidate(); }  /** 外界設(shè)置播放狀態(tài) */ public void setPlaying(boolean isPlaying) { this.isPlaying = isPlaying; invalidate(); }  /** 播放暫停狀態(tài)監(jiān)聽(tīng)的接口 */ public interface OnStatusChangeListener {  void play();  void pause(); }  /** 設(shè)置監(jiān)聽(tīng)接口 */ public void setOnStatusChangeListener(OnStatusChangeListener onStatusChangeListener) { this.onStatusChangeListener = onStatusChangeListener; }  /** 位置信息 */ private class Point { float x; float y; }

在調(diào)用者中設(shè)置OnStatusChangeListener 的監(jiān)聽(tīng)器即可監(jiān)聽(tīng)播放狀態(tài),通過(guò)setProgress方法就可以設(shè)置進(jìn)度。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久草青青| 久草ab| 激情久久久久 | 日本五月婷婷 | 久草视 | 美日韩一区二区 | 欧美一区二区视频在线观看 | 一级黄色大片视频 | 欧美成人高清视频 | 精品国产乱码久久久久久蜜柚 | 18韩国主播福利视频在线观看 | 久草视频在线播放 | 精品18| 黄色一级视频 | 亚洲欧美影院 | 人人鲁人人莫一区二区三区 | 国产精品夜间视频香蕉 | 老司机深夜福利在线观看 | 亚洲天堂av中文字幕 | 三级免费黄| 中文字幕在线第一页 | 欧美一区二区在线 | 在线免费看黄色 | 日韩欧在线| 性一交一乱一透一a级 | 国内久久精品视频 | 亚洲一区国产精品 | 国产精品免费视频一区 | 精品美女在线观看视频在线观看 | 久久久久久久久久久久免费 | av中文字幕在线播放 | 久久久久久久久久久九 | 一区二区三区四区精品 | 91.成人天堂一区 | 欧美成人手机在线 | 天天色天天看 | 91精品国产乱码久久久久久 | 国产精品一二 | 欧美日韩国产精品 | 午夜精品一区二区三区免费视频 | 欧美一区二区久久久 |