Skip to content

Commit a9aa2e8

Browse files
refactor(lite): 重构多个组件并提升代码质量
-优化 Bitmap 扩展函数,增加图片压缩质量参数 - 改进旋转图片函数,优化内存使用 - 更新适配器代码,提高可读性和性能 -修复 HtmlRenderEngine 中的图片处理逻辑 - 优化屏幕适配和 Glide 使用
1 parent 38edd4b commit a9aa2e8

File tree

11 files changed

+69
-92
lines changed

11 files changed

+69
-92
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ android {
66

77
defaultConfig {
88
applicationId "com.pengxh.kt.lib"
9-
minSdkVersion 23
9+
minSdkVersion 26
1010
targetSdkVersion 33
1111
versionCode 1
1212
versionName "1.0"

app/src/main/java/com/pengxh/kt/lib/fragments/adapter/GridViewImageAdapterFragment.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@ import com.pengxh.kt.lite.base.KotlinBaseFragment
1010
class GridViewImageAdapterFragment : KotlinBaseFragment<FragmentAdapterGridviewImageBinding>() {
1111

1212
private val images = mutableListOf(
13-
"https://img.zcool.cn/community/010d5c5b9d17c9a8012099c8781b7e.jpg@1280w_1l_2o_100sh.jpg",
14-
"https://tse4-mm.cn.bing.net/th/id/OIP-C.6szqS1IlGtWsaiHQUtUOVwHaQC?rs=1&pid=ImgDetMain",
15-
"https://img.zcool.cn/community/01a15855439bdf0000019ae9299cce.jpg@1280w_1l_2o_100sh.jpg",
1613
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
17-
"https://img.zcool.cn/community/010d5c5b9d17c9a8012099c8781b7e.jpg@1280w_1l_2o_100sh.jpg",
18-
"https://tse4-mm.cn.bing.net/th/id/OIP-C.6szqS1IlGtWsaiHQUtUOVwHaQC?rs=1&pid=ImgDetMain",
19-
"https://img.zcool.cn/community/01a15855439bdf0000019ae9299cce.jpg@1280w_1l_2o_100sh.jpg",
14+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
15+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
16+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
17+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
18+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
19+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
20+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
21+
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg",
2022
"https://pic1.zhimg.com/v2-0cc45f5fda6e8ff79350ec1303835629_r.jpg"
2123
)
2224

app/src/main/java/com/pengxh/kt/lib/fragments/extensions/BitmapExtensionFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class BitmapExtensionFragment : KotlinBaseFragment<FragmentExtensionBitmapBindin
6464
if (binding.angleView.text.isNullOrBlank()) {
6565
return@setOnClickListener
6666
}
67-
val rotateImage = originalBitmap.rotateImage(binding.angleView.text.toString().toInt())
67+
val rotateImage = originalBitmap.rotateImage(binding.angleView.text.toString().toFloat())
6868
binding.revolvedImageView.setImageBitmap(rotateImage)
6969
}
7070

app/src/main/java/com/pengxh/kt/lib/fragments/extensions/ImageExtensionFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class ImageExtensionFragment : KotlinBaseFragment<FragmentExtensionImageBinding>
8787
}
8888

8989
private fun bindPreview(cameraProvider: ProcessCameraProvider) {
90-
val screenAspectRatio = if (Build.VERSION.SDK_INT >= 30) {
90+
val screenAspectRatio = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
9191
val metrics = requireActivity().windowManager.currentWindowMetrics.bounds
9292
aspectRatio(metrics.width(), metrics.height())
9393
} else {

lite/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ android {
55
compileSdkVersion 33
66

77
defaultConfig {
8-
minSdkVersion 23
8+
minSdkVersion 26
99
targetSdkVersion 33
1010
versionCode 1
1111
versionName "1.0"

lite/src/main/java/com/pengxh/kt/lite/adapter/EditableImageAdapter.kt

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,22 @@ class EditableImageAdapter(
2929
) : RecyclerView.Adapter<ViewHolder>() {
3030

3131
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
32-
return ViewHolder(
33-
LayoutInflater.from(context).inflate(R.layout.item_editable_rv_g, parent, false)
34-
)
32+
val view = LayoutInflater.from(context).inflate(R.layout.item_editable_rv_g, parent, false)
33+
val imageSize = viewWidth / spanCount
34+
val params = LinearLayout.LayoutParams(imageSize, imageSize)
35+
view.findViewById<ImageView>(R.id.imageView).layoutParams = params
36+
return ViewHolder(view)
3537
}
3638

3739
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
3840
val imageView = holder.getView<ImageView>(R.id.imageView)
39-
val imageSize = viewWidth / spanCount
40-
val params = LinearLayout.LayoutParams(imageSize, imageSize)
41-
imageView.layoutParams = params
42-
4341
if (position == itemCount - 1 && images.size < imageCountLimit) {
4442
imageView.setImageResource(R.drawable.ic_add_pic)
4543
imageView.setOnClickListener { //添加图片
4644
itemClickListener?.onAddImageClick()
4745
}
4846
} else {
49-
Glide.with(context).load(images[position]).into(imageView)
47+
Glide.with(holder.itemView.context).load(images[position]).into(imageView)
5048
imageView.setOnClickListener { // 点击操作,查看大图
5149
itemClickListener?.onItemClick(holder.bindingAdapterPosition)
5250
}
@@ -58,11 +56,7 @@ class EditableImageAdapter(
5856
}
5957
}
6058

61-
override fun getItemCount(): Int = if (images.size >= imageCountLimit) {
62-
imageCountLimit
63-
} else {
64-
images.size + 1
65-
}
59+
override fun getItemCount(): Int = minOf(imageCountLimit, images.size + 1)
6660

6761
private var itemClickListener: OnItemClickListener? = null
6862

lite/src/main/java/com/pengxh/kt/lite/adapter/GridViewImageAdapter.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@ import com.pengxh.kt.lite.extensions.getScreenWidth
1919
class GridViewImageAdapter(private val context: Context, private val images: List<String>) :
2020
BaseAdapter() {
2121

22-
private val screenWidth = context.getScreenWidth()
23-
2422
override fun getItemId(position: Int): Long = position.toLong()
2523

2624
override fun getCount(): Int = images.size
2725

28-
override fun getItem(position: Int): Any = images[position]
26+
override fun getItem(position: Int): Any {
27+
if (position < 0 || position >= images.size) {
28+
throw IndexOutOfBoundsException("Position $position is out of bounds")
29+
}
30+
return images[position]
31+
}
2932

3033
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
3134
val view: View
@@ -39,20 +42,27 @@ class GridViewImageAdapter(private val context: Context, private val images: Lis
3942
view = convertView
4043
holder = view.tag as ItemViewHolder
4144
}
42-
Glide.with(context)
45+
Glide.with(context.applicationContext)
4346
.load(images[position])
4447
.apply(RequestOptions().error(R.mipmap.load_image_error))
4548
.into(holder.imageView)
4649

4750
//动态设置图片高度,和图片宽度保持一致
51+
val screenWidth = context.getScreenWidth()
4852
val padding = (view.paddingLeft + view.paddingRight) * 3
4953
val imageSize = (screenWidth - padding) / 3
50-
val params = LinearLayout.LayoutParams(imageSize, imageSize)
51-
holder.imageView.layoutParams = params
54+
if (holder.cachedLayoutParams == null) {
55+
holder.cachedLayoutParams = LinearLayout.LayoutParams(imageSize, imageSize)
56+
} else {
57+
holder.cachedLayoutParams?.width = imageSize
58+
holder.cachedLayoutParams?.height = imageSize
59+
}
60+
holder.imageView.layoutParams = holder.cachedLayoutParams
5261
return view
5362
}
5463

5564
private class ItemViewHolder {
5665
lateinit var imageView: ImageView
66+
var cachedLayoutParams: LinearLayout.LayoutParams? = null
5767
}
5868
}

lite/src/main/java/com/pengxh/kt/lite/adapter/MultipleChoiceAdapter.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.pengxh.kt.lite.adapter
22

3-
import android.os.Build
43
import android.util.Log
54
import android.view.LayoutInflater
65
import android.view.ViewGroup
@@ -40,16 +39,7 @@ abstract class MultipleChoiceAdapter<T>(
4039
holder.itemView.setOnClickListener {
4140
if (multipleSelected.containsKey(position)) {
4241
multipleSelected.remove(position)
43-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
44-
selectedItems.removeIf { it == dataRows[position] }
45-
} else {
46-
val iterator = selectedItems.iterator()
47-
while (iterator.hasNext()) {
48-
if (iterator.next() == dataRows[position]) {
49-
iterator.remove()
50-
}
51-
}
52-
}
42+
selectedItems.removeIf { it == dataRows[position] }
5343
holder.itemView.isSelected = false
5444
} else {
5545
multipleSelected[position] = true

lite/src/main/java/com/pengxh/kt/lite/extensions/Bitmap.kt

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@ import kotlin.math.min
1919
/**
2020
* 保存图片,不压缩
2121
*/
22-
fun Bitmap.saveImage(imagePath: String) {
22+
fun Bitmap.saveImage(imagePath: String, quality: Int = 100) {
23+
val imageFile = File(imagePath)
2324
try {
24-
val imageFile = File(imagePath)
25-
val fileOutputStream = FileOutputStream(imageFile)
26-
this.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream)
27-
fileOutputStream.flush()
28-
fileOutputStream.close()
25+
FileOutputStream(imageFile).use { fos ->
26+
this.compress(Bitmap.CompressFormat.JPEG, quality, fos)
27+
}
2928
} catch (e: IOException) {
3029
e.printStackTrace()
3130
}
@@ -34,11 +33,24 @@ fun Bitmap.saveImage(imagePath: String) {
3433
/**
3534
* 旋转图片
3635
*/
37-
fun Bitmap.rotateImage(angle: Int): Bitmap {
36+
fun Bitmap.rotateImage(angle: Float): Bitmap {
37+
// 确保在0到360度之间
38+
val rotatedAngle = (angle % 360 + 360) % 360
39+
if (rotatedAngle == 0f) {
40+
return this
41+
}
42+
3843
val matrix = Matrix()
39-
matrix.postRotate(angle.toFloat())
44+
matrix.postRotate(rotatedAngle)
4045
// 创建新的图片
41-
return Bitmap.createBitmap(this, 0, 0, this.width, this.height, matrix, true)
46+
val rotatedBitmap = Bitmap.createBitmap(this, 0, 0, this.width, this.height, matrix, true)
47+
48+
// 尝试复用原Bitmap对象以节省内存
49+
if (rotatedBitmap != this) {
50+
this.recycle()
51+
}
52+
53+
return rotatedBitmap
4254
}
4355

4456
/**

lite/src/main/java/com/pengxh/kt/lite/extensions/Context.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ import android.util.DisplayMetrics
1010
import android.view.WindowInsets
1111
import android.view.WindowManager
1212
import com.pengxh.kt.lite.utils.LiteKitConstant
13-
import java.io.BufferedReader
1413
import java.io.File
1514
import java.io.IOException
16-
import java.io.InputStreamReader
1715
import java.text.SimpleDateFormat
1816
import java.util.Date
1917
import java.util.Locale
@@ -68,20 +66,16 @@ inline fun <reified T> Context.navigatePageTo(index: Int, imageList: ArrayList<S
6866
*/
6967
fun Context.readAssetsFile(fileName: String?): String {
7068
if (fileName.isNullOrBlank()) return ""
71-
try {
72-
val inputStreamReader = InputStreamReader(this.assets.open(fileName))
73-
val bufferedReader = BufferedReader(inputStreamReader)
74-
val data = StringBuilder()
75-
var line: String
76-
while (true) {
77-
line = bufferedReader.readLine() ?: break
78-
data.append(line)
69+
return try {
70+
this.assets.open(fileName).use { inputStream ->
71+
inputStream.bufferedReader().use { bufferedReader ->
72+
bufferedReader.useLines { lines -> lines.joinToString(separator = "") }
73+
}
7974
}
80-
return data.toString()
8175
} catch (e: IOException) {
8276
e.printStackTrace()
77+
""
8378
}
84-
return ""
8579
}
8680

8781
/**

0 commit comments

Comments
 (0)