利用canvas实现分隔虚线(自定义view)

本文介绍如何在Android中通过自定义View利用canvas绘制虚线分隔线。虽然通常分隔线广泛应用于APP,但虚线因其视觉效果更佳而受到青睐。文章主要聚焦于canvas的画布操作,未涉及自定义View的style.xml配置。提供的Java源码展示了自定义View的基本结构和虚线绘制的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前的app中,分隔线较为广泛使用,虚线的视觉效果又要优于实现,起始虚线的制作也很简单,只需要实现自定义view的基本步骤即可,本文只是侧重在画布canvas上实现虚线,所以省略了自定义view的style.xml实现。现在贴出java源码:
`package com.example.customviewdemo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
* Created by thompson on 16-11-7.
*/

public class MyView extends View {
private int defaultSize;
private int width;
private int height;

public MyView(Context context) {
    this(context,null);
}

public MyView(Context context, AttributeSet attrs) 
{
    super(context, attrs);
    defaultSize=100;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
    int width = getSize(widthMeasureSpec);
    int height = getSize(heightMeasureSpec);

    setMeasuredDimension(width, height);
}
//由于directionMeasureSpec包含测量模式和测量长度,所以这里进行提炼封装
private int getSize(int measureSpec) {
    int defaultNum = defaultSize;
    int mode = MeasureSpec.getMode(measureSpec);
    int size = MeasureSpec.getSize(measureSpec);
    switch(mode){
        case MeasureSpec.UNSPECIFIED:
            defaultNum = defaultSize;
            break;
        case MeasureSpec.AT_MOST:
        case MeasureSpec.EXACTLY:
            defaultNum = size;
            break;
    }
    return defaultNum;
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    width = w;
    height = h;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    //画笔设置
    Paint paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(2);
    paint.setColor(Color.BLUE);

    //步进数字18为线段长+俩线段间隔
    for(int i=0;i<width;i+=18){
        //drawLine(startPointX,startPointY,endPointX,endPointY,paint)
        //因为分隔线为水平方向所以起始点和终止点的Y值相等,X值相减=10为线段长度
        canvas.drawLine(i, 100, i + 10, 100, paint);
    }
}

}
`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值