[Android] Animate image appearance in lists

Nicolas Pomepuy git at videolan.org
Fri Aug 2 14:35:46 CEST 2019


vlc-android | branch: master | Nicolas Pomepuy <nicolas.pomepuy at gmail.com> | Thu Aug  1 15:09:31 2019 +0200| [decca21056fc706d50e6bf1c5d55952d574f1e1e] | committer: Geoffrey Métais

Animate image appearance in lists

> https://code.videolan.org/videolan/vlc-android/commit/decca21056fc706d50e6bf1c5d55952d574f1e1e
---

 vlc-android/res/layout/audio_browser_card_item.xml |  2 +-
 vlc-android/res/layout/audio_browser_item.xml      |  2 +-
 vlc-android/res/layout/media_browser_tv_item.xml   |  2 +-
 .../videolan/vlc/gui/audio/AudioBrowserAdapter.kt  |  2 +
 .../org/videolan/vlc/gui/tv/FileTvItemAdapter.kt   |  1 +
 .../org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt  |  1 +
 .../org/videolan/vlc/gui/view/FadableImageView.kt  | 69 ++++++++++++++++++++++
 7 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/vlc-android/res/layout/audio_browser_card_item.xml b/vlc-android/res/layout/audio_browser_card_item.xml
index c3e964d91..34f575638 100644
--- a/vlc-android/res/layout/audio_browser_card_item.xml
+++ b/vlc-android/res/layout/audio_browser_card_item.xml
@@ -62,7 +62,7 @@
 
             <!-- Image loading is handled by org.videolan.vlc.gui.helpers.ImageLoader.loadImage() -->
 
-            <ImageView
+            <org.videolan.vlc.gui.view.FadableImageView
                     android:id="@+id/media_cover"
                     android:layout_width="0dp"
                     android:layout_height="0dp"
diff --git a/vlc-android/res/layout/audio_browser_item.xml b/vlc-android/res/layout/audio_browser_item.xml
index 8452d6d94..634556835 100644
--- a/vlc-android/res/layout/audio_browser_item.xml
+++ b/vlc-android/res/layout/audio_browser_item.xml
@@ -59,7 +59,7 @@
             vlc:layout_constraintStart_toStartOf="parent"
             vlc:layout_constraintTop_toTopOf="@+id/title" />
 
-        <ImageView
+        <org.videolan.vlc.gui.view.FadableImageView
             android:id="@+id/media_cover"
             android:layout_height="@dimen/audio_browser_item_size"
             android:layout_width="0dp"
diff --git a/vlc-android/res/layout/media_browser_tv_item.xml b/vlc-android/res/layout/media_browser_tv_item.xml
index 5a0f29952..8b96ce1ee 100644
--- a/vlc-android/res/layout/media_browser_tv_item.xml
+++ b/vlc-android/res/layout/media_browser_tv_item.xml
@@ -74,7 +74,7 @@
         <!-- Image loading is handled by org.videolan.vlc.gui.helpers.ImageLoader.loadImage() -->
 
 
-        <ImageView
+        <org.videolan.vlc.gui.view.FadableImageView
                 android:id="@+id/media_cover"
                 android:layout_width="match_parent"
                 android:layout_height="0dp"
diff --git a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt
index 1ddefdcdc..2455c0590 100644
--- a/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt
@@ -235,6 +235,7 @@ class AudioBrowserAdapter @JvmOverloads constructor(
             binding.cover = if (cardSize == SHOW_IN_LIST && defaultCover != null) defaultCover else null
             binding.title.text = ""
             binding.subtitle.text = ""
+            binding.mediaCover.resetFade()
         }
 
         override fun setCoverlay(selected: Boolean) {
@@ -272,6 +273,7 @@ class AudioBrowserAdapter @JvmOverloads constructor(
             if (defaultCover != null) binding.cover = defaultCover
             binding.title.text = ""
             binding.subtitle.text = ""
+            binding.mediaCover.resetFade()
         }
 
         override fun setCoverlay(selected: Boolean) {
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt
index fac2d49a7..6833c070a 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/FileTvItemAdapter.kt
@@ -125,6 +125,7 @@ class FileTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, va
             defaultCover?.let { binding.cover = it }
             binding.title.text = ""
             binding.subtitle.text = ""
+            binding.mediaCover.resetFade()
         }
 
         override fun setItem(item: MediaLibraryItem?) {
diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt
index 25b391980..e674b84db 100644
--- a/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt
+++ b/vlc-android/src/org/videolan/vlc/gui/tv/MediaTvItemAdapter.kt
@@ -186,6 +186,7 @@ class MediaTvItemAdapter(type: Int, private val eventsHandler: IEventsHandler, v
             if (defaultCover != null) binding.cover = defaultCover
             binding.title.text = ""
             binding.subtitle.text = ""
+            binding.mediaCover.resetFade()
         }
 
         override fun setItem(item: MediaLibraryItem?) {
diff --git a/vlc-android/src/org/videolan/vlc/gui/view/FadableImageView.kt b/vlc-android/src/org/videolan/vlc/gui/view/FadableImageView.kt
new file mode 100644
index 000000000..a8fd7c8c0
--- /dev/null
+++ b/vlc-android/src/org/videolan/vlc/gui/view/FadableImageView.kt
@@ -0,0 +1,69 @@
+package org.videolan.vlc.gui.view
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.Icon
+import android.net.Uri
+import android.util.AttributeSet
+import androidx.appcompat.widget.AppCompatImageView
+
+class FadableImageView : AppCompatImageView {
+    constructor(context: Context) : super(context)
+
+    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
+
+    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
+
+    private fun fade() {
+        alpha = 0f
+        animate().cancel()
+        animate().alpha(1f)
+    }
+
+    fun resetFade() {
+        animate().cancel()
+        post {
+            alpha = 1f
+        }
+    }
+
+    private fun launchAnim(hasToFade: Boolean) {
+        if (!hasToFade) resetFade() else fade()
+    }
+
+    override fun setBackground(background: Drawable?) {
+        super.setBackground(background)
+        launchAnim(background != null)
+    }
+
+    override fun setBackgroundResource(resid: Int) {
+        super.setBackgroundResource(resid)
+        launchAnim(resid != 0)
+    }
+
+    override fun setImageBitmap(bm: Bitmap?) {
+        launchAnim(bm != null)
+        super.setImageBitmap(bm)
+    }
+
+    override fun setImageDrawable(drawable: Drawable?) {
+        launchAnim(drawable != null)
+        super.setImageDrawable(drawable)
+    }
+
+    override fun setImageIcon(icon: Icon?) {
+        launchAnim(icon != null)
+        super.setImageIcon(icon)
+    }
+
+    override fun setImageResource(resId: Int) {
+        launchAnim(resId != 0)
+        super.setImageResource(resId)
+    }
+
+    override fun setImageURI(uri: Uri?) {
+        launchAnim(uri != null)
+        super.setImageURI(uri)
+    }
+}
\ No newline at end of file



More information about the Android mailing list