给刻度尺进度条添加触摸事件
package com.myf.ruler;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
/**
* 可拖动刻度尺
* @author ZH-SW-Mengyf
*
*/
public class RulerSeekBar extends RulerProgressBar{
private int mLastProgress = -1;
private OnSeekBarChangeListener mOnSeekBarChangeListener;
/**
* 数据改变监听
* @author Mengyf
*
*/
public interface OnSeekBarChangeListener {
void onProgressChanged(RulerSeekBar colorArcSeekBar,long progress,boolean fromUser);
void onStartTrackingTouch(RulerSeekBar colorArcSeekBar);
void onStopTrackingTouch(RulerSeekBar colorArcSeekBar);
}
/**
* 设置进度监听
* @param l
*/
public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
mOnSeekBarChangeListener = l;
}
public RulerSeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public RulerSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RulerSeekBar(Context context) {
super(context);
init(context);
}
private void init(Context context){
}
@SuppressLint("NewApi") @Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float offsetX = eventX - getPaddingStart();
refreshThumbOffset(offsetX);
int tempProgress = offsetXByProgress(offsetX);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(false);
setProgress(tempProgress, false, false);
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStartTrackingTouch(this);
}
break;
case MotionEvent.ACTION_MOVE:
getParent().requestDisallowInterceptTouchEvent(false);
setProgress(tempProgress, false, false);
if (mLastProgress != tempProgress) {
mLastProgress = tempProgress;
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), true);
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
setProgress(tempProgress, false, true);
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), false);
mOnSeekBarChangeListener.onStopTrackingTouch(this);
}
break;
default:
break;
}
return true;
}
/**
* 将坐标转换为进度值
* @param offsetX
* @return
*/
private int offsetXByProgress(float offsetX) {
float offset = (offsetX - getRulerWidth() / 2) / getRulerDistance();
int progress = Math.round(offset);
return progress;
}
}