数字滑动






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 + "");
      }
});


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值