Android繪制豎直虛線完美解決方案—自定義View

Android繪制豎直虛線完美解決方案—自定義View

開發(fā)中我們經(jīng)常會遇到繪制虛線的需求,一般我們使用一個drawable文件即可實現(xiàn)浩考,下面我會先列舉常規(guī)drawable文件的實現(xiàn)方式。

使用drawable繪制水平虛線

水平方向的虛線最好繪制挖滤,drawable文件如下所示:

drawable/imaginary_line.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">

    <stroke
        android:width="1dp"
        android:color="#000"
        android:dashWidth="5dp"
        android:dashGap="2dp" />

</shape>

在布局中使用如下:

<!-- 這里的高度必須大于drawable中設(shè)置的虛線寬度 -->
<View
    android:layout_width="match_parent"
    android:layout_height="2dp"
    android:layout_marginTop="50dp"
    android:background="@drawable/imaginary_line"
    android:layerType="software" />

這里我們需要注意一下幾點,第一最好設(shè)置android:layerType="software"屬性冀自,第二View的高度拇惋,最好大于drawable中設(shè)置的虛線高度秤涩。不然都可能導(dǎo)致虛線不顯示。

使用drawable繪制豎直方向虛線

與水平方向虛線相比捡多,豎直方向虛線就麻煩的多了蓖康,而且有很多缺陷铐炫。

drawable代碼如下所示:

drawable/vertical_imaginary_line.xml:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="90"
    android:toDegrees="90">
    <shape android:shape="line">
        <stroke
            android:width="1dp"
            android:color="#000"
            android:dashWidth="5dp"
            android:dashGap="2dp" />
    </shape>
</rotate>

可以看出,實質(zhì)上是通過View動畫钓瞭,對水平方向的View進行了旋轉(zhuǎn)操作驳遵。

具體使用如下:跟水平方向使用方式一樣。

 <View
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_alignParentRight="true"
    android:background="@drawable/vertical_imaginary_line"
    android:layerType="software" />

因為View是先繪制水平方向的虛線山涡,然后進行旋轉(zhuǎn)堤结,所以豎直虛線默認就會有偏移量,我們需要手動的去調(diào)整位置鸭丛。

實現(xiàn)效果如下所示:

image

單個虛線還好說竞穷,如果需要繪制圖表的網(wǎng)格線之類的需求,那就要欲哭無淚了鳞溉。

自定義DividerView

接下來祭出我們的大殺器自定義View瘾带。

先定義下需求,我們的虛線需要支持自定義背景色熟菲,支持自定義虛線寬度看政,支持水平和豎直方向,支持虛線的dash寬度和dash間隔抄罕,所以我們的自定義屬性就如下所示:

attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- 垂直方向的虛線 -->
    <declare-styleable name="DividerView">
        <!-- 虛線顏色 -->
        <attr name="divider_line_color" format="color"/>
        <!-- 虛線寬度 -->
        <attr name="dashThickness" format="dimension"/>
        <!-- 虛線dash寬度 -->
        <attr name="dashLength" format="dimension"/>
        <!-- 虛線dash間隔 -->
        <attr name="dashGap" format="dimension"/>
        <!-- 虛線朝向 -->
        <attr name="divider_orientation" format="enum">
            <enum name="horizontal" value="0"/>
            <enum name="vertical" value="1"/>
        </attr>
    </declare-styleable>
</resources>

接下來我們看下DividerView的具體實現(xiàn):
自定義View的第一步允蚣,通常是獲取自定義的屬性值,具體如下所示:

public DividerView(Context context, AttributeSet attrs) {
    super(context, attrs);
    int dashGap, dashLength, dashThickness;
    int color;

    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DividerView, 0, 0);

    try {
        dashGap = a.getDimensionPixelSize(R.styleable.DividerView_dashGap, 5);
        dashLength = a.getDimensionPixelSize(R.styleable.DividerView_dashLength, 5);
        dashThickness = a.getDimensionPixelSize(R.styleable.DividerView_dashThickness, 3);
        color = a.getColor(R.styleable.DividerView_divider_line_color, 0xff000000);
        orientation = a.getInt(R.styleable.DividerView_divider_orientation, ORIENTATION_HORIZONTAL);
    } finally {
        a.recycle();
    }

    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setColor(color);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(dashThickness);
    mPaint.setPathEffect(new DashPathEffect(new float[]{dashGap, dashLength,}, 0));
}

我們通過TypedArray獲取到我們設(shè)置的自定義屬性值呆贿,并給各個屬性設(shè)置默認值嚷兔;接著初始化我們的畫筆paint。

初始化工作完畢后做入,就是繪制工作了冒晰,代碼如下所示:

@Override
protected void onDraw(Canvas canvas) {
    if (orientation == ORIENTATION_HORIZONTAL) {
        float center = getHeight() * 0.5f;
        canvas.drawLine(0, center, getWidth(), center, mPaint);
    } else {
        float center = getWidth() * 0.5f;
        canvas.drawLine(center, 0, center, getHeight(), mPaint);
    }
}

具體使用如下所示:

橫向虛線:

<com.tinytongtong.dividerviewdemo.DividerView
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_marginTop="50dp"
    android:layerType="software"
    custom:dashGap="4dp"
    custom:dashLength="1dp"
    custom:dashThickness="1dp"
    custom:divider_line_color="#ef5350"
    custom:divider_orientation="horizontal" />

豎向虛線:

<com.tinytongtong.dividerviewdemo.DividerView
    android:layout_width="1dp"
    android:layout_height="match_parent"
    android:layout_alignParentRight="true"
    android:layout_marginRight="50dp"
    android:layerType="software"
    custom:dashGap="4dp"
    custom:dashLength="1dp"
    custom:dashThickness="1dp"
    custom:divider_line_color="#ef5350"
    custom:divider_orientation="vertical" />

效果圖如下所示:

image

DividerView項目地址

參考:
Android豎虛線繪制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市竟块,隨后出現(xiàn)的幾起案子壶运,更是在濱河造成了極大的恐慌,老刑警劉巖浪秘,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前弯,死亡現(xiàn)場離奇詭異,居然都是意外死亡秫逝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門询枚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來违帆,“玉大人,你說我怎么就攤上這事金蜀∷⒑螅” “怎么了的畴?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尝胆。 經(jīng)常有香客問我丧裁,道長,這世上最難降的妖魔是什么含衔? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任煎娇,我火速辦了婚禮,結(jié)果婚禮上贪染,老公的妹妹穿的比我還像新娘缓呛。我一直安慰自己,他們只是感情好杭隙,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布哟绊。 她就那樣靜靜地躺著,像睡著了一般痰憎。 火紅的嫁衣襯著肌膚如雪票髓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天铣耘,我揣著相機與錄音洽沟,去河邊找鬼。 笑死涡拘,一個胖子當著我的面吹牛玲躯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳄乏,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼跷车,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了橱野?” 一聲冷哼從身側(cè)響起朽缴,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎水援,沒想到半個月后密强,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蜗元,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年或渤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奕扣。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡薪鹦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情池磁,我是刑警寧澤奔害,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站地熄,受9級特大地震影響华临,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜端考,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一雅潭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跛梗,春花似錦寻馏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至漾岳,卻和暖如春轰绵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尼荆。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工左腔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捅儒。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓液样,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巧还。 傳聞我的和親對象是個殘疾皇子鞭莽,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容