Фон
Чтобы сделать хороший и краткий обзор элементов на горизонтальном RecyclerView, мы хотим иметь подобную отскоку анимацию, которая начинается с некоторой позиции и переходит к началу RecyclerView (скажем, из пункта 3 в пункт 0),
Эта проблема
По какой-то причине все классы Interpolator, которые я пытаюсь сделать (иллюстрация доступна здесь), похоже, не позволяют элементам выходить за пределы RecyclerView или отказываться от него.
В частности, я пробовал OvershootInterpolator, BounceInterpolator и некоторые другие подобные. Я даже попробовал AnticipateOvershootInterpolator. В большинстве случаев он выполняет простую прокрутку без особого эффекта. на AnticipateOvershootInterpolator, он даже не прокручивает...
Что я пробовал
Вот код POC, который я сделал, чтобы показать проблему:
MainActivity.kt
class MainActivity : AppCompatActivity() {
val handler = Handler()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val itemSize = resources.getDimensionPixelSize(R.dimen.list_item_size)
val itemsCount = 6
recyclerView.adapter = object : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val imageView = ImageView([email protected])
imageView.setImageResource(android.R.drawable.sym_def_app_icon)
imageView.layoutParams = RecyclerView.LayoutParams(itemSize, itemSize)
return object : RecyclerView.ViewHolder(imageView) {}
}
override fun getItemCount(): Int = itemsCount
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
}
}
val itemToGoTo = Math.min(3, itemsCount - 1)
val scrollValue = itemSize * itemToGoTo
recyclerView.post {
recyclerView.scrollBy(scrollValue, 0)
handler.postDelayed({
recyclerView.smoothScrollBy(-scrollValue, 0, BounceInterpolator())
}, 500L)
}
}
}
activity_main.xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
android:layout_height="@dimen/list_item_size" android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
файл градиента
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0-rc02'
implementation 'androidx.core:core-ktx:1.0.0-rc02'
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
implementation 'androidx.recyclerview:recyclerview:1.0.0-rc02'
}
И здесь анимация того, как он выглядит BounceInterpolator, который, как вы можете видеть, не отскакивает вообще:
Пример проекта POC доступен здесь
Вопрос
Почему это не работает должным образом, и как я могу это исправить?
Может ли RecyclerView хорошо работать с Interpolator для прокрутки?
EDIT: кажется, это ошибка, поскольку я не могу использовать какой-либо "интересный" интерполятор для прокрутки RecyclerView, поэтому я сообщил об этом здесь.