1.Android åè§ãåå½¢ ImageView å®ç°
2.源码解析,缩缩放Glide加载GIF图的放源原理竟然这么简单
3.Android Notes|玩转 ShapeableImageView
4.ImageView设置backgroundåsrcçåºå«
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。这个类虽然有大约行代码,放源但理解其工作原理并非无迹可寻。缩缩放首先,放源我们注意到一个开始播放第一帧的缩缩放cvs 源码方法,这可能是放源入口点。
代码结构中,缩缩放当GIF有多帧时,会订阅特定事件。关键在于观察三句代码:一是递增帧位置,表明采用无限轮播算法;二是litv源码加载资源回调,通过Target接口来触发;三是消息传递,用Handler进行控制。
在加载资源的回调中,我们看到消息机制在发挥作用。当接收到消息,会根据what参数进行处理。assetstore 源码在handleMessage中,处理了延迟消息和清理消息。延迟消息会获取新帧数据并绘制到ImageView,同时清除旧帧,接着进入下一个帧的加载和清除过程。
总结来说,zeppelin源码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ï¼ï¼æ¹æ³ã