UI之直尺

本文介绍了如何创建一个直尺UI控件,包括上下两部分,上部显示刻度数,下部为尺子。重点在于尺子部分的绘制,通过指定左侧坐标和刻度宽度完成尺子绘制,指针位于中心,移动通过改变尺子左侧坐标实现,刻度值由指针与尺子左侧距离计算得出。文章还提到一些细节处理,如指针对齐刻度线和惯性滑动等。
摘要由CSDN通过智能技术生成

开头

最近比较闲,花了点时间写了个直尺的控件,先来看下效果
在这里插入图片描述
项目地址

思路

这个控件整体分为上下两个部分,上面用来显示当前的刻度数,下面则是尺子,重头戏主要在下面的尺子部分;尺子部分主要包含了尺子和指针,尺子的绘制我们只需要知道尺子左侧的坐标和尺子刻度的宽度便可以将尺子绘制出来,当然这里需要指定下最大刻度,而指针则是在控件的中心,这个是固定不变的,尺子的移动是通过改变尺子左侧的坐标实现的,而当前的刻度则是通过指针和尺子左侧的距离除以刻度宽度计算得来的,大体的思路便是这样,当然这其中还有一些细节需要处理,指针需要指在刻度线上,惯性滑动的处理等等。具体代码如下

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值