• ViewPager2 滑动图片浏览


    1. 基于 "Gallery 简易图片浏览" 添加

    Gallery 简易图片浏览https://blog.csdn.net/u011193452/article/details/127006679

    2. ViewPager 适配器

      2.1 适配器布局文件 pager_photo_view.xml

    1. "1.0" encoding="utf-8"?>
    2. <io.supercharge.shimmerlayout.ShimmerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:id="@+id/shimmerLayout"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent">
    6. <com.github.chrisbanes.photoview.PhotoView
    7. android:id="@+id/pagerPhoto"
    8. android:layout_width="match_parent"
    9. android:layout_height="match_parent"
    10. android:adjustViewBounds="true" />
    11. io.supercharge.shimmerlayout.ShimmerLayout>

      2.2 创建 ViewPager 适配器 PagerPhotoListAdapter.kt

    1. class PagerPhotoListAdapter : ListAdapter<PhotoItem, PagerPhotoViewHolder>(DiffCallback) {
    2. object DiffCallback : DiffUtil.ItemCallback() {
    3. override fun areItemsTheSame(oldItem: PhotoItem, newItem: PhotoItem): Boolean {
    4. return oldItem == newItem
    5. }
    6. override fun areContentsTheSame(oldItem: PhotoItem, newItem: PhotoItem): Boolean {
    7. return oldItem.photoId == newItem.photoId
    8. }
    9. }
    10. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerPhotoViewHolder {
    11. return PagerPhotoViewHolder(
    12. LayoutInflater.from(parent.context).inflate(R.layout.pager_photo_view, parent, false)
    13. )
    14. }
    15. override fun onBindViewHolder(holder: PagerPhotoViewHolder, position: Int) {
    16. holder.view.shimmerLayout.apply {
    17. setShimmerColor(0x55FFFFFF)
    18. setShimmerAngle(0)
    19. startShimmerAnimation()
    20. }
    21. Glide.with(holder.itemView)
    22. .load(getItem(position).fullUrl)
    23. .placeholder(R.drawable.ic_photo_place_holder)
    24. .listener(object : RequestListener {
    25. override fun onLoadFailed(
    26. e: GlideException?,
    27. model: Any?,
    28. target: Target<Drawable>?,
    29. isFirstResource: Boolean
    30. ): Boolean {
    31. return false
    32. }
    33. override fun onResourceReady(
    34. resource: Drawable?,
    35. model: Any?,
    36. target: Target<Drawable>?,
    37. dataSource: DataSource?,
    38. isFirstResource: Boolean
    39. ): Boolean {
    40. return false.also { holder.view.shimmerLayout.stopShimmerAnimation() }
    41. }
    42. })
    43. .into(holder.view.pagerPhoto)
    44. }
    45. }
    46. class PagerPhotoViewHolder(itemView: View) : ViewHolder(itemView) {
    47. val view = PagerPhotoViewBinding.bind(itemView)
    48. }

    3. ViewPager 浏览图片页

      3.1 Fragment 导航布局, navigation.xml

    1. "1.0" encoding="utf-8"?>
    2. <navigation xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:id="@+id/navigation"
    6. app:startDestination="@id/galleryFragment">
    7. <fragment
    8. android:id="@+id/galleryFragment"
    9. android:name="com.example.gallery.GalleryFragment"
    10. android:label="Gallery"
    11. tools:layout="@layout/fragment_gallery">
    12. <action
    13. android:id="@+id/action_galleryFragment_to_pagerPhotoFragment"
    14. app:destination="@id/pagerPhotoFragment" />
    15. fragment>
    16. <fragment
    17. android:id="@+id/pagerPhotoFragment"
    18. android:name="com.example.gallery.PagerPhotoFragment"
    19. android:label="PagerPhoto"
    20. tools:layout="@layout/fragment_pager_photo" />
    21. navigation>

      3.2 布局文件 frament_pager_photo.xml  

    1. "1.0" encoding="utf-8"?>
    2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:background="@android:drawable/screen_background_dark"
    7. tools:context=".PagerPhotoFragment">
    8. <androidx.viewpager2.widget.ViewPager2
    9. android:id="@+id/viewPager2"
    10. android:layout_width="match_parent"
    11. android:layout_height="match_parent"
    12. android:layout_marginBottom="50dp" />
    13. <TextView
    14. android:id="@+id/photoTag"
    15. android:layout_width="match_parent"
    16. android:layout_height="match_parent"
    17. android:layout_marginBottom="50dp"
    18. android:gravity="bottom|center_horizontal"
    19. android:text="@string/hello_blank_fragment"
    20. android:textColor="@color/white"
    21. android:textSize="20sp" />
    22. FrameLayout>

      3.3 传人值实现 GalleryAdapter.kt

    1. override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    2. val holder = MyViewHolder(
    3. LayoutInflater.from(parent.context).inflate(R.layout.gallery_cell, parent, false)
    4. )
    5. holder.itemView.setOnClickListener {
    6. Bundle().apply {
    7. //putParcelable("PHOTO", getItem(holder.adapterPosition))
    8. //holder.itemView.findNavController().navigate(R.id.action_galleryFragment_to_photoFragment,this)
    9. putParcelableArrayList("PHOTO_LIST", ArrayList(currentList))
    10. putInt("PHOTO_POSITION", holder.adapterPosition)
    11. holder.itemView.findNavController().navigate(R.id.action_galleryFragment_to_pagerPhotoFragment,this)
    12. }
    13. }
    14. return holder
    15. }

      3.4 实现ViewPager页 PagerPhotoFragment.kt

    1. class PagerPhotoFragment : Fragment() {
    2. private lateinit var binding: FragmentPagerPhotoBinding
    3. override fun onCreateView(
    4. inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
    5. ): View? {
    6. binding = FragmentPagerPhotoBinding.inflate(inflater, container, false)
    7. return binding.root
    8. }
    9. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    10. super.onViewCreated(view, savedInstanceState)
    11. val photoList = arguments?.getParcelableArrayList("PHOTO_LIST")
    12. PagerPhotoListAdapter().apply {
    13. binding.viewPager2.adapter = this
    14. submitList(photoList)
    15. }
    16. binding.viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
    17. override fun onPageSelected(position: Int) {
    18. super.onPageSelected(position)
    19. binding.photoTag.text = "${position + 1}/${photoList?.size}"
    20. }
    21. })
    22. binding.viewPager2.setCurrentItem(arguments?.getInt("PHOTO_POSITION") ?: 0, false)
    23. }
    24. }

    4. 效果图

  • 相关阅读:
    .NET 7 中 LINQ 的疯狂性能提升
    React——简便获取经纬度信息
    FreeRTOS教程7 事件组
    队列题目:用栈实现队列
    面试手撕并发算法题
    小程序中的分页查询
    基于SSM的车库智能管理平台设计与实现
    南大通用GBase 8a MPP Cluster管理工具简介
    创建工作生活新范式 开拓经济增长新空间
    [激光原理与应用-35]:《光电检测技术-2》- 光学测量基础 - 认识光源
  • 原文地址:https://blog.csdn.net/u011193452/article/details/127049762