android 绘制正方形图片,是Android的自定义View-绘制流程-正方形图片控件(SquareImageView)...
前言
了解View的绘制三大流程后,接下来就要对这些知识做一个实践,首先来实现一个在Android中最为常见的控件——方形图片控件,即让图片在一个方形区域内显示,最常见的场景是在九宫格图片当中。
一般的场景需求是图片根据屏幕宽度进行三等分作为边长,来显示图片。
这样需求首先我们会想到根据屏幕宽度计算出每个正方形图片所需要的边长是多少?
就会有下面的步骤:
在xml文件中定义好ImageView控件
通过代码计算出根据屏幕宽度均分后的宽度
再通过代码将计算得出的边长设置到ImageView上
这种方式会出现大量的计算代码,代码会变多,同时复用性不强,那么有什么办法可以让我们在控件内部就将计算逻辑进行封装呢?
这就要开始我们绘制流程的第一个实践——方形图片控件
具体实现
思考方形图片的实现方法的过程中可以想到两种实现方法:
根据图片的宽高进行自绘
继承已有ImageView控件,进行尺寸的运算
第一种方式实现起来很复杂,相比较第二种实现方式,最终的实现结果还不一定好,果断放弃。
那么我们就直接通过第二种方式来进行方形图片的实现,通过继承ImageView,重写onMeasure的方式得到下面的代码:
class SquareImageView(context: Context, attrs: AttributeSet?) : androidx.appcompat.widget.AppCompatImageView(context, attrs) {
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
// // 判断方式一
// val side = min(widthMeasureSpec, heightMeasureSpec)
// setMeasuredDimension(side, side)
// 判断方法二
setMeasuredDimension(widthMeasureSpec, widthMeasureSpec)
}
}
代码提供了两种判断方式:
根据定义的控件较小边为正方形边长来确定图片控件的长宽
直接根据图片控件定义的宽为正方形图片控件的边长
以上两方法都可以实现正方形图片的效果,一般更加倾向于第二种,因为一般图形的宽更适用于实际的需求。
注:setMeasuredDimension是实际设置测量宽高的地方
实际效果
实际看看通过第二种方法实现的方形图片
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="300dp"
android:scaleType="centerCrop"
android:src="@drawable/saber"/>
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="300dp"
android:scaleType="centerCrop"
android:src="@drawable/saber"/>
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="300dp"
android:scaleType="centerCrop"
android:src="@drawable/saber"/>
图片是吾王,吾王赛高!!!咳咳
原图是长图,图片的scaleType设置了centerCrop,实际的效果布局:
效果图
下面是原图:
saber
总结
这种方式实现的方形图适用于列表的Grid模式,可以做到较好的适配。
另外还有一种操作是直接将指定的Spec参数直接放入到super的方法中去,如以下:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec)
}
这种方式不是很推荐,因为会影响到ImageView本身的onMeasure方法中的逻辑。
android 绘制正方形图片,是Android的自定义View-绘制流程-正方形图片控件(SquareImageView)...相关推荐
- Android技术分享| 【Android 自定义View】多人视频通话控件
[Android 自定义View]多人视频通话控件 *以上图片截自微信等待中界面 等待中界面 上图是微信多人视频通话时未接通的界面状态,可见每个人的 View 中大致需包含了以下元素. 头像 昵称 L ...
- Android自定义View系列之进度指示控件
我开通微信公众号啦,如果大家喜欢我的文章,欢迎大家关注我的微信号,我会定期为大家推送Android中的热门知识. 今天为大家介绍另一个自定义View--进度指示器,这个在电商App和支付宝等中经常遇到 ...
- Android自定义View实现下拉刷新控件
路过的老铁同志可以微信搜索"Android小菜",不定期更新Android技术文章.比CSDN更快一步阅读. 本文实现的功能如下: 1.支持下拉刷新: 2.支持上拉加载更多 3.刷 ...
- 自定义View 实现字母快速索引控件
本篇实现的最终效果如下: 该自定义控件详细讲解请关注公众号:Android小菜. 公众号每日一更一篇安卓技术文章,更快更新,讲解更细致.
- Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解
Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...
- Android自定义View绘制闹钟
Android自定义View绘制闹钟 本文简单实现了一个闹钟,扩展View,Canvas绘制 效果如下: 代码如下: package com.gaofeng.mobile.clock_demo;imp ...
- android画a4矩形,Android自定义View绘制原理:画多大?画在哪?画什么?(三)
View绘制就好比画画,抛开Android概念,如果要画一张图,首先会想到哪几个基本问题: 画多大? 画在哪? 怎么画? Android绘制系统也是按照这个思路对View进行绘制,上面这些问题的答案分 ...
- android覆盖扩散动画,[Android]多层波纹扩散动画——自定义View绘制
之前整理过一些属性动画的基本操作,这一段时间的动画相关需求都安然度过了.直到这次-- 一.另一种动画需求 多数交互中的动画都是让单个页面元素动起来,这种就很适合用属性动画实现.但是对于 多个元素.非页 ...
- Android 自定义View绘制电池图标
/*** @anthor GrainRain* @funcation 自定义View绘制电池* @date 2019/8/27*/ public class DrawBatteryView exten ...
- android自定义弧度按钮,Android 自定义View 绘制六边形设置按钮
今天逛酷安的时候,发现酷安的设置按钮(截图的右上角),是一个六边形 + 中心圆的图标,所以又是一个自定义View练习对象了.画圆很简单,知道半径即可,而重点就在画出六边形. 酷安截图.png 最终效果 ...
最新文章
- Python 字符串判断字母 数字 大小写
- Mysql 基本框架 select的全过程
- boost::hana::detail::ebo用法的测试程序
- ASP.NET中下载文件的几种方法
- 【Processing日常2】群星1
- 树莓派之Ubuntu安装远程桌面
- 海湾监控计算机,海湾GST-DH9300电气火灾监控图形显示系统软件
- android 开发书签大全
- java写入文件编码格式为ansi_java 获取文本文件编码格式
- 登录虚拟服务器,虚拟化服务器登录及操作方法说明
- Symantec的SEP服务器(SEPM)从12.1 RU6MP5 升级到14 MP1 操作手册
- 千峰JAVA逆战班Day33
- 十、网络编程(高琪java300集+java从入门到精通笔记)
- 奶牛戴上VR眼镜“看片”,开心了可以多产奶:俄罗斯官方做了实验,拯救奶牛的冬季忧郁...
- android模拟qq进场动画,Android用ViewPager仿QQ实现多页面滑动及动画效果
- 四 IDEA 项目另存为处理
- 【转载】什么样的妻子什么样的人生
- Python Flask项目部署
- matlab复数矩阵 画图,包含矩阵、复数的函数画图问题,请赐教
- 编程语言“破剑式”——编程语言学什么?
热门文章
- 设置按峰值带宽计费_邻道功率比(ACPR)和占用带宽(OBW)
- RF高速电路的电源走线方式
- libstdc++.so.6库环境配置
- IFS认证|国际食品IFS认证优势与审核标准
- vue3源码分析--真的有必要掌握框架的细枝末节吗?
- python利用微信的方法_用Python玩转微信
- 用代码来过端午节---基于HTML的端午节划龙舟小游戏
- 钽电容一般用于电源输出端滤波
- 8则使用的Linux Shell命令
- java课程任务_修真院java后端工程师学习课程--任务1(day three)