项目出了这么一个设计图,要求做出一个这样的音频控制的进度条(如下图)。进度条有三个功能:
1.可以随着音频播放自动更新进度
2.可以按着图标滑动改变进度
3.可以点击图标让音频开始或者暂停。
网上没找到现成的这种控件,只有自己写了。代码分享如下:
package com.unipus.view;
import android.content.Context;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.AppCompatSeekBar;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
/**
* 可以设置滑块点击事件的seek bar
*
*/
public class SeekBarWithThumbTouch extends AppCompatSeekBar {
public static final String TAG = SeekBarWithThumbTouch.class.getSimpleName();
private int scaledTouchSlop = 0;
private float initTouchX = 0;
private boolean thumbPressed = false;
private Drawable mThumb;//滑块图片
private boolean isMove;//是否可以滑动
private OnClickThumbListener mListener;
public SeekBarWithThumbTouch(Context context) {
super(context);
init(context);
}
public SeekBarWithThumbTouch(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public SeekBarWithThumbTouch(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
//设置大了点击的时候容易来回闪动
private void init(Context context) {
scaledTouchSlop = 5;//ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Drawable thumb = null;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
thumb = getSeekBarThumb();//works only for API >=16!
if (thumb != null) {
//contains current position of thumb in view as bounds
RectF bounds = new RectF(thumb.getBounds());
thumbPressed = bounds.contains(event.getX(), event.getY());
if (thumbPressed) {
Log.d(TAG, "pressed");
initTouchX = event.getX();
}
return true;
}
break;
case MotionEvent.ACTION_UP:
if (thumbPressed) {
thumbPressed = false;
Log.d(TAG, " move up init touch x : " + initTouchX + " get x : " + event.getX() + " progress : " + getProgress() + " scaledTouchSlop : " + scaledTouchSlop);
if (Math.abs(initTouchX - event.getX()) > scaledTouchSlop) {
Log.d(TAG, " move up : ");
initTouchX = 0;
if (isMove) return super.onTouchEvent(event);
} else {
Log.d(TAG, "was pressed -- listener call");
if (mListener != null) mListener.onClickThumb();
}
}
return true;
case MotionEvent.ACTION_MOVE:
if (!isMove) {
Log.e(TAG, " is move : " + isMove);
return true;
}
break;
}
return super.onTouchEvent(event);
}
private Drawable getSeekBarThumb() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
return getThumb();
}
return mThumb;
}
public void setSeekThumb(Drawable thumb) {
this.mThumb = thumb;
}
public void setSeekBarIsTouchMove(boolean isMove) {
this.isMove = isMove;
}
public void setOnclickThumbListener(OnClickThumbListener listener) {
this.mListener = listener;
}
public interface OnClickThumbListener {
void onClickThumb();
}
}