CrImageBrowserWidget.kt 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package com.cr.widget
  2. import android.content.Context
  3. import android.graphics.BitmapFactory
  4. import android.util.AttributeSet
  5. import android.view.LayoutInflater
  6. import android.view.View
  7. import android.view.ViewGroup
  8. import android.widget.ImageView
  9. import androidx.recyclerview.widget.RecyclerView
  10. import androidx.viewpager2.widget.ViewPager2
  11. import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
  12. import com.cr.common.CrFileManager
  13. import com.cr.cruav.R
  14. import com.cr.data.CrUtil
  15. import java.io.FileInputStream
  16. import java.io.FileNotFoundException
  17. /**
  18. * 操作系统:MAC系统
  19. * 创建者:王成
  20. * 创建日期:2023/6/16 16:19
  21. * 描述:图片浏览器
  22. */
  23. class CrImageBrowserWidget @JvmOverloads constructor(
  24. context: Context,
  25. attrs: AttributeSet? = null,
  26. defStyleAttr: Int = 0
  27. ) : CrConstraintLayoutWidget(context, attrs, defStyleAttr) {
  28. private var viewPager: ViewPager2? = null // define: 2023/6/16 页面滑动组件
  29. private var dataList: MutableList<String> = mutableListOf() // define: 2023/6/16 数据集合
  30. private var adapter: BaseAdapter? = null // define: 2023/6/16 适配器
  31. private var listener:iChangeListener?=null // define: 2023/6/17 对外接口
  32. // todo: 2023/6/17 对外接口
  33. interface iChangeListener{
  34. fun onChange(file:ImageFileModel?)
  35. }
  36. /**
  37. * 初始化
  38. */
  39. init {
  40. initView(R.layout.wg_image_browser)
  41. joinControls()
  42. }
  43. /**
  44. * 挂载控件
  45. */
  46. override fun joinControls() {
  47. super.joinControls()
  48. // todo: 2023/6/16 挂载视图控件
  49. viewPager = findViewById(R.id.wg_pager)
  50. // todo: 2023/6/16 设置适配器
  51. adapter = BaseAdapter(dataList)
  52. viewPager?.adapter = adapter
  53. // todo: 2023/6/17 设置监听
  54. // viewPager?.registerOnPageChangeCallback(pageChangeListener)
  55. }
  56. /**
  57. * 页面滑动监听
  58. */
  59. private var pageChangeListener = object:OnPageChangeCallback(){
  60. // todo: 2023/6/17 选择页面
  61. override fun onPageSelected(position: Int) {
  62. var fileModel = adapter?.crGetSelectItem(position)
  63. if(fileModel != null){
  64. if(listener != null) listener?.onChange(fileModel)
  65. }
  66. }
  67. }
  68. /**
  69. * 适配器
  70. * @property dataList List<String>?
  71. * @constructor
  72. */
  73. internal class BaseAdapter(dataList: MutableList<String>) :
  74. RecyclerView.Adapter<BaseAdapter.BaseViewHolder?>() {
  75. private var dataList: MutableList<String>? = mutableListOf() // define: 2023/6/16 数据集合
  76. private var fileList:MutableList<ImageFileModel>?= mutableListOf() // define: 2023/6/17 文件集合
  77. // todo: 2023/6/16 创建视图
  78. override fun onCreateViewHolder(
  79. parent: ViewGroup,
  80. viewType: Int
  81. ): BaseAdapter.BaseViewHolder {
  82. var itemView: View =
  83. LayoutInflater.from(parent.context).inflate(R.layout.item_image, parent, false)
  84. return BaseViewHolder(itemView)
  85. }
  86. // todo: 2023/6/16 绑定视图
  87. override fun onBindViewHolder(holder: BaseAdapter.BaseViewHolder, position: Int) {
  88. var imagePath = this.dataList!![position]
  89. try {
  90. var fis = FileInputStream(imagePath)
  91. var bitmap = BitmapFactory.decodeStream(fis)
  92. holder.imageView?.setImageBitmap(bitmap)
  93. } catch (ex: FileNotFoundException) {
  94. CrUtil.print("加载图片错误:" + ex.message)
  95. }
  96. }
  97. // todo: 2023/6/16 返回视图数量
  98. override fun getItemCount(): Int {
  99. return dataList!!.size
  100. }
  101. inner class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
  102. var imageView: ImageView? = null // define: 2023/6/16 图片展示控件
  103. /**
  104. * 初始化
  105. */
  106. init {
  107. imageView = itemView.findViewById(R.id.item_img_image)
  108. }
  109. }
  110. /**
  111. * 初始化
  112. */
  113. init {
  114. this.dataList = dataList
  115. initFileList()
  116. }
  117. /**
  118. * 文件初始化
  119. */
  120. private fun initFileList(){
  121. this.fileList?.let {
  122. it.clear()
  123. for(filePath in this.dataList!!){
  124. var model = ImageFileModel(filePath)
  125. it.add(model)
  126. }
  127. }
  128. }
  129. /**
  130. * 更新数据
  131. * @param dataList List<String>
  132. */
  133. fun crUpdate(dataList: MutableList<String>) {
  134. this.dataList = dataList
  135. initFileList()
  136. notifyDataSetChanged()
  137. }
  138. /**
  139. * 返回当前位置的文件模型
  140. * @param position Int 位置
  141. * @return ImageFileModel? 信息
  142. */
  143. fun crGetSelectItem(position:Int):ImageFileModel?{
  144. return this.fileList?.get(position)
  145. }
  146. }
  147. // todo: 2023/6/17 照片模型
  148. class ImageFileModel {
  149. var fileName: String? = null // define: 2023/6/17 图片名称
  150. var fileSize: Long? = 0 // define: 2023/6/17 图片大小
  151. var fileSizeDescription: String? = null // define: 2023/6/17 图片大小描述
  152. var fileFullPath: String? = null // define: 2023/6/17 文件路径
  153. /**
  154. * 初始化
  155. * @param filePth String 文件路径
  156. * @constructor
  157. */
  158. constructor(filePth: String) {
  159. this.fileFullPath = filePth
  160. this.fileName = CrFileManager.getFileName(filePth)
  161. this.fileSize = CrFileManager.getFileSize(filePth)
  162. this.fileSizeDescription = CrFileManager.fileSizeToString(this.fileSize!!)
  163. }
  164. }
  165. /**
  166. * 添加图片
  167. * @param imagePath String 图片路径
  168. */
  169. fun crAppendImage(imagePath: String) {
  170. this.dataList.add(imagePath)
  171. adapter?.crUpdate(this.dataList)
  172. // todo: 2023/6/17 追加了一条数据后注册监听
  173. if(this.dataList.size == 1){
  174. viewPager?.registerOnPageChangeCallback(pageChangeListener)
  175. }
  176. viewPager?.currentItem = this.dataList.size-1
  177. }
  178. /**
  179. * 设置监听
  180. * @param listener iChangeListener 监听
  181. */
  182. fun crSetListener(listener:iChangeListener){
  183. this.listener = listener
  184. }
  185. }