diff --git a/README.md b/README.md index 6159f5e..cb63bfc 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Read how we did it [on our blog](https://yalantis.com/blog/develop-filter-animat ##Requirements -- Android SDK 18+ +- Android SDK 19+ ##Usage @@ -42,17 +42,17 @@ Firstly you need to place `Filter` above your `RecyclerView` in the layout file ```xml - - - - - - - + + - - + ``` diff --git a/app/build.gradle b/app/build.gradle index c212465..12518dd 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion "24.0.1" + compileSdkVersion 28 defaultConfig { applicationId "com.yalantis.fitfilter" - minSdkVersion 18 - targetSdkVersion 24 + minSdkVersion 19 + targetSdkVersion 28 versionCode 1 versionName "1.0" } @@ -20,9 +19,14 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:24.2.0' - compile 'com.facebook.fresco:fresco:0.13.0' - compile 'com.android.support:design:24.2.0' - compile project(':filter') + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'androidx.appcompat:appcompat:1.0.2' + implementation ('com.facebook.fresco:fresco:1.13.0') { + exclude group: 'com.android.support', module: 'appcompat' + exclude group: 'com.android.support', module: 'support-v4' + exclude module: 'recyclerview-v7' + } + implementation 'com.google.android.material:material:1.0.0' + implementation "org.jetbrains:annotations:15.0" + implementation project(':filter') } diff --git a/app/src/main/java/com/yalantis/fitfilter/DividerItemDecoration.java b/app/src/main/java/com/yalantis/fitfilter/DividerItemDecoration.java index ac9b0b6..5fd0698 100755 --- a/app/src/main/java/com/yalantis/fitfilter/DividerItemDecoration.java +++ b/app/src/main/java/com/yalantis/fitfilter/DividerItemDecoration.java @@ -3,8 +3,10 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; + +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + import android.view.View; /** diff --git a/app/src/main/java/com/yalantis/fitfilter/ExampleActivity.java b/app/src/main/java/com/yalantis/fitfilter/ExampleActivity.java index 9d87f51..6692979 100755 --- a/app/src/main/java/com/yalantis/fitfilter/ExampleActivity.java +++ b/app/src/main/java/com/yalantis/fitfilter/ExampleActivity.java @@ -1,12 +1,12 @@ package com.yalantis.fitfilter; -import android.graphics.Color; import android.os.Bundle; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.util.DiffUtil; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipelineConfig; @@ -55,7 +55,7 @@ protected void onCreate(Bundle savedInstanceState) { mRecyclerView = (RecyclerView) findViewById(R.id.list); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); + mRecyclerView.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false)); mRecyclerView.setAdapter(mAdapter = new QuestionsAdapter(this, mAllQuestions = getQuestions())); mRecyclerView.setItemAnimator(new FiltersListItemAnimator()); } diff --git a/app/src/main/java/com/yalantis/fitfilter/QuestionsAdapter.java b/app/src/main/java/com/yalantis/fitfilter/QuestionsAdapter.java index 0f842c9..84ef1f0 100755 --- a/app/src/main/java/com/yalantis/fitfilter/QuestionsAdapter.java +++ b/app/src/main/java/com/yalantis/fitfilter/QuestionsAdapter.java @@ -2,8 +2,11 @@ import android.content.Context; import android.graphics.drawable.GradientDrawable; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; + +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/yalantis/fitfilter/Tag.java b/app/src/main/java/com/yalantis/fitfilter/Tag.java index a23e746..260591e 100755 --- a/app/src/main/java/com/yalantis/fitfilter/Tag.java +++ b/app/src/main/java/com/yalantis/fitfilter/Tag.java @@ -1,6 +1,7 @@ package com.yalantis.fitfilter; -import android.support.annotation.NonNull; + +import androidx.annotation.NonNull; import com.yalantis.filter.model.FilterModel; diff --git a/app/src/main/res/layout/activity_example.xml b/app/src/main/res/layout/activity_example.xml index f43fdd7..e7c9077 100755 --- a/app/src/main/res/layout/activity_example.xml +++ b/app/src/main/res/layout/activity_example.xml @@ -1,15 +1,15 @@ - - - - - - - + + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index f7e0548..b2f3efd 100755 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -83,7 +83,7 @@ android:layout_marginRight="16dp" android:background="#ebebeb" /> - - - () @@ -52,10 +49,10 @@ class FiltersListItemAnimator : SimpleItemAnimator() { override fun runPendingAnimations() { - val removalsPending = !mPendingRemovals.isEmpty() - val movesPending = !mPendingMoves.isEmpty() - val changesPending = !mPendingChanges.isEmpty() - val additionsPending = !mPendingAdditions.isEmpty() + val removalsPending = mPendingRemovals.isNotEmpty() + val movesPending = mPendingMoves.isNotEmpty() + val changesPending = mPendingChanges.isNotEmpty() + val additionsPending = mPendingAdditions.isNotEmpty() if (!removalsPending && !movesPending && !additionsPending && !changesPending) { // nothing to animate return @@ -81,7 +78,7 @@ class FiltersListItemAnimator : SimpleItemAnimator() { } if (removalsPending) { val view = moves[0].holder.itemView - ViewCompat.postOnAnimationDelayed(view, mover, getRemoveDuration()) + ViewCompat.postOnAnimationDelayed(view, mover, removeDuration) } else { mover.run() } @@ -101,7 +98,7 @@ class FiltersListItemAnimator : SimpleItemAnimator() { } if (removalsPending) { val holder = changes[0].oldHolder - ViewCompat.postOnAnimationDelayed(holder!!.itemView, changer, getRemoveDuration()) + ViewCompat.postOnAnimationDelayed(holder!!.itemView, changer, removeDuration) } else { changer.run() } @@ -163,7 +160,7 @@ class FiltersListItemAnimator : SimpleItemAnimator() { override fun animateAdd(holder: RecyclerView.ViewHolder): Boolean { resetAnimation(holder) - ViewCompat.setAlpha(holder.itemView, 0f) + holder.itemView.alpha = 0f mPendingAdditions.add(holder) return true } @@ -189,13 +186,14 @@ class FiltersListItemAnimator : SimpleItemAnimator() { }.start() } + @Suppress("NAME_SHADOWING") override fun animateMove(holder: RecyclerView.ViewHolder, fromX: Int, fromY: Int, toX: Int, toY: Int): Boolean { var fromX = fromX var fromY = fromY val view = holder.itemView - fromX += ViewCompat.getTranslationX(holder.itemView).toInt() - fromY += ViewCompat.getTranslationY(holder.itemView).toInt() + fromX += holder.itemView.translationX.toInt() + fromY += holder.itemView.translationY.toInt() resetAnimation(holder) val deltaX = toX - fromX val deltaY = toY - fromY @@ -204,10 +202,10 @@ class FiltersListItemAnimator : SimpleItemAnimator() { return false } if (deltaX != 0) { - ViewCompat.setTranslationX(view, (-deltaX).toFloat()) + view.translationY = (-deltaX).toFloat() } if (deltaY != 0) { - ViewCompat.setTranslationY(view, (-deltaY).toFloat()) + view.translationY = (-deltaY).toFloat() } mPendingMoves += MoveInfo(holder, fromX, fromY, toX, toY) return true @@ -249,22 +247,22 @@ class FiltersListItemAnimator : SimpleItemAnimator() { // run a move animation to handle position changes. return animateMove(oldHolder, fromX, fromY, toX, toY) } - val prevTranslationX = ViewCompat.getTranslationX(oldHolder.itemView) - val prevTranslationY = ViewCompat.getTranslationY(oldHolder.itemView) - val prevAlpha = ViewCompat.getAlpha(oldHolder.itemView) + val prevTranslationX = oldHolder.itemView.translationX + val prevTranslationY = oldHolder.itemView.translationY + val prevAlpha = oldHolder.itemView.alpha resetAnimation(oldHolder) val deltaX = (toX.toFloat() - fromX.toFloat() - prevTranslationX).toInt() val deltaY = (toY.toFloat() - fromY.toFloat() - prevTranslationY).toInt() // recover prev translation state after ending animation - ViewCompat.setTranslationX(oldHolder.itemView, prevTranslationX) - ViewCompat.setTranslationY(oldHolder.itemView, prevTranslationY) - ViewCompat.setAlpha(oldHolder.itemView, prevAlpha) + oldHolder.itemView.translationX = prevTranslationX + oldHolder.itemView.translationY = prevTranslationY + oldHolder.itemView.alpha = prevAlpha if (newHolder != null) { // carry over translation values resetAnimation(newHolder) - ViewCompat.setTranslationX(newHolder.itemView, (-deltaX).toFloat()) - ViewCompat.setTranslationY(newHolder.itemView, (-deltaY).toFloat()) - ViewCompat.setAlpha(newHolder.itemView, 0f) + newHolder.itemView.translationX = (-deltaX).toFloat() + newHolder.itemView.translationY = (-deltaY).toFloat() + newHolder.itemView.alpha = 0f } mPendingChanges += ChangeInfo(oldHolder, newHolder, fromX, fromY, toX, toY) return true @@ -356,9 +354,9 @@ class FiltersListItemAnimator : SimpleItemAnimator() { } else { return false } - ViewCompat.setAlpha(item.itemView, 1f) - ViewCompat.setTranslationX(item.itemView, 0f) - ViewCompat.setTranslationY(item.itemView, 0f) + item.itemView.alpha = 1f + item.itemView.translationX = 0f + item.itemView.translationY = 0f dispatchChangeFinished(item, oldItem) return true } @@ -371,19 +369,19 @@ class FiltersListItemAnimator : SimpleItemAnimator() { for (i in mPendingMoves.indices.reversed()) { val moveInfo = mPendingMoves[i] if (moveInfo.holder === item) { - ViewCompat.setTranslationY(view, 0f) - ViewCompat.setTranslationX(view, 0f) + view.translationY = 0f + view.translationX = 0f dispatchMoveFinished(item) mPendingMoves.removeAt(i) } } endChangeAnimation(mPendingChanges, item) if (mPendingRemovals.remove(item)) { - ViewCompat.setAlpha(view, 1f) + view.alpha = 1f dispatchRemoveFinished(item) } if (mPendingAdditions.remove(item)) { - ViewCompat.setAlpha(view, 1f) + view.alpha = 1f dispatchAddFinished(item) } @@ -399,8 +397,8 @@ class FiltersListItemAnimator : SimpleItemAnimator() { for (j in moves.indices.reversed()) { val moveInfo = moves[j] if (moveInfo.holder === item) { - ViewCompat.setTranslationY(view, 0f) - ViewCompat.setTranslationX(view, 0f) + view.translationY = 0f + view.translationX = 0f dispatchMoveFinished(item) moves.removeAt(j) if (moves.isEmpty()) { @@ -413,7 +411,7 @@ class FiltersListItemAnimator : SimpleItemAnimator() { for (i in mAdditionsList.indices.reversed()) { val additions = mAdditionsList[i] if (additions.remove(item)) { - ViewCompat.setAlpha(view, 1f) + view.alpha = 1f dispatchAddFinished(item) if (additions.isEmpty()) { mAdditionsList.removeAt(i) @@ -424,7 +422,8 @@ class FiltersListItemAnimator : SimpleItemAnimator() { } private fun resetAnimation(holder: RecyclerView.ViewHolder) { - AnimatorCompatHelper.clearInterpolator(holder.itemView) + val defaultInterpolator = ValueAnimator().interpolator + holder.itemView.animate().interpolator = defaultInterpolator endAnimation(holder) } @@ -445,8 +444,8 @@ class FiltersListItemAnimator : SimpleItemAnimator() { for (i in count - 1 downTo 0) { val item = mPendingMoves[i] val view = item.holder.itemView - ViewCompat.setTranslationY(view, 0f) - ViewCompat.setTranslationX(view, 0f) + view.translationY = 0f + view.translationX = 0f dispatchMoveFinished(item.holder) mPendingMoves.removeAt(i) } @@ -460,7 +459,7 @@ class FiltersListItemAnimator : SimpleItemAnimator() { for (i in count - 1 downTo 0) { val item = mPendingAdditions[i] val view = item.itemView - ViewCompat.setAlpha(view, 1f) + view.alpha = 1f dispatchAddFinished(item) mPendingAdditions.removeAt(i) } @@ -481,8 +480,8 @@ class FiltersListItemAnimator : SimpleItemAnimator() { val moveInfo = moves[j] val item = moveInfo.holder val view = item.itemView - ViewCompat.setTranslationY(view, 0f) - ViewCompat.setTranslationX(view, 0f) + view.translationY = 0f + view.translationX = 0f dispatchMoveFinished(moveInfo.holder) moves.removeAt(j) if (moves.isEmpty()) { @@ -497,7 +496,7 @@ class FiltersListItemAnimator : SimpleItemAnimator() { for (j in count - 1 downTo 0) { val item = additions[j] val view = item.itemView - ViewCompat.setAlpha(view, 1f) + view.alpha = 1f dispatchAddFinished(item) additions.removeAt(j) if (additions.isEmpty()) { @@ -553,14 +552,4 @@ class FiltersListItemAnimator : SimpleItemAnimator() { return !payloads.isEmpty() || super.canReuseUpdatedViewHolder(viewHolder, payloads) } - private open class VpaListenerAdapter : ViewPropertyAnimatorListener { - override fun onAnimationStart(view: View) { - } - - override fun onAnimationEnd(view: View) { - } - - override fun onAnimationCancel(view: View) { - } - } } \ No newline at end of file diff --git a/filter/src/main/java/com/yalantis/filter/widget/CollapseView.kt b/filter/src/main/java/com/yalantis/filter/widget/CollapseView.kt index 113f899..acfa3cd 100755 --- a/filter/src/main/java/com/yalantis/filter/widget/CollapseView.kt +++ b/filter/src/main/java/com/yalantis/filter/widget/CollapseView.kt @@ -13,9 +13,9 @@ import kotlinx.android.synthetic.main.view_collapse.view.* */ class CollapseView : FrameLayout { - constructor(context: Context?) : this(context, null) - constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) - constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + constructor(context: Context) : this(context, null) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { LayoutInflater.from(context).inflate(R.layout.view_collapse, this, true) } @@ -27,7 +27,7 @@ class CollapseView : FrameLayout { buttonOk.visibility = if (hasText) View.VISIBLE else GONE } - internal fun rotateArrow(rotation: Float): Unit { + internal fun rotateArrow(rotation: Float) { imageArrow.rotation = rotation } diff --git a/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterContainer.kt b/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterContainer.kt index 3461f9f..861d1a8 100755 --- a/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterContainer.kt +++ b/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterContainer.kt @@ -1,5 +1,6 @@ package com.yalantis.filter.widget +import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet @@ -39,6 +40,7 @@ class CollapsedFilterContainer : RelativeLayout { return isEmpty || !containsEvent } + @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { diff --git a/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterView.kt b/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterView.kt index 1029004..6e1b45b 100755 --- a/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterView.kt +++ b/filter/src/main/java/com/yalantis/filter/widget/CollapsedFilterView.kt @@ -1,6 +1,7 @@ package com.yalantis.filter.widget import android.animation.ValueAnimator +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.MotionEvent @@ -27,7 +28,7 @@ class CollapsedFilterView : ViewGroup { constructor(context: Context, attrs: AttributeSet?, defStyleRes: Int) : super(context, attrs, defStyleRes) override fun onLayout(p0: Boolean, p1: Int, p2: Int, p3: Int, p4: Int) { - for (i in 0..childCount - 1) { + for (i in 0 until childCount) { val child: FilterItem = getChildAt(i) as FilterItem child.layout(0, 0, child.collapsedSize / 2 + child.measuredWidth / 2 + 1, child.measuredHeight) } @@ -58,7 +59,7 @@ class CollapsedFilterView : ViewGroup { ValueAnimator.ofFloat(0f, Constant.ANIMATION_DURATION / 2.toFloat()).setDuration(Constant.ANIMATION_DURATION / 2).apply { addUpdateListener { val ratio = it.animatedValue as Float / (Constant.ANIMATION_DURATION / 2) - for (i in index + 1..childCount - 1) { + for (i in index + 1 until childCount) { val item = getChildAt(i) as FilterItem if (ratio == 0f) { @@ -80,6 +81,7 @@ class CollapsedFilterView : ViewGroup { override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean = childCount > 0 + @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { @@ -107,7 +109,7 @@ class CollapsedFilterView : ViewGroup { private fun findViewByCoord(x: Float): FilterItem? { - for (i in 0..childCount - 1) { + for (i in 0 until childCount) { val item: FilterItem = getChildAt(i) as FilterItem if (containsCoord(item, x)) { diff --git a/filter/src/main/java/com/yalantis/filter/widget/ExpandedFilterView.kt b/filter/src/main/java/com/yalantis/filter/widget/ExpandedFilterView.kt index 8572cf1..c3c0bfa 100755 --- a/filter/src/main/java/com/yalantis/filter/widget/ExpandedFilterView.kt +++ b/filter/src/main/java/com/yalantis/filter/widget/ExpandedFilterView.kt @@ -1,5 +1,6 @@ package com.yalantis.filter.widget +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.MotionEvent @@ -31,8 +32,8 @@ class ExpandedFilterView : ViewGroup { constructor(context: Context, attrs: AttributeSet?, defStyleRes: Int) : super(context, attrs, defStyleRes) override fun onLayout(p0: Boolean, p1: Int, p2: Int, p3: Int, p4: Int) { - if (!filters.isEmpty()) { - for (i in 0..childCount - 1) { + if (filters.isNotEmpty()) { + for (i in 0 until childCount) { val child: View = getChildAt(i) val coord: Coord? = filters[child] @@ -57,27 +58,29 @@ class ExpandedFilterView : ViewGroup { var height: Int = mPrevHeight if (filters.isEmpty()) { - for (i in 0..childCount - 1) { + for (i in 0 until childCount) { val child: FilterItem = getChildAt(i) as FilterItem child.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) - if (mPrevItem == null) { - mPrevX = margin - mPrevY = margin - height = child.measuredHeight + margin - } else if (canPlaceOnTheSameLine(child)) { - mPrevX = mPrevX!! + mPrevItem!!.measuredWidth + margin / 2 - } else { - mPrevX = margin - mPrevY = mPrevY!! + mPrevItem!!.measuredHeight + margin / 2 - height += child.measuredHeight + margin / 2 + when { + mPrevItem == null -> { + mPrevX = margin + mPrevY = margin + height = child.measuredHeight + margin + } + canPlaceOnTheSameLine(child) -> mPrevX = mPrevX!! + mPrevItem!!.measuredWidth + margin / 2 + else -> { + mPrevX = margin + mPrevY = mPrevY!! + mPrevItem!!.measuredHeight + margin / 2 + height += child.measuredHeight + margin / 2 + } } mPrevItem = child if (filters.size < childCount) { - filters.put(child, Coord(mPrevX!!, mPrevY!!)) + filters[child] = Coord(mPrevX!!, mPrevY!!) } } height = if (height > 0) height + margin else 0 @@ -92,6 +95,7 @@ class ExpandedFilterView : ViewGroup { calculateSize(heightMeasureSpec, calculateDesiredHeight())) } + @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { diff --git a/filter/src/main/java/com/yalantis/filter/widget/Filter.kt b/filter/src/main/java/com/yalantis/filter/widget/Filter.kt index 852c0ad..74b9c53 100755 --- a/filter/src/main/java/com/yalantis/filter/widget/Filter.kt +++ b/filter/src/main/java/com/yalantis/filter/widget/Filter.kt @@ -2,6 +2,7 @@ package com.yalantis.filter.widget import android.animation.ValueAnimator import android.content.Context +import android.graphics.Color import android.os.Bundle import android.os.Parcelable import android.util.AttributeSet @@ -18,11 +19,7 @@ import com.yalantis.filter.model.Coord import com.yalantis.filter.model.FilterModel import kotlinx.android.synthetic.main.collapsed_container.view.* import kotlinx.android.synthetic.main.filter.view.* -import java.io.Serializable import java.util.* -import android.content.res.TypedArray -import android.graphics.Color -import android.support.annotation.ColorInt /** @@ -36,29 +33,7 @@ class Filter : FrameLayout, FilterItemListener, CollapseListene var noSelectedItemText: String = "" set(value) { collapsedText.text = value - } - var textToReplaceArrow: String = "" - set(value) { - collapseView.setText(value) - } - - var replaceArrowByText: Boolean = false - set(value) { - collapseView.setHasText(value) - } - - var collapsedBackground: Int = Color.WHITE - set(value) { - field = value - collapsedContainer.containerBackground = value - collapsedContainer.invalidate() - } - - var expandedBackground: Int = Color.WHITE - set(value) { field = value - expandedFilter.setBackgroundColor(value) - expandedFilter.invalidate() } private var mIsBusy = false @@ -281,7 +256,7 @@ class Filter : FrameLayout, FilterItemListener, CollapseListene if (mItems.contains(item)) { mSelectedItems.add(filter) } - mSelectedFilters.put(item, Coord(item.x.toInt(), item.y.toInt())) + mSelectedFilters[item] = Coord(item.x.toInt(), item.y.toInt()) listener?.onFilterSelected(filter) } @@ -299,7 +274,7 @@ class Filter : FrameLayout, FilterItemListener, CollapseListene if (coord != null && collapsedFilter.removeItem(item)) { mSelectedFilters.remove(item) mSelectedItems.remove(mItems[item]) - mRemovedFilters.put(item, coord) + mRemovedFilters[item] = coord postDelayed({ remove(item) @@ -349,15 +324,12 @@ class Filter : FrameLayout, FilterItemListener, CollapseListene putBoolean(STATE_COLLAPSED, isCollapsed!!) val selected = mSelectedItems val removed = mRemovedItems - if (selected is Serializable) { - putSerializable(STATE_SELECTED, selected) - } - if (removed is Serializable) { - putSerializable(STATE_REMOVED, removed) - } + putSerializable(STATE_SELECTED, selected) + putSerializable(STATE_REMOVED, removed) } } + @Suppress("UNCHECKED_CAST") override fun onRestoreInstanceState(state: Parcelable?) { if (state is Bundle) { super.onRestoreInstanceState(state.getParcelable(STATE_SUPER)) diff --git a/filter/src/main/java/com/yalantis/filter/widget/FilterItem.kt b/filter/src/main/java/com/yalantis/filter/widget/FilterItem.kt index 03881e6..049b6e7 100755 --- a/filter/src/main/java/com/yalantis/filter/widget/FilterItem.kt +++ b/filter/src/main/java/com/yalantis/filter/widget/FilterItem.kt @@ -2,20 +2,19 @@ package com.yalantis.filter.widget import android.content.Context import android.content.res.ColorStateList -import android.graphics.Canvas -import android.graphics.Typeface +import android.graphics.Color import android.graphics.drawable.GradientDrawable -import android.support.annotation.ColorInt -import android.support.annotation.ColorRes -import android.support.annotation.DrawableRes -import android.support.v4.content.ContextCompat -import android.support.v4.content.res.ResourcesCompat import android.util.AttributeSet import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.FrameLayout +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat import com.yalantis.filter.R import com.yalantis.filter.listener.FilterItemListener import kotlinx.android.synthetic.main.item_filter.view.* @@ -30,17 +29,15 @@ class FilterItem : FrameLayout, Serializable { var isIncreased: Boolean = false var startX: Float = 0f var startY: Float = 0f - @ColorInt var cancelIconTint: Int = android.R.color.white - @DrawableRes var cancelIcon: Int = R.drawable.ic_cancel + @ColorInt + var cancelIconTint: Int = Color.WHITE + @DrawableRes + var cancelIcon: Int = R.drawable.ic_cancel @ColorInt var color: Int? = null @ColorInt var checkedColor: Int? = null @ColorInt var strokeColor: Int? = null @ColorInt var checkedTextColor: Int? = null @ColorInt var textColor: Int? = null - var typeface: Typeface? = null - set(value) { - textView.typeface = value - } var text: String get() = textView.text.toString() set(value) { @@ -48,10 +45,10 @@ class FilterItem : FrameLayout, Serializable { textView.text = value } - var circlePosition: Float = 0f + val circlePosition: Float get() = (textBackground.width / 2 + 1).toFloat() - var collapsedSize: Int = 0 + val collapsedSize: Int get() = viewLeft.width var cornerRadius: Float = 100f @@ -101,7 +98,7 @@ class FilterItem : FrameLayout, Serializable { viewLeft.performClick() } } - buttonCancel.supportBackgroundTintList = ColorStateList.valueOf(getColor(cancelIconTint)) + ViewCompat.setBackgroundTintList(buttonCancel, ColorStateList.valueOf(cancelIconTint)) isIncreased = true } @@ -194,7 +191,7 @@ class FilterItem : FrameLayout, Serializable { color = removeAlpha(color) val strokeColor = if (isFilterSelected) color else removeAlpha(strokeColor) - val drawable: GradientDrawable = GradientDrawable() + val drawable = GradientDrawable() drawable.cornerRadius = cornerRadius if (color != null) { @@ -211,8 +208,8 @@ class FilterItem : FrameLayout, Serializable { bottomStroke.setBackgroundColor(strokeColor) } - viewLeft.setBackgroundDrawable(drawable) - viewRight.setBackgroundDrawable(drawable) + ViewCompat.setBackground(viewLeft, drawable) + ViewCompat.setBackground(viewRight, drawable) } diff --git a/filter/src/main/res/drawable-xxhdpi/ic_arrow.png b/filter/src/main/res/drawable/ic_arrow.png similarity index 100% rename from filter/src/main/res/drawable-xxhdpi/ic_arrow.png rename to filter/src/main/res/drawable/ic_arrow.png diff --git a/filter/src/main/res/drawable-xxhdpi/ic_cancel.png b/filter/src/main/res/drawable/ic_cancel.png similarity index 100% rename from filter/src/main/res/drawable-xxhdpi/ic_cancel.png rename to filter/src/main/res/drawable/ic_cancel.png diff --git a/filter/src/main/res/layout/item_filter.xml b/filter/src/main/res/layout/item_filter.xml index cc0b578..adec25c 100755 --- a/filter/src/main/res/layout/item_filter.xml +++ b/filter/src/main/res/layout/item_filter.xml @@ -9,7 +9,7 @@ android:layout_height="wrap_content" android:clipChildren="false"> - - @@ -66,7 +66,7 @@ - - -