用 Kotlin 開發(fā) Android 項目是一種什么樣的感受埋酬?(用 DSL 配置自定義 view)

前言

離上一篇文章已經(jīng)過去了挺長時間哨啃,在這期間發(fā)生了不少事烧栋,比如 Kotlin 火了,比如作者我要回老家領(lǐng)證了2333拳球。

關(guān)于 Kotlin 火了這事审姓,我一直覺得這是一門很棒的語言,不火也是祝峻。但是既然現(xiàn)在 google 都為它開路了魔吐,那么想來今后的發(fā)展應(yīng)該會很不錯。

鑒于 Kotlin 已紅遍大江南北莱找,類似的文章現(xiàn)在也如雨后春筍層出不窮酬姆,作者原來的標(biāo)題【用 Kotlin 開發(fā) Android 是一種什么樣的感受?】似乎也不那么好使了奥溺,畢竟很多 Android 開發(fā)者都已經(jīng)開始在嘗試轴踱,有的也許淺嘗輒止,有的也許會深入的使用下去谚赎,但終究在這個時間段再寫一些很基礎(chǔ)的語法文章淫僻,我個人感覺意義不大了。

最近我在用 Kotlin 做一個挺有意思的開源項目壶唤,雖然完成度還很低雳灵,但也勉強(qiáng)算是五臟俱全。這篇文章就當(dāng)做是一個引子闸盔,來介紹介紹我這個小項目悯辙,順便讓初學(xué) Kotlin 的各位了解一下,用這么一門語言迎吵,你能做出什么東西來躲撰。

DSL

應(yīng)該有不少小伙伴做過自定義 view,也知道在 Android 中自定義 view 大致分為兩種:

1.繼承于 ViewGroup击费,將多個 view 組合在一起而形成
2.繼承于 View拢蛋,在 canvas(畫布)上通過相應(yīng) API 繪制而成

因?yàn)樯蠔|家的各種奇葩需求,本人算是飽受 CustomView Hell 的摧殘蔫巩,也明白兩種方案各有適用的場合谆棱。方案1 相對來說還比較容易上手,基本會布局就會寫圆仔,而方案2 則需要一定的學(xué)習(xí)成本垃瞧,也需要一定的經(jīng)驗(yàn)去處理遇到的各式問題,最后的最后坪郭,是寫起來比較繁雜个从。那么有沒有什么辦法可以讓 canvas 繪制變得更輕松呢?

在接觸過 anko 之后,我才發(fā)現(xiàn)原來用代碼布局也可以那么優(yōu)雅那么簡單嗦锐。這里不是在給 anko 打廣告(吃瓜群眾:你口是心非)鸵隧,而是想介紹用 anko 布局時的寫法:

verticalLayout {
    textView {
        text = "隨便寫點(diǎn)啥"
        textSize = 20f
    }

    imageView {
        imageResource = R.mipmap.ic_launcher
    }
}

諸如此類代碼,大家應(yīng)該都很眼熟:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

沒錯意推,anko 布局和 gradle 的語法很像豆瘫,除去少量差別,你甚至?xí)X得這就是同一種語言菊值。這就是我要給大家介紹的 <b>領(lǐng)域特定語言(domain-specific languages外驱,簡稱 DSL)</b>

MagicPen

MagicPen 是我發(fā)起的一個用 Kotlin 編寫的用于操作 canvas 來自定義 view 的開源項目。似乎這么說有點(diǎn)模糊腻窒?那我們直接上代碼和圖吧

package com.lab.zhangll.magicpen

import android.graphics.Color
import android.graphics.Paint
import android.graphics.PointF
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.lab.zhangll.magicpen.lib.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(
                magicPen {
                    val line = line {
                        start = PointF(0f, 1000f) // 線條起點(diǎn)
                        end = PointF(1000f, 1000f) // 線條終點(diǎn)
                    }

                    val bigOne = circle {
                        radius = 200f // 圓半徑

                        aboveOf(line) // 在線條上面
                        leftMargin = 500f // 左邊距
                        bottomMargin = 10f // 下邊距

                        paint = Paint().apply { color = Color.RED } // 紅色
                    }

                    text {
                        content = "我是一只小小鳥"
                        paint = Paint().apply { textSize = 40f }
                        centerIn(bigOne)
                    }

                    circle {
                        radius = 50f // 半徑
                        centerIn(bigOne) // 在大圓中間

                        gesture {
                            onClick = { Toast.makeText(this@MainActivity, "clicked", Toast.LENGTH_SHORT).show() } // 點(diǎn)擊時彈框
                            onDragBy = { x, y -> moveBy(x, y) } // 跟著拖動的手指動
                            onRelease = { smoothMoveToOrigin() } // 放手后滑動到原點(diǎn)
                        }
                    }
                }
        )
    }
}

算上package昵宇、import 和我有意識的空行,一共50行代碼儿子,我們看看它能實(shí)現(xiàn)出什么樣的效果吧

magicPen.gif

相信圖文結(jié)合在一起瓦哎,再加上代碼中的注釋,大家能很輕松的看明白柔逼。我像布局似的就做出了這么一個 view蒋譬。包括線條、圓愉适、文字三種圖形犯助;也包括絕對位置、相對關(guān)系维咸;甚至還有點(diǎn)擊事件剂买、拖拽事件和平滑移動動畫。挺精簡的對吧癌蓖?

可惜的是瞬哼,目前支持的功能也就這么多了,畢竟這個項目才啟動沒多長時間租副,還有兩個有意的小伙伴也得在過一段時間之后才能學(xué)習(xí) Kotlin 并加入這個項目的開發(fā)工作坐慰。不過在不久之后,MagicPen 將可以用來創(chuàng)建我能想到的大量自定義 view附井,請拭目以待讨越。

項目源碼在 https://github.com/neverwoodsS/MagicPen
歡迎各位圍觀與提出不足

PS.這是在下作為單身青年的最后一篇文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市永毅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌人弓,老刑警劉巖沼死,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異崔赌,居然都是意外死亡意蛀,警方通過查閱死者的電腦和手機(jī)耸别,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來县钥,“玉大人秀姐,你說我怎么就攤上這事∪糁” “怎么了省有?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谴麦。 經(jīng)常有香客問我蠢沿,道長,這世上最難降的妖魔是什么匾效? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任舷蟀,我火速辦了婚禮,結(jié)果婚禮上面哼,老公的妹妹穿的比我還像新娘野宜。我一直安慰自己,他們只是感情好魔策,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布速缨。 她就那樣靜靜地躺著,像睡著了一般代乃。 火紅的嫁衣襯著肌膚如雪旬牲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天搁吓,我揣著相機(jī)與錄音原茅,去河邊找鬼。 笑死堕仔,一個胖子當(dāng)著我的面吹牛擂橘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摩骨,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼通贞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恼五?” 一聲冷哼從身側(cè)響起昌罩,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灾馒,沒想到半個月后茎用,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年轨功,在試婚紗的時候發(fā)現(xiàn)自己被綠了旭斥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡古涧,死狀恐怖垂券,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羡滑,我是刑警寧澤菇爪,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站啄栓,受9級特大地震影響娄帖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昙楚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一近速、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧堪旧,春花似錦削葱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爆袍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陨囊,已是汗流浹背弦疮。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工蜘醋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人压语。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓啸罢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胎食。 傳聞我的和親對象是個殘疾皇子扰才,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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