Skip to content

Commit 8f9a3d3

Browse files
author
fengpeng
committed
ui fix
1 parent 9a0cb2a commit 8f9a3d3

14 files changed

Lines changed: 166 additions & 115 deletions

File tree

picker/src/main/java/pizzk/media/picker/adapter/AlbumPhotoAdapter.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class AlbumPhotoAdapter(context: Context) : CommonListAdapter<IMedia>(context) {
2626
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
2727
val source = PickLiveSource.source() ?: return
2828
val item: IMedia = source[position] ?: return
29-
holder.itemView.tag = item
3029
//控件初始化
3130
val image: ImageView = holder.getView(R.id.image)!!
3231
val check: ImageView = holder.getView(R.id.check)!!
@@ -35,10 +34,10 @@ class AlbumPhotoAdapter(context: Context) : CommonListAdapter<IMedia>(context) {
3534
val isVideo = item.mediaType() == MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO
3635
vDuration.visibility = if (isVideo) View.VISIBLE else View.GONE
3736
vDuration.text = if (isVideo) TimeUtils.duration(item.duration()) else ""
38-
val disable = PickControl.obtain(clean = false)
39-
.disableFilter()
40-
.invoke(item.uri(), item.mimeType())
41-
check.visibility = if (disable) View.GONE else View.VISIBLE
37+
val enable = PickControl.obtain()
38+
.filter()
39+
.invoke(item)
40+
check.visibility = if (enable) View.VISIBLE else View.GONE
4241
//填充视图
4342
PickControl.imageLoad().load(image, item.uri(), item.mimeType())
4443
//选择

picker/src/main/java/pizzk/media/picker/adapter/PreviewPhotoAdapter.kt

Lines changed: 77 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.provider.MediaStore
55
import android.view.LayoutInflater
66
import android.view.View
77
import android.view.ViewGroup
8+
import android.widget.ImageView
89
import android.widget.VideoView
910
import androidx.viewpager.widget.PagerAdapter
1011
import com.github.chrisbanes.photoview.PhotoView
@@ -31,41 +32,17 @@ class PreviewPhotoAdapter(private val context: Context, private val source: IMed
3132
override fun getCount(): Int = source.count()
3233

3334
override fun instantiateItem(container: ViewGroup, position: Int): Any {
34-
val view: View = if (views.isEmpty()) {
35-
LayoutInflater.from(context).inflate(R.layout.preview_photo_page_item, null)
36-
} else {
37-
views.removeAt(0)
38-
}
35+
val view: View = inflate(context)
3936
container.addView(view, lp)
40-
//
41-
val vPhoto = view.findViewById<PhotoView>(R.id.vPhoto)
42-
vPhoto.setOnScaleChangeListener { _, _, _ -> scaleBlock() }
43-
vPhoto.setOnClickListener(clickBlock)
44-
val vVideo = view.findViewById<VideoView>(R.id.video)
45-
val vPause = view.findViewById<View>(R.id.vPause)
46-
//
37+
val holder: ViewHolder = (view.tag as? ViewHolder) ?: ViewHolder(view)
4738
val media: IMedia? = source[position]
48-
val isVideo = media?.mediaType() == MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO
49-
vVideo.visibility = View.GONE
50-
vPause.visibility = if (isVideo) View.VISIBLE else View.GONE
51-
//
52-
media ?: return view
53-
PickControl.imageLoad().load(vPhoto, media.uri(), media.mimeType())
54-
vVideo.setVideoURI(media.uri())
55-
vVideo.setOnCompletionListener {
56-
vVideo.visibility = View.GONE
57-
}
58-
vVideo.setOnErrorListener { _, _, _ ->
59-
vVideo.visibility = View.GONE
60-
return@setOnErrorListener true
61-
}
62-
vPause.setOnClickListener {
63-
vVideo.stopPlayback()
64-
vVideo.start()
65-
vVideo.resume()
66-
vPlaying = view
67-
vVideo.visibility = View.VISIBLE
68-
}
39+
val video = media?.mediaType() == MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO
40+
holder.show(video)
41+
holder.vPhoto.setOnScaleChangeListener { _, _, _ -> scaleBlock() }
42+
holder.vPhoto.setOnClickListener(clickBlock)
43+
view.setOnClickListener(if (video) clickBlock else null)
44+
holder.load(media)
45+
holder.listenPlaying(video) { vPlaying = view }
6946
return view
7047
}
7148

@@ -95,18 +72,79 @@ class PreviewPhotoAdapter(private val context: Context, private val source: IMed
9572
}
9673

9774
fun stopPlay() {
98-
val view = vCurrent ?: vPlaying ?: return
99-
val vVideo = view.findViewById<VideoView>(R.id.video)
100-
vVideo.stopPlayback()
101-
vVideo.visibility = View.GONE
75+
val view = vPlaying ?: return
76+
val holder: ViewHolder = (view.tag as? ViewHolder) ?: ViewHolder(view)
77+
holder.vVideo.stopPlayback()
78+
holder.setPlaying(false)
10279
vPlaying = null
10380
}
10481

10582
fun getPath(position: Int): String = source[position]?.uri()?.toString() ?: ""
10683

84+
fun get(position: Int): IMedia? = source[position]
85+
10786
fun indexOf(path: String): Int {
10887
val uri = PickUtils.path2Uri(path) ?: return -1
109-
val media = source.of(uri) ?: return -1
110-
return media.index()
88+
for (index: Int in 0..count) {
89+
val media = source[index] ?: continue
90+
if (uri.toString() != media.uri()?.toString()) continue
91+
return if (index >= count) -1 else index
92+
}
93+
return -1
94+
}
95+
96+
private fun inflate(context: Context): View {
97+
if (views.isNotEmpty()) return views.removeAt(0)
98+
return LayoutInflater.from(context).inflate(R.layout.preview_photo_page_item, null)
99+
}
100+
101+
private class ViewHolder(view: View) {
102+
val vPhoto: PhotoView = view.findViewById(R.id.vPhoto)
103+
val vVideo: VideoView = view.findViewById(R.id.video)
104+
val vCover: ImageView = view.findViewById(R.id.vCover)
105+
val vPause: View = view.findViewById(R.id.vPause)
106+
107+
init {
108+
view.tag = this
109+
}
110+
111+
fun show(video: Boolean) {
112+
vPhoto.visibility = if (video) View.GONE else View.VISIBLE
113+
vVideo.visibility = View.GONE
114+
arrayOf(vCover, vPause).forEach {
115+
it.visibility = if (video) View.VISIBLE else View.GONE
116+
}
117+
}
118+
119+
fun load(media: IMedia?) {
120+
val iml = PickControl.imageLoad()
121+
val uri = media?.uri() ?: return
122+
iml.load(vPhoto, uri, media.mimeType())
123+
iml.load(vCover, uri, media.mimeType())
124+
vVideo.setVideoURI(uri)
125+
}
126+
127+
fun listenPlaying(video: Boolean, callback: () -> Unit) {
128+
if (!video) return
129+
vVideo.setOnCompletionListener { setPlaying(false) }
130+
vVideo.setOnErrorListener { _, _, _ ->
131+
setPlaying(false)
132+
return@setOnErrorListener true
133+
}
134+
vPause.setOnClickListener {
135+
callback()
136+
vVideo.stopPlayback()
137+
vVideo.start()
138+
vVideo.resume()
139+
setPlaying(true)
140+
}
141+
}
142+
143+
fun setPlaying(value: Boolean) {
144+
vPhoto.visibility = View.GONE
145+
vVideo.visibility = if (value) View.VISIBLE else View.GONE
146+
vCover.visibility = if (value) View.GONE else View.VISIBLE
147+
vPause.visibility = if (value) View.GONE else View.VISIBLE
148+
}
111149
}
112150
}

picker/src/main/java/pizzk/media/picker/arch/PickControl.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.app.Activity
44
import android.content.Intent
55
import android.net.Uri
66
import androidx.annotation.IntDef
7+
import pizzk.media.picker.source.IMedia
78
import pizzk.media.picker.utils.ImageLoadImpl
89
import pizzk.media.picker.view.PickActivity
910
import java.io.File
@@ -28,14 +29,14 @@ class PickControl private constructor() {
2829
private var imageLoad: ImageLoad = ImageLoadImpl
2930

3031
//默认函数块
31-
private val disableFilter: (Uri?, String) -> Boolean = { _, _ -> false }
32+
private val dFilter: (IMedia) -> Boolean = { _ -> true }
3233
private val dCallback: PickCallback = PickCallback()
3334

3435
//原图标志
3536
private var originQuality: Boolean = false
3637
private val picker: PickControl = PickControl()
3738

38-
fun obtain(clean: Boolean): PickControl = if (clean) picker.clean() else picker
39+
fun obtain(clean: Boolean = false): PickControl = if (clean) picker.clean() else picker
3940

4041
fun authority(value: String) {
4142
this.authority = value
@@ -53,7 +54,9 @@ class PickControl private constructor() {
5354
}
5455

5556
private var action: Int = ACTION_NONE
56-
private var filter: (Uri?, String) -> Boolean = disableFilter
57+
58+
//uri, mimeType, mediaType
59+
private var filter: (IMedia) -> Boolean = dFilter
5760
private var limit: Int = 1
5861
private var callback: PickCallback = dCallback
5962

@@ -76,7 +79,7 @@ class PickControl private constructor() {
7679
*/
7780
fun clean(): PickControl {
7881
action = ACTION_NONE
79-
filter = disableFilter
82+
filter = dFilter
8083
crop = null
8184
limit = 1
8285
title = ""
@@ -116,9 +119,9 @@ class PickControl private constructor() {
116119
}
117120

118121
/**
119-
* 通过URI和MIME过滤
122+
* IMedia过滤
120123
*/
121-
fun disableFilter(block: (uri: Uri?, mime: String) -> Boolean): PickControl {
124+
fun filter(block: (IMedia) -> Boolean): PickControl {
122125
this.filter = block
123126
return this
124127
}
@@ -169,7 +172,7 @@ class PickControl private constructor() {
169172
/**
170173
* 获取过滤器
171174
*/
172-
internal fun disableFilter(): (Uri?, String) -> Boolean = filter
175+
internal fun filter(): (IMedia) -> Boolean = filter
173176

174177
/**
175178
* 获取裁切参数

picker/src/main/java/pizzk/media/picker/source/AlbumMediaSource.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ class AlbumMediaSource(context: Context) : MediaSourceImpl(
5555
*
5656
* @param id bucket id
5757
*/
58-
fun use(id: String?) {
59-
val obj: Cursor = getCursor() as? AlbumMediaCursor ?: return
58+
fun use(id: String?): AlbumMediaSource {
59+
val obj: Cursor = getCursor() as? AlbumMediaCursor ?: return this
6060
val cursor: AlbumMediaCursor = obj as AlbumMediaCursor
6161
offset = cursor.moveToBucket(id, offset)
62+
return this
6263
}
6364
}

picker/src/main/java/pizzk/media/picker/utils/PickPhotoHelper.kt

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package pizzk.media.picker.utils
22

33
import android.app.Activity
44
import android.net.Uri
5+
import android.provider.MediaStore
56
import pizzk.media.picker.R
67
import pizzk.media.picker.arch.CropParams
78
import pizzk.media.picker.arch.PickControl
@@ -12,29 +13,27 @@ import pizzk.media.picker.view.PickChoseActivity
1213
*/
1314
object PickPhotoHelper {
1415

15-
fun show(activity: Activity, limit: Int = 1, cropParams: CropParams? = null,
16-
callback: PickControl.PickCallback) {
16+
fun show(
17+
activity: Activity, limit: Int = 1, cropParams: CropParams? = null,
18+
callback: PickControl.PickCallback
19+
) {
1720
val choiceList: List<String> = listOf(
18-
activity.getString(R.string.pick_chose_camera),
19-
activity.getString(R.string.pick_chose_album)
21+
activity.getString(R.string.pick_chose_camera),
22+
activity.getString(R.string.pick_chose_album)
2023
)
2124
PickChoseActivity.show(activity, choiceList) shown@{ key ->
2225
val action: Int = when (key) {
23-
choiceList[0] -> {
24-
PickControl.ACTION_CAMERA
25-
}
26-
choiceList[1] -> {
27-
PickControl.ACTION_ALBUM
28-
}
26+
choiceList[0] -> PickControl.ACTION_CAMERA
27+
choiceList[1] -> PickControl.ACTION_ALBUM
2928
else -> -1
3029
}
3130
if (action < 0) return@shown
3231
PickControl.obtain(true)
33-
.action(action)
34-
.limit(limit)
35-
.callback(callback)
36-
.crop(cropParams)
37-
.done(activity)
32+
.action(action)
33+
.limit(limit)
34+
.callback(callback)
35+
.crop(cropParams)
36+
.done(activity)
3837
}
3938
}
4039
}

picker/src/main/java/pizzk/media/picker/utils/PickUtils.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ object PickUtils {
104104
fun launchAlbum(activity: AppCompatActivity) {
105105
val access: Boolean = checkPermission(activity, externalPermission, REQUEST_CODE_ALBUM)
106106
if (!access) return
107-
val picker: PickControl = PickControl.obtain(false)
107+
val picker: PickControl = PickControl.obtain()
108108
val uris: List<Uri> = picker.selects().mapNotNull(PickUtils::path2Uri)
109109
val invalidCount: Int = picker.selects().size - uris.size
110110
//去除非本地的图片计数
@@ -139,15 +139,15 @@ object PickUtils {
139139
val uri: Uri = FileProvider.getUriForFile(activity, PickControl.authority(), file)
140140
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
141141
activity.startActivityForResult(intent, REQUEST_CODE_CAMERA)
142-
PickControl.obtain(false).cameraFile(file)
142+
PickControl.obtain().cameraFile(file)
143143
return uri
144144
}
145145

146146
/**
147147
* 启动预览
148148
*/
149149
fun launchPreview(activity: AppCompatActivity) {
150-
val picker: PickControl = PickControl.obtain(false)
150+
val picker: PickControl = PickControl.obtain()
151151
val uris: List<String> = picker.selects()
152152
val index: Int = picker.index()
153153
val selectLimit = 0
@@ -158,7 +158,7 @@ object PickUtils {
158158
* 启动裁剪
159159
*/
160160
fun launchCrop(activity: AppCompatActivity): Uri? {
161-
val cropParams: CropParams? = PickControl.obtain(false).crop()
161+
val cropParams: CropParams? = PickControl.obtain().crop()
162162
//检查裁切参数
163163
if (null == cropParams) {
164164
Log.d(activity::class.java.simpleName, "please special crop params")
@@ -217,7 +217,7 @@ object PickUtils {
217217
activity.grantUriPermission(packageName, destUri, grantFlag)
218218
}
219219
activity.startActivityForResult(intent, REQUEST_CODE_CROP)
220-
PickControl.obtain(false).cropFile(file)
220+
PickControl.obtain().cropFile(file)
221221
return destUri
222222
}
223223

picker/src/main/java/pizzk/media/picker/view/AlbumActivity.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ class AlbumActivity : AppCompatActivity() {
129129
private fun initViews() {
130130
//标题栏
131131
toolbar = findViewById(R.id.toolbar)
132-
toolbar.title = PickControl.obtain(clean = false).title()
132+
toolbar.title = PickControl.obtain().title()
133133
if (toolbar.title.isNullOrEmpty()) {
134134
toolbar.title = getString(R.string.pick_media_select_picture)
135135
}
@@ -178,14 +178,15 @@ class AlbumActivity : AppCompatActivity() {
178178
updateOriginState()
179179
}
180180
tvPreview -> {
181-
val selects: List<String> = photoAdapter.getSelectList()
182-
.mapNotNull(IMedia::uri)
183-
.map(Uri::toString)
181+
val medias = photoAdapter.getSelectList()
182+
val selects: List<String> = medias.mapNotNull(IMedia::uri).map(Uri::toString)
183+
if (selects.isEmpty()) return
184+
val index = medias.firstOrNull()?.index() ?: 0
184185
PreviewActivity.show(
185186
this@AlbumActivity,
186-
emptyList(),
187187
selects,
188-
0,
188+
selects,
189+
index,
189190
photoAdapter.getSelectLimit()
190191
)
191192
}
@@ -278,6 +279,8 @@ class AlbumActivity : AppCompatActivity() {
278279
PickLiveSource.source()?.use(null)
279280
val selects = photoAdapter.getMedias(selectUris)
280281
photoAdapter.updateSelectList(selects)
282+
//recover
283+
PickLiveSource.source()?.use(bucketAdapter.getSelectBucket()?.id)
281284
if (finishFlag) {
282285
finish()
283286
return

0 commit comments

Comments
 (0)