package cn.coolspan.open.myfonttest1;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
/**
* 自定义改变字体的View
* <p/>
* Coolspan on 2016/5/11 10:29
*
* @author 乔晓松 coolspan@sina.cn
*/
public class SlideOptionView extends View {
//是否显示测试log
private static final boolean isShowLog = true;
//小球可点击区域相对于小球多大
private static final float mClickRote = 1.5f;//点击区域是小球的1.5倍,方便触发滑动,提高用户体验
//主要颜色
private static final String main_color = "#28a4ff";
//画笔
private Paint mPaint;
//View的宽度
private float mWidth;
//View的高度
private float mHeight;
//水平横线的相对坐标
private int mCenterY;
//水平横线的左右内边距
private int mPadding;
//水平横线切分的平均值
private int mAverage;
//小竖线的高度
private int mIntervalLineHeight;
//title列表
private List<String> titles;
//字体Rect
private Rect bounds;
//圆球距离左边距的距离
private float mCircleTranslateX = 0;
//Touch事件状态机
private TouchState mTouchState;
//当前小球的位置
private int mCurrentPosition = 0;
//小球的半径
private float mCircleRadius;
//小球滑动的停止位置
float mCircleTargetTranslateX;
//小球滑动方向的状态机
private DirectState mDirectState;
//处理小球滑动的主线程的绘制
private Handler handler;
//滑动的事件监听器
private OnSelectChangeListener mOnselectChangeListener;
public SlideOptionView(Context context) {
super(context);
}
public SlideOptionView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mPaint = new Paint();
this.mPaint.setAntiAlias(true);
this.mPaint.setStyle(Paint.Style.FILL);
this.mPaint.setTextSize(25);
this.bounds = new Rect();
this.mTouchState = new TouchState();
this.mDirectState = new DirectState();
this.titles = new ArrayList<String>() {
{
add("小号");
add("标准");
add("中号");
add("大号");
add("超大");
add("超无霸");
}
};
this.handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
invalidate();
} else if (msg.what == 2) {
if (mOnselectChangeListener != null) {
mOnselectChangeListener.change(mCurrentPosition);
}
}
}
};
}
public SlideOptionView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//未使用测量到的高宽
int widthMeasureSpecModel = MeasureSpec.getMode(widthMeasureSpec);
widthMeasureSpec = MeasureSpec.getSize(widthMeasureSpec);
int heightMeasureSpecModel = MeasureSpec.getMode(heightMeasureSpec);
heightMeasureSpec = MeasureSpec.getSize(heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (changed == true) {
//TODO 设置子View的位置
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
this.mWidth = w;
this.mHeight = h;
this.initData();
}
private void initData() {
this.mCenterY = (int) (this.mHeight / 2);
this.mPadding = (int) (this.mWidth / 10);//这里我设置的左右padding是屏幕的十分之一
this.mAverage = (int) (this.mWidth - 2 * this.mPadding) / (titles.size() - 1);
this.mIntervalLineHeight = this.mAverage / 10;
this.mCircleRadius = this.mIntervalLineHeight * 2;
//设置默认字体大小
this.mPaint.setTextSize(this.mIntervalLineHeight * 2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//水平横线的绘制
mPaint.setColor(Color.parseColor(main_color));
mPaint.setStrokeWidth(this.getResources().getDisplayMetrics().density * 4);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawLine(mPadding, mCenterY, mWidth - mPadding, mCenterY, mPaint);
//绘制横线中间的白色间隔
for (int i = 0; i < titles.size(); i++) {
if (i != 0 || i != titles.size() - 1) {//最左边和最右边的间隔线不绘制
//绘制横线中间的间隔线
mPaint.setStrokeWidth(this.getResources().getDisplayMetrics().density * 2);
mPaint.setColor(Color.WHITE);
canvas.drawLine(mPadding + i * this.mAverage,
mCenterY - this.getResources().getDisplayMetrics().density * 2,
this.mPadding + i * this.mAverage, mCenterY + this.getResources().getDisplayMetrics().density * 2, this.mPaint);
}
//绘制间隔线上方的字体
String title = this.titles.get(i);
mPaint.getTextBounds(title, 0, title.length(), bounds);
mPaint.setColor(Color.parseColor(main_color));
canvas.drawText(title, mPadding + i * this.mAverage - bounds.width() / 2, mCenterY - this.mIntervalLineHeight - bounds.height() / 2 - bounds.height(), mPaint);
}
//绘制滑动的白色圆
mPaint.setStrokeWidth(this.getResources().getDisplayMetrics().density * 1);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.WHITE);
canvas.drawCircle(this.mPadding + mCircleTranslateX, mCenterY, (float) (2 * mIntervalLineHeight), mPaint);
//绘制滑动的白色圆的灰色边
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(Color.parseColor(main_color));
mPaint.setColor(Color.parseColor("#35000000"));
canvas.drawCircle(this.mPadding + mCircleTranslateX, mCenterY, this.mCircleRadius, mPaint);
}
/**
* Touch事件中使用到的状态机
*/
private class TouchState {
public int None = 0, Down = 1, Move = 2, Up = 0, Single = 3;
public int state;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// log(event.getX() + "---" + event.getY());
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mTouchState.state == mTouchState.None) {
float x = event.getX();
float y = event.getY();
//判断是否点击到小球所在区域内
for (int i = 0; i < titles.size(); i++) {
if (x > mPadding + i * this.mAverage - mCircleRadius * mClickRote &&
x < mPadding + i * this.mAverage + mCircleRadius * mClickRote &&
y > mCenterY - mCircleRadius * mClickRote &&
y < mCen