本文实例为大家分享了Android实现滑动标尺选择值,效果图
1.自定义属性attrs.xml
2.自定义RulerView
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Scroller;
public class RulerView extends View {
private int mMinVelocity;
private Scroller mScroller; //Scroller是一个专门用于处理滚动效果的工具类 用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动
private VelocityTracker mVelocityTracker; //主要用跟踪触摸屏事件(flinging事件和其他gestures手势事件)的速率。
private int mWidth;
private int mHeight;
private float mSelectorValue = 50.0f; // 未选择时 默认的值 滑动后表示当前中间指针正在指着的值
private float mMaxValue = 200; // 最大数值
private float mMinValue = 100.0f; //最小的数值
private float mPerValue = 1; //最小单位 如 1:表示 每2条刻度差为1. 0.1:表示 每2条刻度差为0.1
// 在demo中 身高mPerValue为1 体重mPerValue 为0.1
private float mLineSpaceWidth = 5; // 尺子刻度2条线之间的距离
private float mLineWidth = 4; // 尺子刻度的宽度
private float mLineMaxHeight = 420; // 尺子刻度分为3中不同的高度。 mLineMaxHeight表示最长的那根(也就是 10的倍数时的高度)
private float mLineMidHeight = 30; // mLineMidHeight 表示中间的高度(也就是 5 15 25 等时的高度)
private float mLineMinHeight = 17; // mLineMinHeight 表示最短的那个高度(也就是 1 2 3 4 等时的高度)
private float mTextMarginTop = 10; //o
private float mTextSize = 30; //尺子刻度下方数字 textsize
private boolean mAlphaEnable = false; // 尺子 最左边 最后边是否需要透明 (透明效果更好点)
private float mTextHeight; //尺子刻度下方数字 的高度
private Paint mTextPaint; // 尺子刻度下方数字( 也就是每隔10个出现的数值) paint
private Paint mLinePaint; // 尺子刻度 paint
private int mTotalLine; //共有多少条 刻度
private int mMaxOffset; //所有刻度 共有多长
private float mOffset; // 默认状态下,mSelectorValue所在的位置 位于尺子总刻度的位置
private int mLastX, mMove;
private OnValueChangeListener mListener; // 滑动后数值回调
private int mLineColor = Color.GRAY; //刻度的颜色
private int mTextColor = Color.BLACK; //文字的颜色
public RulerView(Context context) {
this(context, null);
}
public RulerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RulerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
protected void init(Context context, AttributeSet attrs) {
mScroller = new Scroller(context);
this.mLineSpaceWidth = myfloat(25.0F);
this.mLineWidth = myfloat(2.0F);
this.mLineMaxHeight = myfloat(100.0F);
this.mLineMidHeight = myfloat(60.0F);
this.mLineMinHeight = myfloat(40.0F