2323 */
2424package com.lb.video_trimmer_library.view
2525
26+ import android.annotation.SuppressLint
2627import android.content.Context
2728import android.graphics.Bitmap
29+ import android.graphics.BitmapFactory
2830import android.graphics.Canvas
2931import android.media.MediaMetadataRetriever
3032import android.media.ThumbnailUtils
@@ -33,54 +35,59 @@ import android.os.Build.VERSION
3335import android.os.Build.VERSION_CODES
3436import android.util.AttributeSet
3537import android.util.LongSparseArray
36- import android.util.TypedValue
3738import android.view.View
3839import com.lb.video_trimmer_library.utils.BackgroundExecutor
3940import com.lb.video_trimmer_library.utils.UiThreadExecutor
4041
41- open class TimeLineView @JvmOverloads constructor(context : Context , attrs : AttributeSet ? , defStyleAttr : Int = 0 ) : View(context, attrs, defStyleAttr) {
42+ open class TimeLineView @JvmOverloads constructor(context : Context , attrs : AttributeSet ? , defStyleAttr : Int = 0 ) :
43+ View (context, attrs, defStyleAttr) {
4244 private var videoUri: Uri ? = null
4345 @Suppress(" LeakingThis" )
44- private var heightView: Int = initHeightView()
4546 private var bitmapList: LongSparseArray <Bitmap >? = null
4647
47- open fun initHeightView (): Int = TypedValue .applyDimension(TypedValue .COMPLEX_UNIT_DIP , 40f , context.resources.displayMetrics).toInt().coerceAtLeast(1 )
48-
49- override fun onMeasure (widthMeasureSpec : Int , heightMeasureSpec : Int ) {
50- val minW = paddingLeft + paddingRight + suggestedMinimumWidth
51- val w = View .resolveSizeAndState(minW, widthMeasureSpec, 1 )
52- val minH = paddingBottom + paddingTop + heightView
53- val h = View .resolveSizeAndState(minH, heightMeasureSpec, 1 )
54- setMeasuredDimension(w, h)
55- }
56-
5748 override fun onSizeChanged (w : Int , h : Int , oldW : Int , oldH : Int ) {
5849 super .onSizeChanged(w, h, oldW, oldH)
5950 if (w != oldW)
60- getBitmap(w)
51+ getBitmap(w, h )
6152 }
6253
63- private fun getBitmap (viewWidth : Int ) {
54+ private fun getBitmap (viewWidth : Int , viewHeight : Int ) {
55+ // if (isInEditMode)
56+ // return
57+ // Set thumbnail properties (Thumbs are squares)
58+ val thumbSize = viewHeight
59+ val numThumbs = Math .ceil((viewWidth.toFloat() / thumbSize).toDouble()).toInt()
60+ if (isInEditMode) {
61+ val bitmap = ThumbnailUtils .extractThumbnail(
62+ BitmapFactory .decodeResource(resources, android.R .drawable.sym_def_app_icon)!! , thumbSize, thumbSize
63+ )
64+ bitmapList = LongSparseArray ()
65+ for (i in 0 until numThumbs)
66+ bitmapList!! .put(i.toLong(), bitmap)
67+ return
68+ }
69+ BackgroundExecutor .cancelAll(" " , true )
6470 BackgroundExecutor .execute(object : BackgroundExecutor .Task (" " , 0L , " " ) {
6571 override fun execute () {
6672 try {
6773 val thumbnailList = LongSparseArray <Bitmap >()
6874 val mediaMetadataRetriever = MediaMetadataRetriever ()
6975 mediaMetadataRetriever.setDataSource(context, videoUri)
7076 // Retrieve media data
71- val videoLengthInMs = (Integer .parseInt(mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever .METADATA_KEY_DURATION )) * 1000 ).toLong()
72- // Set thumbnail properties (Thumbs are squares)
73- val thumbSize = heightView
74- val numThumbs = Math .ceil((viewWidth.toFloat() / thumbSize).toDouble()).toInt()
77+ val videoLengthInMs =
78+ mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever .METADATA_KEY_DURATION ).toLong() * 1000L
7579 val interval = videoLengthInMs / numThumbs
7680 for (i in 0 until numThumbs) {
77- var bitmap: Bitmap ?
78- bitmap = if (VERSION .SDK_INT >= VERSION_CODES .O_MR1 )
79- mediaMetadataRetriever.getScaledFrameAtTime(i * interval, MediaMetadataRetriever .OPTION_CLOSEST_SYNC , thumbSize, thumbSize)
80- else
81- mediaMetadataRetriever.getFrameAtTime(i * interval, MediaMetadataRetriever .OPTION_CLOSEST_SYNC )
81+ var bitmap: Bitmap ? = if (VERSION .SDK_INT >= VERSION_CODES .O_MR1 )
82+ mediaMetadataRetriever.getScaledFrameAtTime(
83+ i * interval, MediaMetadataRetriever .OPTION_CLOSEST_SYNC , thumbSize, thumbSize
84+ )
85+ else mediaMetadataRetriever.getFrameAtTime(
86+ i * interval,
87+ MediaMetadataRetriever .OPTION_CLOSEST_SYNC
88+ )
8289 if (bitmap != null )
83- bitmap = ThumbnailUtils .extractThumbnail(bitmap, thumbSize, thumbSize) // Bitmap.createScaledBitmap(bitmap, thumbSize, thumbSize, false);
90+ bitmap = ThumbnailUtils .extractThumbnail(bitmap, thumbSize, thumbSize)
8491 thumbnailList.put(i.toLong(), bitmap)
8592 }
8693 mediaMetadataRetriever.release()
@@ -101,13 +108,14 @@ open class TimeLineView @JvmOverloads constructor(context: Context, attrs: Attri
101108 }, 0L )
102109 }
103110
111+ @SuppressLint(" DrawAllocation" )
104112 override fun onDraw (canvas : Canvas ) {
105113 super .onDraw(canvas)
106114 if (bitmapList != null ) {
107115 canvas.save()
108116 var x = 0
109- for (i in 0 until bitmapList!! .size()) {
110- val bitmap = bitmapList!! .get(i.toLong() )
117+ for (i in 0L until bitmapList!! .size()) {
118+ val bitmap = bitmapList!! .get(i)
111119 if (bitmap != null ) {
112120 canvas.drawBitmap(bitmap, x.toFloat(), 0f , null )
113121 x + = bitmap.width
0 commit comments