這15個Android開源庫,只有經常逛Github的才知道!

依然飯特稀西發表於2020-08-04

哈嘍,大家好,我是西哥!

又到了大家最喜歡了的環節--開源庫推薦,前面為大家推薦了我收藏的一些非常酷的開源庫,受到大家一致好評,還沒看過的,請移步至:

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

【開源推薦】進階實戰,從一款音樂播放器開始

【2020年GitHub 上那些優秀Android開源庫,這裡是Top10!】

本期又為大家帶來了哪些有趣的庫呢?本期為大家精選了15個有趣又有用的開源,排名不分先後,一起來看看吧!

1. Coil

Coil是Android上的一個全新的圖片載入框架,它的全名叫做 coroutine image loader,即協程圖片載入庫。與傳統的圖片載入庫Glide,Picasso或Fresco等相比。該具有輕量(只有大約1500個方法)、快、易於使用、更現代的API等優勢。

它支援GIF和SVG,並且可以執行四個預設轉換:模糊圓形裁剪灰度圓角

示例如下:

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

並且是全用Kotlin編寫,如果你是純Kotlin專案的話,那麼這個庫應該是你的首選。

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

2. MultiSearchView

該庫具有一個非常酷的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>

然後,您應該將樣式設定為MultiSearchView下的app:searchTextStyle

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

3. CalendarView

CalendarView是一個高度可定製化的日曆元件庫,用recycleView實現。

它有如下特性:

  • 單一或範圍選擇
  • 周曆或者月曆模式
  • 邊界日期
  • 自定義日曆檢視
  • 水平或者垂直滾動模式
  • 完全可定製的檢視

該庫的文件也非常全面,幷包含許多示例。此外,還有一個示例應用程式展示了庫的所有功能。

它是用純Kotlin編寫的,並在MIT許可下發布。如果您需要在應用程式中使用日曆檢視,這是一個不錯的選擇。

注意:該庫通過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/kizitonwos...

4. Bubble Navigation

FloatingTopBarActivityTopBarActivity
BottomBarActivityEqualBottomBarActivity

Bubble Navigation是一個輕巧的庫,可通過大量自定義選項輕鬆製作精美的導航欄。

它有很多非常的特性:

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

    • BubbleNavigationConstraintView(支援spreadspreadinside, 和 packed莫斯)
    • BubbleNavigationLinearView(允許平均分配,使用權重或packed模式)
  • 高度可定製化
  • 您可以新增小紅點,它具有BubbleToggleView來建立新的UI元件,而不僅僅是導航

示例:

<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/...

5. FabFilter

這是一個有趣的專案,它不是一個直接可用的庫,而是一個示例應用程式,展示了使用不使用 MotionLayout兩種方式來實現的高階UI動畫。

詳細的實現細節可以看看Medium上的系列文章:

“Complex UI/Animations on Android”

“Complex UI/Animations on Android — featuring MotionLayout”

Github:https://github.com/nikhilpanj...

6.android-showcase

android-showcase是一個非常優秀的開源專案,它是一個展示應用程式,展示瞭如何使用Kotlin和最新的Jetpack 技術棧來開發一個APP。

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

  • 100% Kotlin
  • 現代架構 (feature modules, clean architecture, Model-View-ViewModel, Model-View-Intent)
  • Android Jetpack元件
  • 單Activity模式,使用Navigation導航

看完這個專案,在模組化,Clean體系結構,測試、設定CI / CD工具,等方面,你將會受到啟發。感謝作者的開源。

Github:https://github.com/igorwojda/...

7. Croppy

Croppy是一個Android圖片裁剪庫。

它有很多強大的特性:

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

更多使用細節請看Github。

Github: https://github.com/lyrebirdst...

8. RubberPicker

一個炫酷的、有趣的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"/>

或者,在程式碼中動態配置:

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/R...

9. Switcher

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

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

它的靈感來自於 Dribble上Oleg Frolov 的設計。

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

10. StfalconImageViewer

StfalconImageViewer是一個圖片檢視庫,
該庫簡單且可定製。它包含一個全屏影像檢視器具有共享的影像過渡支援捏合縮放功能以及滑動手勢來關閉手勢。

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-s...

11. Broccoli

Broccoli是一個show View Loading 庫,也就是我常說的骨架屏,在內容載入的時候,顯示一個佔位符。

該庫帶有很平滑的動畫效果,你可以配合RecyclerView一起使用,等待載入內容時,再也不枯燥了。

示例:

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/Bro...

12. Orbit MVI

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

根據ReadMe所說:

Orbit在您的redux實現周圍提供了儘可能小的結構,以使其易於使用,但您仍可以使用RxJava的強大功能。

redux系統可能如下所示:

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/babylonhea...

13. IndicatorScrollView

IndicatorScrollViewIndicatorScrollView

該庫為NestedScrollView新增了邏輯,使它可以在滾動時,更改對指示器進行動態響應。

README檔案包含開始專案所需的所有資訊,例如如何使用IndicatorScrollViewIndicatorViewIndicatorItem。目前,它的版本為1.0.2,是根據Apache 2.0許可釋出的。它支援API 16及更高版本。

文件示例很詳細,更多使用相關請看Github。

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

14. Cyanea

Cyanea 是一個Android 主題引擎庫。

它允許那你動態更換應用主題,它內建了很多主題如:

  • 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/jaredrumml...

15. Android MotionLayout Carousel

這是一個示例專案,它展示瞭如何使用MotionLayout來實現一個炫酷的輪播圖。

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

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

總結

以上就是本期的開源專案推薦,如果你也有好玩的、有趣的、強大的開源專案,也可以推薦給西哥,歡迎評論區留言討論。

相關文章