package com.mcxtzhang.github.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; /** * 介绍:自定义循环滚动选择View * 作者:zhangxutong * 邮箱:zhangxutong@imcoming.com * 时间: 2016/8/26. */ public class LoopWheelView extends View { private static final String TAG = "zxt/LoopWheelView"; private int unit = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45, getResources().getDisplayMetrics());//每格的宽度 private String[] datas = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14"}; private int mIndex;//当前处于第几个 private Paint mPaint; public LoopWheelView(Context context) { this(context, null); } public LoopWheelView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public LoopWheelView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private int mWidth, mHeight; private void init(Context context) { mPaint = new Paint(); mPaint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢 mIndex = 0; setClickable(true); /* setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIndex++; invalidate(); } });*/ } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; } @Override protected void onDraw(Canvas canvas) { Log.d(TAG, "onDraw() called with: " + "canvas = [" + canvas + "]"); int count = mHeight / unit; if (count % 2 == 0) { count = -1;//如果是偶数,减一成奇数 } float contentHeight = unit * count; float gap = mHeight - contentHeight; setBackgroundColor(Color.WHITE); for (int i = 0; i < count; i++) { //canvas.drawRect(getPaddingLeft(), getPaddingTop() + (gap / 2) + unit * i, width - getPaddingRight(), getPaddingTop() + (gap / 2) + unit * (i + 1), paint); mPaint.setColor(Color.BLACK); if (i == count / 2) { mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 30, getResources().getDisplayMetrics())); } else { mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics())); } Rect bound = new Rect(); mPaint.getTextBounds(datas[(i + mIndex) % datas.length], 0, datas[(i + mIndex) % datas.length].length(), bound); canvas.drawText(datas[(i + mIndex) % datas.length], mWidth / 2 - bound.width() / 2, getPaddingTop() + gap / 2 + unit * i + unit / 2, mPaint); } } private float lastY; @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastY = event.getRawY(); break; case MotionEvent.ACTION_MOVE: scrollBy(0, (int) (lastY - event.getRawY())); lastY = event.getRawY(); break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: break; default: break; } return super.dispatchTouchEvent(event); } }