T4M for Unity 2019.unitypackage下载

去除substance相关报错及功能;测试Unity 2019.2.0f1下可以正常使用

文件:590m.com/f/25127180-481123789-745845
(访问密码:551685)

以下内容无关:

-------------------------------------------分割线---------------------------------------------

前段时间打造了一款简单易用功能全面的图片上传组件,现在就来将上传的图片以图片集的形式展现到App上。出于用户体验考虑,加载新图片采用[无限]滚动模式,Android平台上我们优选RecyclerView组件。

显示图片,用的自然是ImageView,然而它并不支持直接加载网络图片,需要先通过其它网络组件(如HttpURLConnection、okhttp3等)将图片获取到本地,得到BitMap数据,然后通过setImageBitmap()加载。
ImageView也有setImageURI(Uri uri)方法,这里uri的命名容易让人产生错觉,其实只能是本地文件路径。

所幸,一些开源组件封装了繁琐的网络操作和缓存策略,提供了易用的API。这里我选择了Glide。

实现#
加载更多#
项布局#
有两个,一个用于列表中各个图片显示,一个显示加载更多/已全部加载放置在列表最末提示用户。

Copy

<ImageView
    android:id="@+id/thumbnail_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"/>
Copy
<TextView
    android:id="@+id/tv_load_more"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="正在加载更多" />
RecyclerView.Adapter# RecyclerView的设计模式网上资料很多,此处不再赘述。先实现RecyclerView.Adapter。

Copy
class ThumbnailListAdapter(
private val thumbnails: List,
private val totalCount: Long,
private val context: Context
) :
RecyclerView.Adapter<ThumbnailListAdapter.ThumbnailViewHolder>() {

// 调用若干次
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ThumbnailViewHolder {
    // viewType就是通过getItemViewType得到的
    val itemView = LayoutInflater.from(context).inflate(viewType, parent, false)
    return ThumbnailViewHolder(itemView)
}

// 搞分页/瀑布加载的同学不要把这个和数据库的总数量搞混,这里的itemCount表示现在内存中数据量
// 我们可以[从后端]获取新数据添加到数据集,以实现loadmore功能
override fun getItemCount(): Int {
    return if (thumbnails.isNotEmpty())
        thumbnails.size + 1 // +1 是因为除了thumbnails数据集之外,还有个写死的loadmore项
    else
        0
}

// R.layout.xxx 是Int类型,可以直接返回
override fun getItemViewType(position: Int): Int {
    return if (position < thumbnails.size)
        R.layout.list_thumbnail_image // 正常图片显示
    else
        R.layout.list_loadmore_footer // 末尾loadmore
}

// 有屏幕外item进入屏幕时就会调用
override fun onBindViewHolder(holder: ThumbnailViewHolder, position: Int) {
    if (position < thumbnails.size) {
        Glide.with(context)
            .load(thumbnails[position].uri)
            .into(holder.itemView.thumbnail_view)
    } else {
        if (thumbnails.size >= totalCount)
            holder.itemView.tv_load_more.text = "全部加载完毕"
    }
}

// 必须这么继承一下
class ThumbnailViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

}
滚动监听#
为RecyclerView添加滚动监听,在合适的时候加载新数据到数据集中。

Copy
recyclerview.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
// 已经在加载则跳过
if (!_thumbnailsLoading) {
// 找到最后可见项的索引
val lastPos = layoutManager.findLastVisibleItemPosition()
val sum = adapter.itemCount
// 当快接近末尾项时(这里差额10,表示再显示10个item就没数据了)获取新数据
if (newState == RecyclerView.SCROLL_STATE_IDLE && sum - lastPos <= 10) {
vm.thumbnails.addAll(vm.getMoreAlbumCovers()) // 加载新数据到数据集中
_thumbnailsLoading = true
}
}
}
})
不要将上面预加载数据和Glide的预加载图片混淆起来,拿到数据,和通过数据中的uri获取图片并下载,这是两个步骤。Glide专门针对RecyclerView提供了预加载方案,是为了减少滑动时图片还未从网络请求导致的等待加载情况,目前只支持LinearLayoutManager或其子类布局

布局#
StaggeredGridLayoutManager#
按列瀑布流显示图片。简单地将RecyclerView的layoutManager设为StaggeredGridLayoutManager实例即可,注意StaggeredGridLayoutManager目前还是beta版。

Copy
val sgLayoutManager =
StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL)
recyclerview.layoutManager = sgLayoutManager
使用StaggeredGridLayoutManager会发现上下滑动过程中,经常发生图片块重排。根据网上说法,这是因为复用的ViewHolder和该ViewHolder要加载的图片,它们的尺寸不一致导致。比如某个ViewHolder之前加载的图片高度为60,之后被回收,但是尺寸信息仍然保留着,后来被一张高度80的图片复用,由于StaggeredGridLayoutManager是根据ViewHolder的尺寸排序布局,尺寸的变化导致发生多次排序。解决方法是在ViewHolder绑定数据时(在RecyclerView.Adapter.onBindViewHolder()中),就事先设置好本次布局的最终尺寸,如下:

Copy
override fun onBindViewHolder(holder: ThumbnailViewHolder, position: Int) {
val layoutParams =
holder.itemView.thumbnail_view.layoutParams as LinearLayout.LayoutParams
//手动设置ViewHolder高度
layoutParams.height = thumbnails[position].height

Glide.with(context).load(thumbnails[position].uri)
    .into(holder.itemView.thumbnail_view)

}
当由下滑回到最顶部时,经常会出现顶部(第一行)的图片相互重排。仔细观察,这是因为第一行初次布局时是按顺序排列而非按空缺插入,往回滑时则是按空缺(哪里最空最先排哪里),这导致顺序可能与初次排序不一致。不过还好,最终仍会按照图片尺寸各自归位。而且这种情况只会出现在第一次由下滑回到顶部时。

GreedoLayoutManager#
StaggeredGridLayoutManager一共有3k多行代码,又是beta版。代码洁癖的我把目光投向了GreedoLayoutManager,它是500px开源的一个LayoutManager,能在保持图片宽高比例的前提下将多张图片拼接到一行显示,原理很简单,看下面动图:
在线动图制作brush.ninja-gif裁剪

替换LayoutManager也相当简单,重新设置下RecyclerView的layoutManager即可。

Copy
val layoutManager =
GreedoLayoutManager(adapter).also { it.setMaxRowHeight(resources.displayMetrics.heightPixels / 3) }
recyclerview.layoutManager = layoutManager
GreedoLayoutManager在布局之前需要知道item的宽高比例,只要让Adapter实现SizeCalculatorDelegate接口即可

Copy
override fun aspectRatioForIndex(index: Int): Double {
val thumbnail = thumbnails[index]
return thumbnail.width / thumbnail.height.toDouble()
}

原文地址:https://blog.csdn.net/gumenghua_com1/article/details/113600565

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...