皮皮网
皮皮网

【矩形排料源码】【微微直播间源码】【改变源码的位置】imageview缩放源码_imageview 缩放

来源:源码资本 北京雾芯 发表时间:2024-11-26 06:25:03

1.Android 圆角、圆形 ImageView 实现
2.源码解析,缩缩放Glide加载GIF图的放源原理竟然这么简单
3.Android Notes|玩转 ShapeableImageView
4.ImageView设置background和src的区别

imageview缩放源码_imageview 缩放

Android 圆角、圆形 ImageView 实现

        我们要实现的图片控件继承自 AppCompatImageView ,它是 ImageView 的子类,但提供了更好的兼容性,我们在此基础上添加了若干自定义的属性和方法以实现最终的 NiceImageView :

        要实圆角或者圆形的显示效果,就是对图片显示的内容区域进行“裁剪”,只显示指定的区域即可。如何做呢?

        一种比较直接的办法是这样的,由于图片是被绘制在画布上的,所以用 canvas 的 clipPath() 方法先将画布裁剪成指定形状,这样就能让图片按指定形状显示了,重新 draw() 方法即可:

        这样使用 src 、 background 属性给ImageView设置显示的图片都能达到预期的显示效果。但是由于 clipPath() 方法不支持抗锯齿,图片边缘会有明显的毛糙感,体验并不理想,所以需要寻找其它方法。

        另一种方法是使用图像的 Alpha 合成模式,即

PorterDuff来实现, 官方文档 。这里我们使用其中的DST_IN模式。整个过程就是先绘制目标图像,也就是图片;再绘制原图像,即一个圆角矩形或者圆形,这样最终目标图像只显示和原图像重合的区域。

        到这里就实现了显示为圆角或者圆形了。但是需要通过 src 属性或者对应的方法来设置图片,否则不能达到预期效果。

        绘制边框就相对容易理解了,只需要绘制一个指定样式的圆角矩形或者圆形即可:

        当图片显示为圆形时,还可以绘制一个内边框,但圆角矩形的话由于圆角大小的问题,目前只能设置一个边框咯。

        但是有个问题,绘制的边框会覆盖在图片上,如果边框太宽会导致图片的可见区域变小了,影像显示效果,像这样,左下角的花盆不见了:

        那么如何让边框不覆盖在图片上呢?可以在 Alpha 合成绘制前先将画布缩小一定比例,最后再绘制边框,这样问题就解决了。

        缩放后的ImageView显示区域的宽高就是原宽、高分别减去2倍的边框宽度,这样缩小的比例也就显而易见了。效果如下,左下角的花盆出来了:

        遮罩可以理解为一层带透明度的颜色,遮罩默认不绘制,当制定了遮罩颜色时才会绘制,实现很简单:

        例如加一个透明度%的红色遮罩后的效果:

        核心的实现逻辑就这些了,剩下的就是自定义属性和方法了,有兴趣的可以看源码,都很简单,希望对你有所帮助吧!

        更多细节及用法见GitHub: /SheHuan/NiceImageView

        如果你需要实现类似钉钉的圆形组合头像,例如:

源码解析,Glide加载GIF图的缩缩放原理竟然这么简单

       在探讨之前,让我们明确一点:Android的放源ImageView实际上并不支持直接加载GIF动图,因为ImageView基于Canvas绘制,缩缩放而Canvas仅支持drawBitmap一次绘制一张。放源矩形排料源码那么,缩缩放Glide是放源如何巧妙地让ImageView展现出GIF动画的呢?

       让我们从Glide的源码入手,今天的缩缩放主角是GifDrawable。这个类虽然有大约行代码,放源但理解其工作原理并非无迹可寻。缩缩放首先,放源我们注意到一个开始播放第一帧的缩缩放微微直播间源码方法,这可能是放源入口点。

       代码结构中,缩缩放当GIF有多帧时,会订阅特定事件。关键在于观察三句代码:一是递增帧位置,表明采用无限轮播算法;二是改变源码的位置加载资源回调,通过Target接口来触发;三是消息传递,用Handler进行控制。

       在加载资源的回调中,我们看到消息机制在发挥作用。当接收到消息,会根据what参数进行处理。外贸收款系统源码在handleMessage中,处理了延迟消息和清理消息。延迟消息会获取新帧数据并绘制到ImageView,同时清除旧帧,接着进入下一个帧的加载和清除过程。

       总结来说,怎么阅读dpdk源码Glide加载GIF的原理相当直观:GIF被解析为一系列,通过无限轮播,每次新帧的加载都触发一次请求。在完成绘制后,旧帧会被清除,然后继续下一轮的加载。整个过程通过Handler的消息传递机制驱动循环播放。以上内容摘自Android轮子哥的分享。

Android Notes|玩转 ShapeableImageView

       前言

       在探索 Google 最新 Material Design 更新至 1.2.0 版本时,我留意到 ImageView 的更新,正好借此机会在重构过程中实践一番。若有不足之处,请各位多多指正。

       GitHub 地址:...(此处省略链接)

       最终效果展示:...(此处省略)

       属性概览

       cornerSize:控制图像的角半径大小。

       cornerFamily:定义角的形状类型。

       改进方向:期待更多反馈与学习交流。

       ShapeableImageView 实操

       官方说明指出,ShapeableImageView 提供了简洁的形状使用方法。

       引入依赖:

       1. 圆角

       对应样式:...

       2. 圆形

       对应样式:...

       3. 切角

       对应样式:...

       4. 菱形

       对应样式:...

       5. 右上角圆角

       对应样式:...

       6. 鸡蛋形状

       对应样式:...

       7. 组合弧度

       对应样式:...

       8. 小技巧应用

       对应样式:...

       番外篇 - 源码探索

       通过 R 文件,我们可以查看 ShapeableImageView 所具有的属性。参考官方注释,并结合实践,能初步理解其功能。

       进一步深入源码,获取当前版本提供的样式,例如:...

       最后,通过方法调用获取对应边角的处理方式:...

       期待更多高效实现方法的分享。

       

参考资料:

...

ImageView设置background和src的区别

       ä»Šå¤©å¼€å‘的时候遇到一个小问题,在给一个ImageView更换图片的时候,我使用的是java的方式更换,使用的方法是setBackgroundResource(),但奇怪的是总是没有效果。

       æœ€åŽæŸ¥æ˜ŽåŽŸå› æ˜¯ï¼šæˆ‘在编写xml文件的时候,为了查看效果,给这个ImageView设置了src,这时候再设置background的时候回发生重叠。

       è§£å†³æ–¹æ³•ï¼šå°†xml中的src删除即可。

       é—®é¢˜å»¶ä¼¸ï¼š

       ä¸€ã€ImageView设置background和src的区别。

       1.src是图片内容(前景),bg是背景,可以同时使用。

       2.background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸 。

       3.scaleType只对src起作用;bg可设置透明度。

       äºŒã€ImageView几种不同的设置图片的方式。

       è®¾ç½®background:

       1.image.setBackground(getResources().getDrawable(R.drawable.blackk));//变形

       2.image.setBackgroundResource(R.drawable.blackk);//变形 3.image.setBackgroundDrawable(getResources().getDrawable(R.drawable.blackk));////变形

       æºç ï¼šè¿™ä¸‰ç§æ–¹æ³•çš„实质都是调用方法3setBackgroundDrawable()。

       è®¾ç½®src:

       1.image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); //不会变形

       2.Stringpath=Environment.getExternalStorageDirectory()+File.separator+”test1.jpg”;

       Bitmap bm = BitmapFactory.decodeFile(path);

       image.setImageBitmap(bm);//不会变形

       3.image.setImageResource(R.drawable.blackk);//不会变形

       æºç ï¼š 其中方法2就是将bitmap转换为drawable然后调用方法1,方法1和方法3都是调用updateDrawable()方法。

相关栏目:百科