diff --git a/ImagePickerLib/build.gradle b/ImagePickerLib/build.gradle index ec5b19d57b02cd5c14e8d8b6c9794d9eb19ecb94..4b117fc65f6a766dc37ca51548e4c72d615ea694 100644 --- a/ImagePickerLib/build.gradle +++ b/ImagePickerLib/build.gradle @@ -33,7 +33,7 @@ afterEvaluate { groupId = 'com.mx.imgpicker' artifactId = 'MXImagePicker' - version = '1.5.1' + version = '1.5.2' } } } @@ -41,7 +41,7 @@ afterEvaluate { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compileOnly 'androidx.appcompat:appcompat:1.4.0' + compileOnly 'androidx.appcompat:appcompat:1.4.1' compileOnly "androidx.recyclerview:recyclerview:1.2.1" compileOnly 'androidx.constraintlayout:constraintlayout:2.0.4' compileOnly 'com.github.chrisbanes:PhotoView:2.3.0' diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/ImgGridAdapt.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/ImgGridAdapt.kt index 8db3909666c50a79ed7b5f5fa225b4ab1637e4b5..f378277f7a62ae95a2aeedf2e4cd11ff8ea06eae 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/ImgGridAdapt.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/adapts/ImgGridAdapt.kt @@ -13,6 +13,7 @@ import com.mx.imgpicker.app.picker.MXPickerVM import com.mx.imgpicker.models.MXItem import com.mx.imgpicker.models.MXPickerType import com.mx.imgpicker.utils.MXUtils +import com.mx.imgpicker.views.MXAdaptItemView import com.mx.imgpicker.views.MXPickerTextView internal class ImgGridAdapt( @@ -22,24 +23,20 @@ internal class ImgGridAdapt( var onItemClick: ((item: MXItem, list: List) -> Unit)? = null var onTakePictureClick: (() -> Unit)? = null - class ImgVH(itemView: View) : RecyclerView.ViewHolder(itemView) { - val img: ImageView = itemView.findViewById(R.id.img) - val selectBG: ImageView = itemView.findViewById(R.id.selectBG) - val videoTag: View = itemView.findViewById(R.id.videoTag) - val videoLengthTxv: TextView = itemView.findViewById(R.id.videoLengthTxv) - val indexTxv: MXPickerTextView = itemView.findViewById(R.id.indexTxv) - val indexLay: RelativeLayout = itemView.findViewById(R.id.indexLay) - } - class CameraVH(itemView: View) : RecyclerView.ViewHolder(itemView) + class ImgVH(itemView: View) : RecyclerView.ViewHolder(itemView) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return if (viewType == 0) CameraVH( LayoutInflater.from(parent.context) .inflate(R.layout.mx_picker_adapt_img_camera, parent, false) ) else ImgVH( - LayoutInflater.from(parent.context) - .inflate(R.layout.mx_picker_adapt_img_item, parent, false) + MXAdaptItemView(parent.context).apply { + layoutParams = RecyclerView.LayoutParams( + RecyclerView.LayoutParams.MATCH_PARENT, + RecyclerView.LayoutParams.WRAP_CONTENT + ) + } ) } @@ -47,32 +44,11 @@ internal class ImgGridAdapt( if (holder is CameraVH) { holder.itemView.setOnClickListener { onTakePictureClick?.invoke() } } else if (holder is ImgVH) { - holder.indexTxv.visibility = View.VISIBLE - holder.selectBG.visibility = View.VISIBLE val position = if (vm.enableCamera) (position - 1) else position val item = vm.getItem(position) ?: return - holder.img.setImageResource(R.drawable.mx_icon_picker_image_place_holder) - MXImagePicker.getImageLoader()?.invoke(item, holder.img) - val index = vm.getSelectIndexOf(item) - val isSelect = index >= 0 - holder.indexTxv.isChecked = isSelect + val selectIndex = vm.getSelectIndexOf(item) + (holder.itemView as MXAdaptItemView).setData(item, selectIndex, onSelectClick) - if (item.type == MXPickerType.Video) { - holder.videoTag.visibility = View.VISIBLE - holder.videoLengthTxv.text = MXUtils.timeToString(item.duration) - } else { - holder.videoTag.visibility = View.GONE - } - holder.indexLay.setOnClickListener { - onSelectClick?.invoke(item, isSelect) - } - if (isSelect) { - holder.selectBG.alpha = 1f - holder.indexTxv.text = (index + 1).toString() - } else { - holder.selectBG.alpha = 0.2f - holder.indexTxv.text = "" - } holder.itemView.setOnClickListener { onItemClick?.invoke(item, vm.getSelectList()) } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt index 8b9f44d6c6da1cf27710e7aa507495da7943e5ac..e1acadf8e3c1020bfcb3b33b1bcd4ee9100cbb57 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/db/MXDBSource.kt @@ -61,7 +61,7 @@ internal class MXDBSource(val context: Context) { stat.bindString(2, File(item.path).parentFile?.absolutePath) stat.bindString(3, item.type.value) stat.bindString(4, MXSQLiteOpenHelper.VALUE_PRIVATE_SYS) - stat.bindLong(5, item.time) + stat.bindLong(5, item.timeInMs) stat.bindLong(6, item.duration.toLong()) stat.executeInsert() } @@ -210,6 +210,8 @@ internal class MXDBSource(val context: Context) { cursor.getString(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_PRIVATE)) == MXSQLiteOpenHelper.VALUE_PRIVATE_APP val path = cursor.getString(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_PATH)) + val time = + cursor.getLong(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_TIME)) var duration = cursor.getLong(cursor.getColumnIndexOrThrow(MXSQLiteOpenHelper.DB_KEY_VIDEO_LENGTH)) @@ -222,7 +224,7 @@ internal class MXDBSource(val context: Context) { ) return null } - val time = file.lastModified() +// val time = file.lastModified() if (type == MXPickerType.Video && duration <= 0) { duration = MXVideoSource.getVideoLength(file) / 1000 diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/models/beans.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/models/beans.kt index 9571e11016ebd37e674ccaf691a6f40fdcdaf3a4..c829d22503748bb88909275ecf625485645b43f3 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/models/beans.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/models/beans.kt @@ -39,19 +39,19 @@ internal data class MXConfig( val compressType: MXCompressType = MXCompressType.SELECT_BY_USER, // 压缩类型 val compressIgnoreSizeKb: Int = 200, // 图片压缩源文件阈值 val videoMaxLength: Int = -1 // 视频最长时长 -) : Serializable{ +) : Serializable { } /** * 类型对象 * @property path 绝对路径 - * @property time 创建时间 + * @property timeInMs 创建时间 * @property type 对象类型 图片/视频 * @property duration 视频长度 单位:秒 * */ -data class MXItem(val path: String, val time: Long, val type: MXPickerType, val duration: Int = 0) : +data class MXItem(val path: String, val timeInMs: Long, val type: MXPickerType, val duration: Int = 0) : Serializable { private var folderName: String? = null @@ -79,7 +79,7 @@ data class MXItem(val path: String, val time: Long, val type: MXPickerType, val override fun hashCode(): Int { var result = path.hashCode() - result = 31 * result + time.hashCode() + result = 31 * result + timeInMs.hashCode() result = 31 * result + type.hashCode() result = 31 * result + duration return result @@ -90,10 +90,3 @@ data class MXItem(val path: String, val time: Long, val type: MXPickerType, val * 分组对象 */ internal data class MXFolderItem(val name: String, val items: List = ArrayList()) - -/** - * 图片选择回调 - */ -internal interface ItemSelectCall { - fun select(item: MXItem) -} diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXImageSource.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXImageSource.kt index 264949aa91a404421f11aeae3e420709a403f0cd..69fe254e996302c02197d69ec475437d667c6a94 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXImageSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXImageSource.kt @@ -94,7 +94,7 @@ internal object MXImageSource : IMXSource { // val time = File(path).lastModified() / 1000 // 单位:秒 if (path.endsWith("downloading")) return null if (contentResolver.openFileDescriptor(uri, "r") != null) { - return MXItem(path, modify, MXPickerType.Image) + return MXItem(path, modify * 1000, MXPickerType.Image) } } catch (e: java.lang.Exception) { } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXVideoSource.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXVideoSource.kt index dced10743dabeba0cbb539c15244d299b5f08b5a..21a273f1afe3d3a2fe9aa439bf9430ca2e79242c 100644 --- a/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXVideoSource.kt +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/utils/source_loader/MXVideoSource.kt @@ -97,7 +97,7 @@ internal object MXVideoSource : IMXSource { // val time = File(path).lastModified() / 1000 // 单位:秒 if (path.endsWith("downloading")) return null if (contentResolver.openFileDescriptor(uri, "r") != null) { - return MXItem(path, modify, MXPickerType.Video, duration / 1000) + return MXItem(path, modify * 1000, MXPickerType.Video, duration / 1000) } } catch (e: Exception) { } diff --git a/ImagePickerLib/src/main/java/com/mx/imgpicker/views/MXAdaptItemView.kt b/ImagePickerLib/src/main/java/com/mx/imgpicker/views/MXAdaptItemView.kt new file mode 100644 index 0000000000000000000000000000000000000000..e6df74f9e7f748987f3b57c06c4f3f32979e2e3e --- /dev/null +++ b/ImagePickerLib/src/main/java/com/mx/imgpicker/views/MXAdaptItemView.kt @@ -0,0 +1,63 @@ +package com.mx.imgpicker.views + +import android.content.Context +import android.util.AttributeSet +import android.view.View +import android.widget.ImageView +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import com.mx.imgpicker.MXImagePicker +import com.mx.imgpicker.R +import com.mx.imgpicker.models.MXItem +import com.mx.imgpicker.models.MXPickerType +import com.mx.imgpicker.utils.MXUtils +import com.mx.imgpicker.views.MXPickerTextView + +class MXAdaptItemView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null +) : ConstraintLayout(context, attrs) { + init { + View.inflate(context, R.layout.mx_picker_adapt_img_item, this) + } + + private val img: ImageView by lazy { findViewById(R.id.img) } + private val selectBG: ImageView by lazy { findViewById(R.id.selectBG) } + private val videoTag: View by lazy { findViewById(R.id.videoTag) } + private val videoLengthTxv: TextView by lazy { findViewById(R.id.videoLengthTxv) } + private val indexTxv: MXPickerTextView by lazy { findViewById(R.id.indexTxv) } + private val indexLay: RelativeLayout by lazy { findViewById(R.id.indexLay) } + + private var showItem: MXItem? = null + private var selectIndex: Int? = null + + fun setData(item: MXItem, selectIndex: Int, onSelectClick: ((MXItem, Boolean) -> Unit)?) { + indexTxv.visibility = View.VISIBLE + selectBG.visibility = View.VISIBLE + + img.setImageResource(R.drawable.mx_icon_picker_image_place_holder) + MXImagePicker.getImageLoader()?.invoke(item, img) + + val isSelect = selectIndex >= 0 + indexTxv.isChecked = isSelect + + if (item.type == MXPickerType.Video) { + videoTag.visibility = View.VISIBLE + videoLengthTxv.text = MXUtils.timeToString(item.duration) + } else { + videoTag.visibility = View.GONE + } + indexLay.setOnClickListener { + onSelectClick?.invoke(item, isSelect) + } + if (isSelect) { + selectBG.alpha = 1f + indexTxv.text = (selectIndex + 1).toString() + } else { + selectBG.alpha = 0.2f + indexTxv.text = "" + } + this.showItem = item + this.selectIndex = selectIndex + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7b29f828a650714effb9d36e0c06b61091e8703f..d657b7943cd701fbfe751943c449313298d94ebd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,7 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.4.0' + implementation 'androidx.appcompat:appcompat:1.4.1' implementation "androidx.recyclerview:recyclerview:1.2.1" implementation 'com.gitee.zhangmengxiong:MXStarter:v1.0.0' implementation 'com.github.bumptech.glide:glide:4.13.2' diff --git a/build.gradle b/build.gradle index 2729e1c1e5dc78fc368ae01da8419d2f85102f10..87de3f541a92124de3af9ed95a7674013eeda4f6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = "1.6.21" + ext.kotlin_version = "1.7.10" repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/public' } @@ -9,7 +9,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:7.2.1' + classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong @@ -37,5 +37,5 @@ ext { minSdkVersion = 19 versionCode = 1 - versionName = "1.5.1" + versionName = "1.5.2" } \ No newline at end of file