开头
最近比较闲,花了点时间写了个直尺的控件,先来看下效果
项目地址
思路
这个控件整体分为上下两个部分,上面用来显示当前的刻度数,下面则是尺子,重头戏主要在下面的尺子部分;尺子部分主要包含了尺子和指针,尺子的绘制我们只需要知道尺子左侧的坐标和尺子刻度的宽度便可以将尺子绘制出来,当然这里需要指定下最大刻度,而指针则是在控件的中心,这个是固定不变的,尺子的移动是通过改变尺子左侧的坐标实现的,而当前的刻度则是通过指针和尺子左侧的距离除以刻度宽度计算得来的,大体的思路便是这样,当然这其中还有一些细节需要处理,指针需要指在刻度线上,惯性滑动的处理等等。具体代码如下
package com.czy.attar;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.animation.Interpolator;
import android.widget.OverScroller;
import java.text.DecimalFormat;
/**
* Created by Administrator on 2019/5/28.
*/
public class RuleView extends View {
//显示部分的背景色
private int colorhigh = Color.WHITE;
//尺子部分的背景色
private int colorlow = Color.parseColor("#48D1CC");
//当前刻度的颜色
private int colormark = Color.RED;
//刻度文字颜色
private int colortrule = Color.BLACK;
//当前刻度文字颜色
private int colorRulemark = Color.GREEN;
//尺子背景色
private int colorRule = Color.parseColor("#20B2AA");
//画笔
private Paint highPaint;
private Paint lowPaint;
private Paint markTPaint;
private Paint ruleTPaint;
private Paint ruleMarkPaint;
private Paint rulePaint;
private Paint unitPaint;
//刻度数
private int maxdegreeCount ;
//一刻度的宽度
private int degreewidth;
//文字大小(像素)
private int textsize;
//刻度文字大小
private int ruletextsize;
//指针的X坐标
private float markX;
//尺子左侧初始的坐标
private float ruleLeft;
//尺子相对指针的偏移值,ruleLeft +offset 是尺子左侧的X坐标
private float offset = 0;
//单位
private String unit;
private int unitsize;
//手势
private GestureDetector gestureDetector;
private VelocityTracker velocityTracker;
//绘制是否完成
boolean isDrawed;
public RuleView(Context context) {
this(context, null);
}
public RuleView(Context context, @Nullable Attribut