package qgl.customview.MoveNumberView;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.widget.Scroller;
/**
* Created by qgl on 16/8/12.
*/
public class MoveNumberView extends View {
private Paint mLinePaint;
private Paint mValuePaint;
private Paint mVerticalPaint;
private Paint mtextPaint;
private VelocityTracker mVelocityTracker;
private Scroller mScroller;
private static final int mDefaultValue = 150;
private static final int mDefaultDistance = 13;
private int mMoveX,mLastMoveX;
private boolean mIsDrawText;
private int mLastX;
private int mLastCurrentMoveX;
private boolean mIsLeft;
private int mStartY;
private int mWidth;
public MoveNumberView(Context context) {
this(context,null);
}
public MoveNumberView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MoveNumberView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public void init(Context context){
mScroller = new Scroller(context);
mLinePaint = new Paint();
mLinePaint.setAntiAlias(true);
mLinePaint.setStyle(Paint.Style.STROKE);
mLinePaint.setStrokeWidth(2);
mLinePaint.setColor(0xff999999);
mVerticalPaint = new Paint();
mVerticalPaint.setAntiAlias(true);
mVerticalPaint.setStyle(Paint.Style.STROKE);
mVerticalPaint.setStrokeWidth(2);
mVerticalPaint.setColor(0xff999999);
mtextPaint = new Paint();
mtextPaint.setAntiAlias(true);
mtextPaint.setStyle(Paint.Style.STROKE);
mtextPaint.setStrokeWidth(2);
mtextPaint.setColor(0xff999999);
mtextPaint.setTextAlign(Paint.Align.CENTER);
mValuePaint = new Paint();
mValuePaint.setAntiAlias(true);
mValuePaint.setStyle(Paint.Style.STROKE);
mValuePaint.setStrokeWidth(3);
mValuePaint.setColor(0xfffe7f1a);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
initSize();
}
private void initSize() {
mStartY = getHeight() / 2;
mWidth = getWidth();
}
private int measureWidth(int widthMeasureSpec){
int mode = MeasureSpec.getMode(widthMeasureSpec);
int size = MeasureSpec.getSize(widthMeasureSpec);
if(mode == MeasureSpec.AT_MOST){
return Math.min(size,Integer.MAX_VALUE);
}
return size;
}
private int measureHeight(int heightMeasureSpec){
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec);
if(mode == MeasureSpec.AT_MOST){
return Math.min(size,mDefaultValue);
}
return size;
}
@Override
protected void onDraw(Canvas canvas) {
//画底部的一条直线
canvas.drawLine(0,mStartY,mWidth,mStartY,mLinePaint);
//画中间的那条竖线
canvas.drawLine(mWidth/2,mStartY,mWidth/2,0,mValuePaint);
if(moveNumberListener != null){
moveNumberListener.getValue((-mLastMoveX + mWidth/2 + 7) / mDefaultDistance);
}
for (int start = 0; start < mWidth; start++) {
int top = mStartY - 10;//1-9刻度
int moveDistance = -mLastMoveX + start;
if(moveDistance % (mDefaultDistance * 10) == 0){
top -= 20;//10刻度 高一点
mIsDrawText = true;
}else {
mIsDrawText = false;
}
if(moveDistance % mDefaultDistance == 0){
if(moveDistance >= 0 && moveDistance <= 20000 * mDefaultDistance){
canvas.drawLine(start,mStartY,start,top,mVerticalPaint);
if(mIsDrawText){
canvas.drawText(moveDistance / mDefaultDistance + "",start,top - 8,mtextPaint);
}
}
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mVelocityTracker == null){
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
mLastX = (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
mMoveX = (int)(event.getX() - mLastX);
if(mLastCurrentMoveX == mMoveX){
return true;
}
mLastMoveX +=mMoveX;
if(mMoveX < 0){
//像左滑动
mIsLeft = true;
if(-mLastMoveX + mWidth / 2 > 20000 * mDefaultDistance){
mLastMoveX -=mMoveX;
return true;
}
}else {
//像右滑动
mIsLeft = false;
if(mLastMoveX > mWidth / 2){
mLastMoveX -= mMoveX;
return true;
}
}
mLastCurrentMoveX = mMoveX;
mLastX = (int)event.getX();
invalidate();
break;
case MotionEvent.ACTION_UP:
mVelocityTracker.computeCurrentVelocity(1000);
float xVelocity = mVelocityTracker.getXVelocity();
float yVelocity = mVelocityTracker.getYVelocity();
if(Math.abs(xVelocity) < 800){
return true;
}
mScroller.fling(130,mStartY,(int)(-Math.abs(xVelocity) + 0.5),(int)(Math.abs(yVelocity) + 0.5),0,10080,0,1920);
mVelocityTracker.recycle();
mVelocityTracker = null;
break;
}
return true;
}
@Override
public void computeScroll() {
if(mScroller.computeScrollOffset()){
int currX = mScroller.getCurrX();
if(mIsLeft){
mLastMoveX -= currX;
}else {
mLastMoveX += currX;
}
//向右滑动
if(mLastMoveX > mWidth / 2){
mLastMoveX -= currX;
return;
}
//向左滑动
if(-mLastMoveX + mWidth / 2 > 20000 * mDefaultDistance){
mLastMoveX -= mMoveX;
return;
}
invalidate();
}
}
public interface MoveNumberListener {
void getValue(int value);
}
private MoveNumberListener moveNumberListener;
public void setMoveNumberListener(MoveNumberListener moveNumberListener){
this.moveNumberListener = moveNumberListener;
}
}
MoveNumberView moveNumberView = (MoveNumberView) findViewById(R.id.moveMoney);
final TextView tv = (TextView) findViewById(R.id.tv);
moveNumberView.setMoveNumberListener(new MoveNumberView.MoveNumberListener() {
@Override
public void getValue(int value) {
tv.setText(value + "");
}
});