實(shí)戰(zhàn)
輸入搜索動(dòng)畫
- 利用在線繪制 SVG 圖標(biāo)網(wǎng)站 制作搜索圖標(biāo)
可以自己隨意搗鼓繪制,繪制好了之后點(diǎn)擊視圖->源代碼,將 SVG 代碼復(fù)制出來(lái)保存成 search_svg.xml
- 在線轉(zhuǎn)換 svg2vector
點(diǎn)擊空白或者直接將 SVG 拖拽指定區(qū)域進(jìn)行轉(zhuǎn)換
- 將轉(zhuǎn)換好的 Android 格式的 vector 導(dǎo)入 AS
- 開始制作動(dòng)畫關(guān)聯(lián)
//1.在 /res/aniamator 文件夾下 定義動(dòng)畫
<?xml version="1.0" encoding="utf-8"?><objectAnimator xmlns:android=“http://schemas.android.com/apk/res/android”
android:propertyName=“trimPathStart”
android:valueFrom=“1”
android:valueTo=“0”
android:duration=“2000”
//2. 在/res/drawable/ 定義 vector
<?xml version="1.0" encoding="utf-8"?>
//3. 在/res/drawable/ 關(guān)聯(lián)動(dòng)畫和 vector
<?xml version="1.0" encoding="utf-8"?>- 效果
警車燈閃爍
今日頭條下拉刷新動(dòng)畫
來(lái)一個(gè)復(fù)雜組合動(dòng)畫,請(qǐng)看下面效果圖:
- 準(zhǔn)備 vector 數(shù)據(jù)
- 定義順時(shí)針執(zhí)行動(dòng)畫并做 pathData 變換
這里拿其中一個(gè)位置變化來(lái)舉例說(shuō)明:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android=“http://schemas.android.com/apk/res/android”
android:ordering=“sequentially”>//按順序執(zhí)行
//依次執(zhí)行 pathData 位置變換
<objectAnimator
android:duration=“600”
android:interpolator=“@android:interpolator/decelerate_cubic”
android:propertyName=“pathData”
android:valueFrom="
M100,30
L180,30
M180,30
L180,90
M180,90
L100,90
M100,90
L100,30"
android:valueTo="
M100,120
L180,120
M180,120
L180,180
M180,180
L100,180
M100,180
L100,120"
android:valueType=“pathType” />
<objectAnimator
android:duration=“600”
android:interpolator=“@android:interpolator/decelerate_cubic”
android:propertyName=“pathData”
android:valueFrom="
M100,120
L180,120
M180,120
L180,180
M180,180
L100,180
M100,180
L100,120"
android:valueTo="
M20,120
L100,120
M100,120
L100,180
M100,180
L20,180
M20,180
L20,120"
android:valueType=“pathType” />
<objectAnimator
android:duration=“600”
android:interpolator=“@android:interpolator/decelerate_cubic”
android:propertyName=“pathData”
android:valueFrom="
M20,120
L100,120
M100,120
L100,180
M100,180
L20,180
M20,180
L20,120"
android:valueTo="
M20,30
L100,30
M100,30
L100,90
M100,90
L20,90
M20,90
L20,30"
android:valueType=“pathType” />
如果對(duì)標(biāo)簽中的定義還不了解的先去看下文章中 path 標(biāo)簽
中的說(shuō)明。如果不理解標(biāo)簽意思,根本就看不懂。
- 進(jìn)行關(guān)聯(lián)
<animated-vector xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools=“http://schemas.android.com/tools”
android:drawable=“@drawable/ic_toutiao”
tools:targetApi=“l(fā)ollipop”>
- 代碼控制重復(fù)執(zhí)行
class SVGDemo1Activity : AppCompatActivity() {
var reStartTT = @SuppressLint(“HandlerLeak”)
object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
startAnimatabe(R.drawable.line_animated_toutiao, true)
}
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_svg)
//水滴動(dòng)畫
startWaterDropAnimator.setOnClickListener {
startAnimatabe(R.drawable.line_animated_vector, false)
}
//搜索動(dòng)畫
startSearchAnimator.setOnClickListener {
startAnimatabe(R.drawable.line_animated_search, false)
}
//執(zhí)行警車動(dòng)畫
startPoliceCarAnimator.setOnClickListener {
startAnimatabe(R.drawable.line_animated_car, false)
}
//執(zhí)行頭條動(dòng)畫
startTTAnimator.setOnClickListener {
startAnimatabe(R.drawable.line_animated_toutiao, true)
}
}
private fun startAnimatabe(lineAnimatedVector: Int, isRegister: Boolean): Animatable {
val animatedVectorDrawable = AnimatedVectorDrawableCompat.create(this, lineAnimatedVector)
iv.setImageDrawable(animatedVectorDrawable)
val animatable = iv.drawable as Animatable
animatable.start()
animatedVectorDrawable!!.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable?) {
super.onAnimationEnd(drawable)
if (!isRegister) return
animatedVectorDrawable.unregisterAnimationCallback(this)
//重新開始在 xml 設(shè)置 restart 無(wú)效暫時(shí)用 Handler 實(shí)現(xiàn)了。
reStartTT.sendEmptyMessage(0)
}
})
return animatable
}
}
繪制中國(guó)地圖
該篇之前實(shí)現(xiàn) SVG pathData 都是利用 ImageView 來(lái)實(shí)現(xiàn),并不是所有的場(chǎng)合都適合上面的方式,比如我想要實(shí)現(xiàn) pathData 區(qū)域點(diǎn)擊,那么上面所講的方式應(yīng)該是不能實(shí)現(xiàn),下面我們以一個(gè)實(shí)例來(lái)看怎么自定義 View 實(shí)現(xiàn) PathData 和 pathData 區(qū)域點(diǎn)擊事件。
下面我們利用 path 來(lái)繪制一個(gè)中國(guó)地圖,先來(lái)看一個(gè)最終效果圖,如下:
看起來(lái)是不是很炫,還不錯(cuò),嘿嘿,下面我們就來(lái)看一下如何實(shí)現(xiàn)。
- 準(zhǔn)備地圖 SVG
-
首先去下載地圖數(shù)據(jù)
-
選擇下載免費(fèi)的地圖數(shù)據(jù)
- 找到對(duì)應(yīng)的國(guó)家點(diǎn)擊下載 svg 數(shù)據(jù)
- 選擇對(duì)應(yīng)的地圖數(shù)據(jù),我這里下載的是高質(zhì)量的 SVG
- SVG to Vector xml
將下載好的 china.svg 格式的文件轉(zhuǎn)為 vector 節(jié)點(diǎn)的 xml 數(shù)據(jù) 或者用 AS 自帶轉(zhuǎn)也行,看個(gè)人愛好。
轉(zhuǎn)好之后放入 AS 中,如下所示
現(xiàn)在有了這些數(shù)據(jù),我們就可以解析 xml path
節(jié)點(diǎn),拿到 pathData
數(shù)據(jù)我們不就可以繪制 path 了嘛。下面就開始解析 xml ,解析的方法很多種,我們這里用 dom 解析。
- 開始解析 xml
解析 xml 有很多種方式,這里就直接使用 DOM
解析,pathData2Path 我這里直接用 Android SDK 提供的 android.support.v4.graphics#PathParser
由于源碼中它被標(biāo)注了 hide
屬性 ,我們需要直接將它 copy 到我們自己項(xiàng)目中, 具體轉(zhuǎn)化請(qǐng)看如下代碼:
/**
- 開始解析 xml
*/
public fun dom2xml(stream: InputStream?): MutableList {
mapDataLists.clear()
//dom
val newInstance = DocumentBuilderFactory.newInstance()
val newDocumentBuilder = newInstance.newDocumentBuilder()
//拿到 Docment 對(duì)象
val document = newDocumentBuilder.parse(stream)
//獲取 xml 中屬于 path 節(jié)點(diǎn)的所有信息
val elementsByTagName = document.getElementsByTagName(PATH_TAG)
//定義四個(gè)點(diǎn),確定整個(gè) map 的范圍
var left = -1f
var right = -1f
var top = -1f
var bottom = -1f
//開始遍歷標(biāo)簽,拿到 path 數(shù)據(jù)組
for (pathData in 0 until elementsByTagName.length) {
val item = elementsByTagName.item(pathData) as Element
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)初中級(jí)安卓工程師,想要提升技能,往往是自己摸索成長(zhǎng),但自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年最新Android移動(dòng)開發(fā)全套學(xué)習(xí)資料》送給大家,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
由于文件比較大,這里只是將部分目錄截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻
如果你覺得這些內(nèi)容對(duì)你有幫助,可以添加下面V無(wú)償領(lǐng)取?。▊渥ndroid)
總結(jié)
其實(shí)要輕松掌握很簡(jiǎn)單,要點(diǎn)就兩個(gè):
- 找到一套好的視頻資料,緊跟大牛梳理好的知識(shí)框架進(jìn)行學(xué)習(xí)。
- 多練。 (視頻優(yōu)勢(shì)是互動(dòng)感強(qiáng),容易集中注意力)
你不需要是天才,也不需要具備強(qiáng)悍的天賦,只要做到這兩點(diǎn),短期內(nèi)成功的概率是非常高的。
對(duì)于很多初中級(jí)Android工程師而言,想要提升技能,往往是自己摸索成長(zhǎng),不成體系的學(xué)習(xí)效果低效漫長(zhǎng)且無(wú)助。下面資料部分截圖是我花費(fèi)幾個(gè)月時(shí)間整理的,誠(chéng)意滿滿:特別適合有3-5年開發(fā)經(jīng)驗(yàn)的Android程序員們學(xué)習(xí)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-841694.html
- 自行下載直達(dá)領(lǐng)取鏈接:【點(diǎn)擊我即可獲得!】
- 以上進(jìn)階BATJ大廠學(xué)習(xí)資料可以免費(fèi)分享給大家,需要完整版的朋友,【點(diǎn)這里可以看到全部?jī)?nèi)容】。
- 找到一套好的視頻資料,緊跟大牛梳理好的知識(shí)框架進(jìn)行學(xué)習(xí)。
- 多練。 (視頻優(yōu)勢(shì)是互動(dòng)感強(qiáng),容易集中注意力)
你不需要是天才,也不需要具備強(qiáng)悍的天賦,只要做到這兩點(diǎn),短期內(nèi)成功的概率是非常高的。
對(duì)于很多初中級(jí)Android工程師而言,想要提升技能,往往是自己摸索成長(zhǎng),不成體系的學(xué)習(xí)效果低效漫長(zhǎng)且無(wú)助。下面資料部分截圖是我花費(fèi)幾個(gè)月時(shí)間整理的,誠(chéng)意滿滿:特別適合有3-5年開發(fā)經(jīng)驗(yàn)的Android程序員們學(xué)習(xí)。
- 自行下載直達(dá)領(lǐng)取鏈接:【點(diǎn)擊我即可獲得!】
- 以上進(jìn)階BATJ大廠學(xué)習(xí)資料可以免費(fèi)分享給大家,需要完整版的朋友,【點(diǎn)這里可以看到全部?jī)?nèi)容】。
[外鏈圖片轉(zhuǎn)存中…(img-SsLI5Tmv-1710506193935)]文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-841694.html
到了這里,關(guān)于Android-高級(jí)-UI-進(jìn)階之路-(七)-SVG-基礎(chǔ)使用-+-繪制中國(guó)地圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!