Merge pull request #156 from TouchInstinct/feature/divider

Decorators
This commit is contained in:
RationalEgoism 2020-09-01 14:02:31 +03:00 committed by GitHub
commit 2351cce332
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 147 additions and 10 deletions

1
recyclerview-decorators/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

View File

@ -0,0 +1,32 @@
apply from: "../android-configs/lib-config.gradle"
apply plugin: 'kotlin-android'
dependencies {
implementation project(":utils")
implementation project(":kotlin-extensions")
implementation "com.google.android.material:material"
implementation "androidx.core:core-ktx"
constraints {
implementation("com.google.android.material:material") {
version {
require '1.0.0'
}
}
implementation("androidx.core:core-ktx") {
version {
require '1.3.1'
}
}
implementation("org.jetbrains.kotlin:kotlin-stdlib") {
version {
require '1.3.0'
}
}
}
}
repositories {
mavenCentral()
}

View File

@ -0,0 +1 @@
<manifest package="ru.touchin.roboswag.recyclerview_decorators"/>

View File

@ -0,0 +1,30 @@
package ru.touchin.roboswag.recyclerview_decorators.decorators
import android.content.Context
import android.graphics.Rect
import android.view.View
import androidx.annotation.DrawableRes
import androidx.recyclerview.widget.RecyclerView
open class BottomDividerItemDecoration(
context: Context,
@DrawableRes drawableId: Int? = null,
override val predicate: ((position: Int) -> Boolean) = { true },
override val startMargin: Int = 0,
override val endMargin: Int = 0,
override val offset: Boolean = true,
override val showOnLastItem: Boolean = false
) : DividerItemDecoration(context, drawableId, predicate, startMargin, endMargin, offset, showOnLastItem) {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
val position = parent.getChildAdapterPosition(view)
if (offset && predicate(position) && (position != state.itemCount - 1 || showOnLastItem)) {
outRect.set(0, 0, 0, divider.intrinsicHeight)
}
}
override fun getDividerTop(child: View): Int = getDividerBottom(child) - divider.intrinsicHeight
override fun getDividerBottom(child: View): Int = bounds.bottom + child.translationY.toInt()
}

View File

@ -0,0 +1,74 @@
package ru.touchin.roboswag.recyclerview_decorators.decorators
import android.content.Context
import android.graphics.Canvas
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.view.View
import androidx.annotation.DrawableRes
import androidx.core.content.res.getDrawableOrThrow
import androidx.core.view.children
import androidx.recyclerview.widget.RecyclerView
import ru.touchin.roboswag.components.utils.px
abstract class DividerItemDecoration(
context: Context,
@DrawableRes drawableId: Int? = null,
protected open val predicate: ((position: Int) -> Boolean) = { true },
protected open val startMargin: Int = 0,
protected open val endMargin: Int = 0,
protected open val offset: Boolean = true,
protected open val showOnLastItem: Boolean = false
) : RecyclerView.ItemDecoration() {
protected val bounds = Rect()
protected val divider: Drawable
init {
if (drawableId == null) {
context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider)).apply {
divider = getDrawableOrThrow(0)
recycle()
}
} else {
divider = context.getDrawable(drawableId)!!
}
}
override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
if (offset) {
drawDivider(canvas, parent, state)
}
}
override fun onDrawOver(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
if (!offset) {
drawDivider(canvas, parent, state)
}
}
private fun drawDivider(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
canvas.save()
parent.children.forEach { child ->
val position = parent.getChildAdapterPosition(child)
if (predicate(position) && (position != state.itemCount - 1 || showOnLastItem)) {
parent.getDecoratedBoundsWithMargins(child, bounds)
val top = getDividerTop(child)
val bottom = getDividerBottom(child)
divider.setBounds(
bounds.left + startMargin,
top,
bounds.right - (endMargin.toFloat().px).toInt(),
bottom
)
divider.draw(canvas)
}
}
canvas.restore()
}
abstract fun getDividerTop(child: View): Int
abstract fun getDividerBottom(child: View): Int
}

View File

@ -1,4 +1,4 @@
package ru.touchin.roboswag.recyclerview_adapters.decorators
package ru.touchin.roboswag.recyclerview_decorators.decorators
import android.graphics.Canvas
import android.graphics.Rect

View File

@ -1,2 +1,2 @@
<manifest
package="ru.touchin.roboswag.components.views"/>
package="ru.touchin.roboswag.views"/>

View File

@ -30,7 +30,6 @@ import android.util.AttributeSet;
import android.util.TypedValue;
import ru.touchin.roboswag.components.utils.UiUtils;
import ru.touchin.roboswag.components.views.R;
/**
* Created by Ilia Kurtov on 07/12/2016.

View File

@ -40,8 +40,8 @@ import java.util.ArrayList;
import java.util.List;
import ru.touchin.defaults.DefaultTextWatcher;
import ru.touchin.roboswag.components.views.BuildConfig;
import ru.touchin.roboswag.components.views.R;
import ru.touchin.roboswag.views.BuildConfig;
import ru.touchin.roboswag.views.R;
import ru.touchin.roboswag.views.internal.AttributesUtils;
import ru.touchin.roboswag.core.log.Lc;

View File

@ -34,8 +34,8 @@ import java.util.ArrayList;
import java.util.List;
import ru.touchin.roboswag.components.utils.UiUtils;
import ru.touchin.roboswag.components.views.BuildConfig;
import ru.touchin.roboswag.components.views.R;
import ru.touchin.roboswag.views.BuildConfig;
import ru.touchin.roboswag.views.R;
import ru.touchin.roboswag.views.internal.AttributesUtils;
import ru.touchin.roboswag.core.log.Lc;

View File

@ -6,8 +6,8 @@ import android.view.LayoutInflater
import androidx.core.content.withStyledAttributes
import ru.touchin.extensions.observable
import ru.touchin.extensions.setOnRippleClickListener
import ru.touchin.roboswag.components.views.R
import ru.touchin.roboswag.components.views.databinding.ProgressViewBinding
import ru.touchin.roboswag.views.databinding.ProgressViewBinding
import ru.touchin.roboswag.views.R
import kotlin.properties.Delegates
//TODO make customizable views list and views style

View File

@ -15,7 +15,7 @@ import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.ViewCompat;
import ru.touchin.roboswag.components.views.R;
import ru.touchin.roboswag.views.R;
public class Switcher extends FrameLayout {