首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Swift 探索 UICollectionView 之 SupplementaryView 和 Decoration View

当然,如果苹果开发者团队推出了关于 UICollectionView 的新的技术或者是我在开发中发现了新的技术点,我还是会持续更新这个系列,最终的目的是我希望通过这个系列的文章能把 UICollectionView...答案当然是肯定的,在 UICollectionView 控件中我们管这叫 Supplementary View, 翻译过来就是 "追加视图",那在 UICollectionView 中该怎么实现给每个...它无法通过数据源来设置,而是只能由布局对象来定义和管理。...在接下来的内容中,你将会学到以下知识点: 1.如何在 UICollectionView 中创建 Decoration View2.自定义布局属性,计算 section 的背景图位置和大小3.实现 UICollectionView...但当我真正的去整理它的一些技术点时,我发现它实在是太灵活了,以前觉得追加视图,装饰视图这些东西很简单,几行代码的事情,但事实上,当你想要去实现一些高度自定义的界面的时候,你才会认识到自己的不足,你并没有对这些知识有更深层次的认知

2.2K10

使用Kotlin高效地开发Android App(三)

,转而考虑使用lateinit或者let函数来代替它。 1.3 lateinit 在某个类中,如果某些成员变量没办法在一开始就初始化,并且又不想使用可空类型(也就是带?的类型)。...那么,可以使用lateinit来修饰它。 被lateinit修饰的变量,并不是不初始化,它需要在生命周期流程中进行获取或者初始化。...1.4 let函数 let函数把当前对象作为闭包的it参数,返回值是函数里面最后一行,或者指定return。它看起来有点类似于run函数。...let函数跟run函数的区别是:let函数在函数内可以通过 it 指代该对象。...在项目中,我对toast以及glide框架尝试使用dsl的方式来封装。之前的用法是使用Kotlin的扩展函数,由于团队的其他成员更偏好链式调用,目前暂时保留了两种写法。

88310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Android进阶之绘制-自定义View完全掌握(二)

    ViewPager在运行之后总共会初始化两个页面,最多初始化三个,随着页面的增多,ViewPager会自动销毁前面的页面进而提供给后面的页面使用,这是ViewPage的内容优化,我们可以来验证一下,我在初始化和销毁的方法中都打印了日志...而指示点有多种实现方式,可以通过图片来显示,也可以自己绘制指示点显示,我这种用的是第二种方式。贴出MainActivity的代码。...滑动的页面数量是由适配器的getCount方法决定的,所以,我们在getCount方法里直接返回Integer.MAX_VALUE,这是int的最大值,这个数量已经非常庞大了,可以说近似于无限滑动,但是设置如此大的数量...找到了问题的原因,那就可以有解决办法,既然左边没有页面,那就让它有页面不就得了?我们把第一张图定位到中间位置,那么它的左边和右边就都会拥有数量庞大的页面。...整个案例也就结束了,这只是ViewPager使用的一小部分,这个程序还可以加上很多的功能,比如自动播放,然后点击跳转等等,由于篇幅有限,我就不一一实现了,感兴趣的可以自己尝试着写一写。

    44440

    图片操作系列 —(1)手势缩放图片功能

    ,但是我们发现这个方法需要返回一个Boolean值,这个值决定是否处理后继的缩放事件,返回false时,不会执行onScale()。...2.图片初始化呈现状态 假设我们现在的ImageView设置的是全屏,我们有个小图片,ImageView设置了图片后是这样的: ?...因为这时候不能反而不让他在中心位置,为什么????我们现在的图片是一个安卓机器人,比如我现在要放大它的图片查看它的右眼,我们在右上角用手机不挺放大。变成这样: ? 这时候就说了。...我缩小它,但是我不是从右上角来进行缩小,而是在左边进行缩小,大家知道我们不做处理,这时候缩小的时候是按我们手势的位置进行,所以头像在缩小时候先是往左边方向,然后当小于ImageView的高度时候,又突然居中...所以我们这个例子里面处理方式是:如果宽度都大于ImageView并且图片的右边界还没出现在ImageView中的时候,先按照自己原来的方式缩小,当图片的右边界出现在了ImageView的范围内了,让它慢慢往右边移动

    3.2K10

    Android PowerImageView实现,可以播放动画的强大ImageView

    我们都知道,在Android中如果想要显示一张图片,可以借助ImageView控件来完成,但是如果将一张GIF图片设置到ImageView里,它只会显示这张图片的第一帧,不会产生任何的动画效果。...那么就没有办法在Android里播放GIF图片了吗?当然不是,我们可以通过自定义控件的方式来实现这个功能。...ImageView无法播放GIF图片说明它的功能还不够强大,那么今天我们就来编写一个PowerImageView控件,让它既能支持ImageView控件原生的所有功能,同时还可以播放GIF图片。...可以看到,我们重写了ImageView中所有的构建函数,使得PowerImageView的用法可以和ImageView完全相同。在构造函数中,则是对所有必要的数据进行了初始化操作。...首先,我们调用了getResourceId()方法去获取图片资源对应的id值,在getResourceId()方法内部是通过Java的反射机制来进行获取的。

    1.5K50

    【Android应用开发】 Universal Image Loader ( 使用简介 | 示例代码解析 )

    加载图片到 ImageView : 加载图片, 将图片解析成 Bitmap 对象, 并将 Bitmap 设置到 ImageView 中显示, 或者 其它实现了 ImageAware 接口的 View 对象...异步加载图片 : 加载图片, 将图片解析成 Bitmap 对象, 并在解析完成时返回, 解析返回不是实时同步的; imageLoader.loadImage(imageUri, new SimpleImageLoadingListener...加载图片到 ImageView  : 加载图片, 将图片解析成 Bitmap 对象, 并将 Bitmap 设置到 ImageView 中显示, 或者 其它实现了 ImageAware 接口的 View...异步加载图片 : 加载图片, 将图片解析成 Bitmap 对象, 并在解析完成时返回, 解析返回不是实时同步的; // Load image, decode it to Bitmap and return...配置 (ImageLoaderConfiguration) 在应用全局中有效, 你只需要设置它一次. -- 配置可选性 : 配置中所有的选项都是可选的; -- 默认配置 : 可以查看 ImageLoaderConfiguration.java

    1.1K20

    Android训练课程(Android Training) - 高效的显示图片

    如果是,它尝试调用 cancel()方法去终止上一次的任务。在很少的情况下,新任务的数据匹配已经存在的任务,并且不在需要触发。...这意味着,在初始化之前有机会访问该缓存。为了解决这个问题,在上面的实现中,使用了一个锁对象,以确保在初始化完成之前不能从缓存中读取。 这时,在主UI线程中检查内存缓存,在后台线程中检查磁盘缓存。...在activity被重新创建后,这个重新创建的(保留的)的 Fragment 被重新附加,这样你重新通过它获得到缓存对象,允许图像被快速提取和重新填充到 ImageView 对象。...你可以注意到,在图像填充到activity上时几乎没有滞后,在你获得缓存时是即刻从内存中的。一些图像没有从内存中被找到,也是有希望在磁盘缓存中找到,如果没有找到,就会像平常那样处理。...的演示。它使用了引用计数(通过变量 mDisplayRefCount 和 mCacheRefCount )来追踪 一个位图当前被显示或者在缓存中。

    2.9K00

    Imageloader-mUIHandler的初始化

    UIHandler的初始化我们并没有在init()初始化,考虑到逻辑性和合理性,我们在加载图片的时候进行初始化UIHandler。...思考下,loadImage() 方法,需要根据图片路径,将对应的图片设置到ImageView中,所以loadImage()方法有2个入参,String path 和 ImageView imageView...根据我们的策略:加载图片首先从缓存中查找,如果找到直接返回回调UIHandler的handleMessage()设置图片,如果缓存中没有则开启任务去加载图片并添加到缓存。...这个Task任务是由任务队列TaskQueue管理,所以我们需要将任务添加到任务队列中,然后通过Looper+Message+Handler机制 发送通知,通知后台轮询线程,通知线程池根据用户选择的图片加载策略去获取一个...,防止多次调用图片加载时的混乱 imageView.setTag(path); // 初始化UIHandler if (mUIHandler == null

    19210

    ·第三方网络图片处理框架:SDWebImage(官方文档翻译篇)

    通过从Github下载项目或者使用CocoaPods尝试更简单的方法来尝试这个例子pod try SDWebImage 进入安装步骤 阅读SDWebImage 4.0迁移指南,了解从3.x到4.x的更改...它完全无视HTTP服务器返回的各种缓存控制头,并缓存返回的图像且不受时间限制。这意味着您的图像URL是指向永远不会改变的图像的静态网址。如果指向的图像发生变化,则网址的某些部分应当相应更改。...安装 ---- 在您的项目中使用SDWebImage有三种方法: 使用CocoaPods 使用Carthage 通过将项目复制到您的存储库中 10.1 使用CocoaPods安装 CocoaPods是Objective-C...要安装Carthage,请遵循Carthage的说明 Cartfile github "rs/SDWebImage" 10.3 通过克隆仓库安装 请参阅手动安装 10.4 导入源文件中的headers...在需要使用库的源文件中,导入头文件: #import 10.5 构建工程 到这里,您的workspace应该能没有错误地被构建。

    3.7K20

    Swift 自定义布局实现 Cover Flow 效果

    写在开头 大家早上好,今天我又给大家带来了一篇关于 UICollectionView 系列的文章,在上一篇文章中,我们实现了一个酷炫的瀑布流布局,带大家初步的了解了在 UICollectionView...但是上一篇中实现的自定义布局稍显简单,只能说是比较粗略的计算了下布局各个 item 的位置,搞明白了继承自 UICollectionFlowLayout 子类它需要重载的方法的意义,那么今天这篇文章我们就来实现一个更加复杂的自定义布局...同学你讲的没错,但是当我们 Cell 的 width 加上边距等如果不占满 UICollectionView,那么就会出现一个问题,虽然你实现了分页效果,但是你的 Cell 在滚动的过程中是不会居中的....UICollectionView 停止滚动时,返回一个新的偏移点坐标,它有俩个参数,第一个参数 proposedContentOffset 指的是滚动将要停止时的偏移点坐标,第二个参数 velocity...,那剩下的就是在视图控制器中呈现了,这一步实现起来很简单,也不做赘述了,直接看源码: // // CoverFlowViewController.swift // SwiftScrollBanner

    1.8K20

    Android图片加载框架最全解析(五),Glide强大的图片变换功能

    ()); } ... } 可以看到,我们在onCreate()方法中打印了ImageView默认的scaleType,然后重新运行一下程序,结果如下图所示: ?...回顾一下第二篇文章中我们分析过的into()方法,它是在GenericRequestBuilder类当中的,代码如下所示: public Target into(ImageView...() .into(imageView); 可以看到,这里调用了一个dontTransform()方法,表示让Glide在加载图片的过程中不进行图片变换,这样刚才调用的applyCenterCrop...那么现在得到了裁剪后的Bitmap对象,我们再回到CenterCrop当中,你会看到,在最终返回这个Bitmap对象之前,还会尝试将复用的Bitmap对象重新放回到缓存池当中,以便下次继续使用。...最后,尝试将复用的Bitmap对象重新放回到缓存池当中,并将圆形化变换后的Bitmap对象进行返回。 这样,一个自定义图片变换的功能就写好了,那么现在我们就来尝试使用一下它吧。

    1.8K101

    Kotlin入门教程,快使用Kotlin吧

    ,有通配符和边界的概念比如Class,表示上界通配符,它代表T以及T的子类,上限是T;在kotlin中可以使用out来替代例如clazz: Class in: 同样也有下届通配符比如,它表示...中的单例模式),可以直接通过 类名.方法名或者类名.属性名来直接调用该类中的方法或者属性。...,而次构造函数在类体中申明; 主构造函数没有任何修饰符时可以省略constructor关键字,而次构造函数不能省略; 主构造函数不能包含任何的代码,而次构造函数可以; 主构造函数的参数可以在类体中的属性初始化代码和初始化块中使用...,在函数块内可以通过 this 指代该对象。...apply函数返回的是他传入的对象 使用场景:apply一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值。

    1K10

    Android-教你写小米系统应用--我的小米

    构思 前面的文章中,我们已经了解了如何去自定义一个ViewGroup,可以在onLayout中自由的对子View进行位置设定,我们今天这里刚好需要对上面需求提到的三部分子View(头像ImageView...ACTION_MOVE事件然后不断layout子View在ViewGroup中的位置实现滚动,但是如果完全自己写,逻辑就比较复杂了。...其实Android support V4架包已经为我们提供了ViewDragHelper类,来辅助我们在自定义ViewGroup时,来处理子View的滑动需求。...1.我们先实例化一个ViewDragHelper对象mDragHelper,可以在onAttachedToWindow()方法中初始化,也可以在ViewGroup的构造器中初始化。...符合drag的条件时,我们认为应该让MineMiView拦截事件(onInterceptTouchEvent 返回true即可),然后传递给ViewDragHelper处理来实现滑动,否则触摸事件交给子

    66920

    轮播图-无限循环

    实现无限循环 在getCount()方法中,返回一个很大的值,Integer.MAX_VALUE 在instantiateItem()方法中,获取当前View的索引时,进行取于操作,传递进来的int position...是个非常大的数,对他进行求余数 在destroyItem()方法中,同样 在onPageSelected()监听方法中,对传递进来的索引进行取于 反向的无限循环 调用ViewPager对象的setCurrentItem...()方法,设置第一次进来时候的当前页,参数:int数字,我们把它定位到Integer.MAX_VALUE的中间,并且保证第一条是当前位置,Integer.MAX_VALUE/2-((Integer.MAX_VALUE...super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化...public Object instantiateItem(ViewGroup container, int position) { System.out.println("初始化

    1.8K10

    常用控件之ImageView的使用(一)

    ZoomButton ImageView(图像视图),直接继承自View类,它的主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用 ImageView来显示。...这就不得不要说一下 android:src属性和 android:background的区别了: 在API文档中我们发现 ImageView有两个可以设置图片的属性(任意继承自 View的控件都包含 background...:保持纵横比缩放图片,以使图片能完全覆盖ImageView; centerInside:保持纵横比缩放图片,以使得 ImageView能完全显示该图片; 上述的几个属性小编就不给大家做具体展示了,希望各位小伙伴可以自主尝试...在之前用户安装APP前,只是把APP需要使用的权限列出来给用户告知一下(直接在 AndroidManifest.xml中声明就可以),APP安装后都可以访问这些权限。...而且一些小伙伴阔能使用的是自己的手机,相册都不知道在哪个文件夹下,没关系,接下来我们就教你如何从相册中选取照片并通过 ImageView进行加载!!

    1.7K20

    iOS面试题-UI篇

    可以响应用户事件,Xcode6之后可以方便的通过视图调试功能查看图层之间的关系 UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。...UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和坐标有关的属性,如frame,bounds等,实际上内部都是访问它所在CALayer的相关属性 UIView有个layer属性,可以返回它的主...User Defined Runtime Attributes是一个不被看重但功能非常强大的的特性,它能够通过KVC的方式配置一些你在interface builder中不能配置的属性 当你希望在IB中作尽可能多得事情...UITableView的复用机制 每次创建cell的时候通过dequeueReusableCellWithIdentifier:方法创建cell,它先到缓存池中找指定标识的cell,如果没有就直接返回nil...可以通过纯代码或者xib的方式来封装子控件 建立一个跟view相关的模型,然后将模型数据传给view,通过模型上的数据给view的子控件赋值 /** * 纯代码初始化控件时一定会走这个方法 */

    2K21

    Universal-Image-Loader源码解解析---display过程 + 获取bitmap过程

    Universal-Image-Loader在github上的地址:https://github.com/nostra13/Android-Universal-Image-Loader 它的基本使用请参考我的另一篇博客...中设置了showImageForEmptyUri(R.drawable.ic_empty)则为该视图显示一个默认的空uri时的图片,直接返回。...除非在初始化options选项时设置了postProcesser。 所以我们之间看49行。点开display方法,咦,它是一个接口。 它有几个实现类分别实现不同的图片显示方法。...android中给imageView设置图片的一种方式:imageview.setImageBitmap(bitmap); ImageViewAware是Android imageView的包装类,保持...初始化ImageLoaderConfiguration.Builder时为其设置imageDownloader,如果不设置该变量,则在build()的时候在initEmptyFieldsWithDefaultValues

    84520

    Android Glide加载图片、网络监听、设置资源监听

    三、添加设置资源监听 但如果你的图片很大,网络又不是很好的情况下,就会让用户有一种不好的体验,比如,当你在地铁站里浏览资讯时,此时网络环境很差,你加载图片没有反应,而用户也无法感知,此时就会认为你的软件有问题...; 然后在图片设置资源时,开始时显示加载进度条,完成时隐藏进度条然后显示图片。...,然后通过多参数方法来显示图片,当然这个可以根据实际需求来进行增减,这样写其实就减少了一步操作,可以在程序初始化的时候获取应用的上下文即可,你应该知道是什么了,没错就是Application,你如果不自己写则会使用默认的...,但日常开发中都会自己自定义一个Application,在里面完成一些应用的初始化配置,比如数据库的创建,一个资源库的初始化。...那如果我也要知道这个设置图片资源的监听呢?依葫芦画瓢就行了。 在GlideUtil中增加一个方法。

    5.7K20

    Android 网络学习之获取服务器的图片

    catch block e.printStackTrace(); } } } 运行看效果: 从控制台的打印可以是警告: 网络工作在主线程中异常。...上面的警告就是从4.0以后引入的,如果网络任务在主线程中,就会报警告。所以我们需要开启一个线程来执行网络任务。...} }; //启动线程任务 thread.start(); } 再次运行看效果: 又报出一个警告: 调用错误线程异常,也就是说只有创建它的...handleMessage方法运行在主线程中,所以可以刷新ui 但是平常应用中,比如微信朋友圈的大量图片,第一次浏览时都是先缓冲到本地,第二次浏览时直接从本地读取即可,那我们来实现一下: public...InputStream is = conn.getInputStream(); //读取服务器返回流里的数据,把数据写入到本地

    1.3K31

    Kotlin入门(22)适配器的简单优化

    lateinit的意思是延迟初始化,它放在var或者val前面,表示被修饰的变量属于延迟初始化属性,即使没有初始化也仍然是非空的。...,无需单独构造,也无需手工初始化; 2、像getCount、getItem、getItemId这三个函数,仅仅返回简单运算的数值,可以直接用等号取代大括号; 3、对于视图持有者的内部控件,在变量名称前面添加...lateinit,表示该属性为延迟初始化属性; 网格视图 在前面的列表视图一小节中,给出了Kotlin改写后的适配器类,通过关键字lateinit固然避免了麻烦的空校验,可是控件对象迟早要初始化的呀...context).inflate(R.layout.item_grid_view, null)             holder = ViewHolder(view)             //视图持有者的内部控件对象已经在构造时一并初始化了...}     //ViewHolder中的属性在构造时初始化     inner class ViewHolder(val view: View) {         val ll_item: LinearLayout

    1.4K10
    领券