這15個Android開源庫,只有經(jīng)常逛Github的才知道受神!

哈嘍蝎抽,大家好,我是西哥路克!

又到了大家最喜歡了的環(huán)節(jié)--開源庫推薦樟结,前面為大家推薦了我收藏的一些非常酷的開源庫精算,受到大家一致好評瓢宦,還沒看過的,請移步至:

【Android珍藏】推薦10個炫酷的開源庫

【開源推薦】進階實戰(zhàn)灰羽,從一款音樂播放器開始

【2020年GitHub 上那些優(yōu)秀Android開源庫驮履,這里是Top10!】

本期又為大家?guī)砹四男┯腥さ膸炷亓溃勘酒跒榇蠹揖x了15個有趣又有用的開源玫镐,排名不分先后,一起來看看吧怠噪!

1. Coil

image

Coil是Android上的一個全新的圖片加載框架恐似,它的全名叫做coroutine image loader,即協(xié)程圖片加載庫。與傳統(tǒng)的圖片加載庫Glide傍念,Picasso或Fresco等相比矫夷。該具有輕量(只有大約1500個方法)、快憋槐、易于使用双藕、更現(xiàn)代的API等優(yōu)勢。

它支持GIF和SVG阳仔,并且可以執(zhí)行四個默認轉(zhuǎn)換:模糊忧陪,圓形裁剪灰度圓角

示例如下:

imageView.load(“https://www.example.com/image.jpg") {
 crossfade(true)
 placeholder(R.drawable.image)
 transformations(CircleCropTransformation())
}

并且是全用Kotlin編寫嘶摊,如果你是純Kotlin項目的話延蟹,那么這個庫應(yīng)該是你的首選。

Github地址:https://github.com/coil-kt/coil

2. MultiSearchView

image

該庫具有一個非掣洌酷的Search View動畫等孵!

使用非常簡單稚照,并且可以自定義蹂空,你可以在在styles.xml下添加自定義樣式。

示例代碼:

<com.iammert.library.ui.multisearchviewlib.MultiSearchView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>     
multiSearchView.setSearchViewListener(object : MultiSearchView.MultiSearchViewListener{
    override fun onItemSelected(index: Int, s: CharSequence) {
    }

    override fun onTextChanged(index: Int, s: CharSequence) {
    }

    override fun onSearchComplete(index: Int, s: CharSequence) {
    }

    override fun onSearchItemRemoved(index: Int) {
    }

})

自定義樣式:

  <!-- Search Text Style. -->
    <style name="SearchTextStyle">
        <!-- Custom values write to here for SearchEditText. -->
        <item name="android:focusable">true</item>
        <item name="android:focusableInTouchMode">true</item>
        <item name="android:enabled">true</item>
        <item name="android:hint">Search</item>
        <item name="android:imeOptions">actionSearch</item>
        <item name="android:textSize">18sp</item>
        <item name="android:maxLength">15</item>
        <item name="android:inputType">textCapSentences</item>
        <item name="android:textColorHint">#80999999</item>
        <item name="android:textColor">#000</item>
    </style>

然后果录,您應(yīng)該將樣式設(shè)置為MultiSearchView下的app:searchTextStyle上枕。

Github地址:https://github.com/iammert/MultiSearchView

3. CalendarView

image

CalendarView是一個高度可定制化的日歷組件庫,用recycleView實現(xiàn)弱恒。

它有如下特性:

  • 單一或范圍選擇
  • 周歷或者月歷模式
  • 邊界日期
  • 自定義日歷視圖
  • 水平或者垂直滾動模式
  • 完全可定制的視圖

該庫的文檔也非常全面辨萍,并包含許多示例。此外返弹,還有一個示例應(yīng)用程序展示了庫的所有功能锈玉。

它是用純Kotlin編寫的,并在MIT許可下發(fā)布义起。如果您需要在應(yīng)用程序中使用日歷視圖拉背,這是一個不錯的選擇。

注意:該庫通過Java 8+ API使用了java.time類默终,以便向后兼容椅棺,因為這些類是在Java 8中添加的。

因此齐蔽,需要在app的build.gradle 中添加如下配置:

android {
  defaultConfig {
    // Required ONLY when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:<latest-version>'
}

Github: https://github.com/kizitonwose/CalendarView

4. Bubble Navigation

FloatingTopBarActivity TopBarActivity
image
image
BottomBarActivity EqualBottomBarActivity
image
image

Bubble Navigation是一個輕巧的庫两疚,可通過大量自定義選項輕松制作精美的導(dǎo)航欄。

它有很多非常的特性:

  • 針對不同用例的兩種類型的NavigationViews

    • BubbleNavigationConstraintView(支持spreadspread含滴,inside, 和 packed莫斯)

    • BubbleNavigationLinearView(允許平均分配诱渤,使用權(quán)重或packed模式)

  • 高度可定制化

  • 您可以添加小紅點,它具有BubbleToggleView來創(chuàng)建新的UI組件谈况,而不僅僅是導(dǎo)航

示例:

<com.gauravk.bubblenavigation.BubbleNavigationConstraintView
        android:id="@+id/top_navigation_constraint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="380dp"
        android:background="@color/white"
        android:elevation="4dp"
        android:padding="12dp"
        app:bnc_mode="spread">

        <com.gauravk.bubblenavigation.BubbleToggleView
            android:id="@+id/c_item_rest"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:bt_active="true"
            app:bt_colorActive="@color/search_active"
            app:bt_colorInactive="@color/search_inactive"
            app:bt_icon="@drawable/ic_restaurant"
            app:bt_shape="@drawable/transition_background_drawable_restaurant"
            app:bt_title="@string/restaurant"
            app:bt_padding="@dimen/internal_padding"
            app:bt_titlePadding="@dimen/title_padding" />

         <!-- Add more child items here - max upto 5 -->
    
    </com.gauravk.bubblenavigation.BubbleNavigationConstraintView>

Github文檔很完善源哩,有很多示例,更多用法和屬性可去Github了解鸦做。

Github:https://github.com/gauravk95/bubble-navigation

5. FabFilter

image

這是一個有趣的項目励烦,它不是一個直接可用的庫,而是一個示例應(yīng)用程序泼诱,展示了使用不使用 MotionLayout兩種方式來實現(xiàn)的高級UI動畫坛掠。

詳細的實現(xiàn)細節(jié)可以看看Medium上的系列文章:

“Complex UI/Animations on Android”

“Complex UI/Animations on Android — featuring MotionLayout”

Github:https://github.com/nikhilpanju/FabFilter

6.android-showcase

image

android-showcase是一個非常優(yōu)秀的開源項目,它是一個展示應(yīng)用程序,展示了如何使用Kotlin和最新的Jetpack 技術(shù)棧來開發(fā)一個APP屉栓。

該項目為您帶來了一系列最佳實踐舷蒲,工具和解決方案:

  • 100% Kotlin
  • 現(xiàn)代架構(gòu) (feature modules, clean architecture, Model-View-ViewModel, Model-View-Intent)
  • Android Jetpack組件
  • 單Activity模式,使用Navigation導(dǎo)航

看完這個項目友多,在模塊化牲平,Clean體系結(jié)構(gòu),測試域滥、設(shè)置CI / CD工具纵柿,等方面,你將會受到啟發(fā)启绰。感謝作者的開源昂儒。

Github:https://github.com/igorwojda/android-showcase

7. Croppy

[圖片上傳失敗...(image-cf4104-1596436309874)]

Croppy是一個Android圖片裁剪庫。

它有很多強大的特性:

  • 雙指縮放
  • 裁剪任意大小
  • 按照長寬比例裁剪
  • 顯示裁剪后的Bitmap
  • 自動居中裁剪
  • 全面的動畫使用體驗

更多使用細節(jié)請看Github委可。

Github: https://github.com/lyrebirdstudio/Croppy

8. RubberPicker

image

一個炫酷的渊跋、有趣的SeekBar動畫庫。

RubberPicker庫包含RubberSeekBarRubberRangePicker着倾,其靈感來自CubertoiOS橡膠范圍選擇器拾酝。

使用示例:

布局文件中配置

<com.jem.rubberpicker.RubberSeekBar
  ...
  app:minValue="20"
  app:maxValue="80"
  app:elasticBehavior="cubic"
  app:dampingRatio="0.3"
  app:stiffness="300"
  app:stretchRange="24dp"
  app:defaultThumbRadius="16dp"
  app:normalTrackWidth="4dp"
  app:highlightTrackWidth="8dp"
  app:normalTrackColor="#AAAAAA"
  app:highlightTrackColor="#BA1F33"
  app:defaultThumbInsideColor="#FFF"
  app:highlightDefaultThumbOnTouchColor="#CD5D67"/>

<!-- Similar attributes can be applied for RubberRangePicker as well-->
<com.jem.rubberpicker.RubberRangePicker
  ...
  app:minValue="0"
  app:maxValue="100"
  app:elasticBehavior="linear"
  app:dampingRatio="0.4"
  app:stiffness="400"
  app:stretchRange="36dp"
  app:defaultThumbRadius="16dp"
  app:normalTrackWidth="4dp"
  app:highlightTrackWidth="8dp"
  app:normalTrackColor="#AAAAAA"
  app:highlightTrackColor="#BA1F33"
  app:defaultThumbInsideColor="#CFCD5D67"
  app:highlightDefaultThumbOnTouchColor="#CD5D67"/>

或者,在代碼中動態(tài)配置:

val rubberSeekBar = RubberSeekBar(this)
rubberSeekBar.setMin(20)
rubberSeekBar.setMax(80)
rubberSeekBar.setElasticBehavior(ElasticBehavior.CUBIC)
rubberSeekBar.setDampingRatio(0.4F)
rubberSeekBar.setStiffness(1000F)
rubberSeekBar.setStretchRange(50f)
rubberSeekBar.setThumbRadius(32f)
rubberSeekBar.setNormalTrackWidth(2f)
rubberSeekBar.setHighlightTrackWidth(4f)
rubberSeekBar.setNormalTrackColor(Color.GRAY)
rubberSeekBar.setHighlightTrackColor(Color.BLUE)
rubberSeekBar.setHighlightThumbOnTouchColor(Color.CYAN)
rubberSeekBar.setDefaultThumbInsideColor(Color.WHITE)

val currentValue = rubberSeekBar.getCurrentValue()
rubberSeekBar.setCurrentValue(currentValue + 10)
rubberSeekBar.setOnRubberSeekBarChangeListener(object : RubberSeekBar.OnRubberSeekBarChangeListener {
    override fun onProgressChanged(seekBar: RubberSeekBar, value: Int, fromUser: Boolean) {}
    override fun onStartTrackingTouch(seekBar: RubberSeekBar) {}
    override fun onStopTrackingTouch(seekBar: RubberSeekBar) {}
})


//Similarly for RubberRangePicker
val rubberRangePicker = RubberRangePicker(this)
rubberRangePicker.setMin(20)
...
rubberRangePicker.setHighlightThumbOnTouchColor(Color.CYAN)

val startThumbValue = rubberRangePicker.getCurrentStartValue()
rubberRangePicker.setCurrentStartValue(startThumbValue + 10)
val endThumbValue = rubberRangePicker.getCurrentEndValue()
rubberRangePicker.setCurrentEndValue(endThumbValue + 10)
rubberRangePicker.setOnRubberRangePickerChangeListener(object: RubberRangePicker.OnRubberRangePickerChangeListener{
    override fun onProgressChanged(rangePicker: RubberRangePicker, startValue: Int, endValue: Int, fromUser: Boolean) {}
    override fun onStartTrackingTouch(rangePicker: RubberRangePicker, isStartThumb: Boolean) {}
    override fun onStopTrackingTouch(rangePicker: RubberRangePicker, isStartThumb: Boolean) {}
})

更多卡者、更詳細的使用請看Github蒿囤。

Github:https://github.com/Chrisvin/RubberPicker

9. Switcher

image

一個炫酷的Switcher 切換動畫庫,真是的太可愛了虎眨,我前面也寫過文章專門介紹過:

炫酷蟋软!從未見過如此Q彈的Switcher

它的靈感來自于 Dribble上Oleg Frolov的設(shè)計。

Github: https://github.com/bitvale/Switcher

10. StfalconImageViewer

image

StfalconImageViewer是一個圖片查看庫嗽桩,
該庫簡單且可定制岳守。它包含一個全屏圖像查看器具有共享的圖像過渡支持碌冶,捏合縮放功能以及滑動手勢來關(guān)閉手勢湿痢。

Github文檔說明了如何使用每個功能。同樣值得注意的是:該庫與所有最受歡迎的圖像處理庫(例如Picasso扑庞,Glide等)兼容譬重。

所有可配置項如下:

StfalconImageViewer.Builder<String>(this, images, ::loadImage)
            .withStartPosition(startPosition)
            .withBackgroundColor(color)
            //.withBackgroundColorResource(R.color.color)
            .withOverlayView(view)
            .withImagesMargin(R.dimen.margin)
            //.withImageMarginPixels(margin)
            .withContainerPadding(R.dimen.padding)
            //.withContainerPadding(R.dimen.paddingStart, R.dimen.paddingTop, R.dimen.paddingEnd, R.dimen.paddingBottom)
            //.withContainerPaddingPixels(padding)
            //.withContainerPaddingPixels(paddingStart, paddingTop, paddingEnd, paddingBottom)
            .withHiddenStatusBar(shouldHideStatusBar)
            .allowZooming(isZoomingAllowed)
            .allowSwipeToDismiss(isSwipeToDismissAllowed)
            .withTransitionFrom(targeImageView)
            .withImageChangeListener(::onImageChanged)
            .withDismissListener(::onViewerDismissed)
            .withDismissListener(::onViewerDismissed)

更詳細的使用請看Github。

Github: https://github.com/stfalcon-studio/StfalconImageViewer

11. Broccoli

image

Broccoli是一個show View Loading 庫罐氨,也就是我常說的骨架屏臀规,在內(nèi)容加載的時候,顯示一個占位符栅隐。

該庫帶有很平滑的動畫效果塔嬉,你可以配合RecyclerView一起使用玩徊,等待加載內(nèi)容時,再也不枯燥了谨究。

示例:

Broccoli broccoli = new Broccoli();

//add the default style placeholder
broccoli.addPlaceholders('activity', 'view_id', 'view_id'); 

or 
//add the default style placeholder
broccoli.addPlaceholders('view1', 'view2', 'view3'); 

or 

//add the custom style placeholder
broccoli.addPlaceholder(new PlaceholderParameter.Builder()
                        .setView('view')
                        .setAnimation('scaleAnimation');
                        .setDrawable(DrawableUtils.createRectangleDrawable(placeHolderColor, 0))
                        .build()); 

or
//add the custom style placeholder with gradient animation
broccoli.addPlaceholder(new PlaceholderParameter.Builder()
                        .setView('view')
                        .setDrawable(new BroccoliGradientDrawable(Color.parseColor("#DDDDDD"),
                            Color.parseColor("#CCCCCC"), 0, 1000, new LinearInterpolator())
                        .build()); 
broccoli.show();

更多使用請看Github恩袱。

Github: https://github.com/samlss/Broccoli

12. Orbit MVI

image

這是一個用于Kotlin和Android的Model-View-Intent (MVI)框架。它的靈感來自Jake Wharton胶哲,RxFeedback和Mosby的“Managing State with RxJava”畔塔。

根據(jù)ReadMe所說:

Orbit在您的redux實現(xiàn)周圍提供了盡可能小的結(jié)構(gòu),以使其易于使用鸯屿,但您仍可以使用RxJava的強大功能澈吨。

redux系統(tǒng)可能如下所示:

data class State(val total: Int = 0)

data class AddAction(val number: Int)

sealed class SideEffect {
    data class Toast(val text: String) : SideEffect()
}

class CalculatorViewModel : OrbitViewModel<State, SideEffect> (State(), {

    perform("addition")
        .on<AddAction>()
        .sideEffect { post(SideEffect.Toast("Adding ${event.number}")) }
        .reduce {
            currentState.copy(currentState.total + event.number)
        }

    ...
})

activity / fragment 中:

// Example of injection using koin, your DI system might differ
private val viewModel by viewModel<CalculatorViewModel>()

override fun onCreate() {
    ...
    addButton.setOnClickListener { viewModel.sendAction(AddAction) }
}

override fun onStart() {
    viewModel.connect(this, ::handleState, ::handleSideEffect)
}

private fun handleState(state: State) {
    ...
}

private fun handleSideEffect(sideEffect: SideEffect) {
    when (sideEffect) {
        is SideEffect.Toast -> toast(sideEffect.text)
    }
}

詳細使用請看Github。

Github: https://github.com/babylonhealth/orbit-mvi

13. IndicatorScrollView

IndicatorScrollView IndicatorScrollView
image
image

該庫為NestedScrollView添加了邏輯碾盟,使它可以在滾動時棚辽,更改對指示器進行動態(tài)響應(yīng)技竟。

README文件包含開始項目所需的所有信息冰肴,例如如何使用IndicatorScrollViewIndicatorViewIndicatorItem榔组。目前,它的版本為1.0.2熙尉,是根據(jù)Apache 2.0許可發(fā)布的。它支持API 16及更高版本搓扯。

文檔示例很詳細检痰,更多使用相關(guān)請看Github。

Github: https://github.com/skydoves/IndicatorScrollView

14. Cyanea

image

Cyanea 是一個Android 主題引擎庫锨推。

它允許那你動態(tài)更換應(yīng)用主題铅歼,它內(nèi)置了很多主題如:

  • Theme.Cyanea.Dark
  • Theme.Cyanea.Dark.LightActionBar
  • Theme.Cyanea.Dark.NoActionBar
  • Theme.Cyanea.Light
  • Theme.Cyanea.Light.DarkActionBar
  • Theme.Cyanea.Light.NoActionBar

更多詳細信息請看Github。

Github: https://github.com/jaredrummler/Cyanea

15. Android MotionLayout Carousel

image

這是一個示例項目换可,它展示了如何使用MotionLayout來實現(xiàn)一個炫酷的輪播圖椎椰。

文檔幾乎沒有任何說明,但是如果你最近也在探索MotionLayout沾鳄,這將是一個很好示例慨飘。

Github: https://github.com/faob-dev/MotionLayoutCarousel

總結(jié)

以上就是本期的開源項目推薦,如果你也有好玩的译荞、有趣的瓤的、強大的開源項目,也可以推薦給西哥吞歼,歡迎評論區(qū)留言討論圈膏。

文章首發(fā)于公眾號:「 技術(shù)最TOP 」,每天都有干貨文章持續(xù)更新篙骡,可以微信搜索「 技術(shù)最TOP 」第一時間閱讀稽坤,回復(fù)【思維導(dǎo)圖】【面試】【簡歷】有我準備一些Android進階路線桥帆、面試指導(dǎo)和簡歷模板送給你

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慎皱,隨后出現(xiàn)的幾起案子老虫,更是在濱河造成了極大的恐慌,老刑警劉巖茫多,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祈匙,死亡現(xiàn)場離奇詭異,居然都是意外死亡天揖,警方通過查閱死者的電腦和手機夺欲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來今膊,“玉大人些阅,你說我怎么就攤上這事“呋#” “怎么了市埋?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恕刘。 經(jīng)常有香客問我缤谎,道長,這世上最難降的妖魔是什么褐着? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任坷澡,我火速辦了婚禮,結(jié)果婚禮上含蓉,老公的妹妹穿的比我還像新娘频敛。我一直安慰自己,他們只是感情好馅扣,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布斟赚。 她就那樣靜靜地躺著,像睡著了一般岂嗓。 火紅的嫁衣襯著肌膚如雪汁展。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天厌殉,我揣著相機與錄音食绿,去河邊找鬼。 笑死公罕,一個胖子當(dāng)著我的面吹牛器紧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楼眷,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼铲汪,長吁一口氣:“原來是場噩夢啊……” “哼熊尉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掌腰,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤狰住,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后齿梁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催植,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年勺择,在試婚紗的時候發(fā)現(xiàn)自己被綠了创南。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡省核,死狀恐怖稿辙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气忠,我是刑警寧澤邻储,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站笔刹,受9級特大地震影響芥备,放射性物質(zhì)發(fā)生泄漏冬耿。R本人自食惡果不足惜舌菜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亦镶。 院中可真熱鬧日月,春花似錦、人聲如沸缤骨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绊起。三九已至精拟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間虱歪,已是汗流浹背蜂绎。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笋鄙,地道東北人师枣。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像萧落,于是被迫代替她去往敵國和親践美。 傳聞我的和親對象是個殘疾皇子洗贰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345