Android 自定义组件实现圆角ImageView

private int defaultRadius = 0;

private int radius;

private int leftTopRadius;

private int rightTopRadius;

private int rightBottomRadius;

private int leftBottomRadius;

public RadiuImageView(Context context) {

this(context, null);

init(context, null);

}

public RadiuImageView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

init(context, attrs);

}

public RadiuImageView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs);

}

private void init(Context context, AttributeSet attrs) {

if (Build.VERSION.SDK_INT < 18) {

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

}

// 读取配置

TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RoundCornerImageView);

radius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_radius, defaultRadius);

leftTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_left_top_radius, defaultRadius);

rightTopRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_right_top_radius, defaultRadius);

rightBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_right_bottom_radius, defaultRadius);

leftBottomRadius = array.getDimensionPixelOffset(R.styleable.RoundCornerImageView_left_bottom_radius, defaultRadius);

//如果四个角的值没有设置,那么就使用通用的radius的值。

if (defaultRadius == leftTopRadius) {

leftTopRadius = radius;

}

if (defaultRadius == rightTopRadius) {

rightTopRadius = radius;

}

if (defaultRadius == rightBottomRadius) {

rightBottomRadius = radius;

}

if (defaultRadius == leftBottomRadius) {

leftBottomRadius = radius;

}

array.recycle();

}

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

width = getWidth();

height = getHeight();

}

@Override

protected void onDraw(Canvas canvas) {

//这里做下判断,只有图片的宽高大于设置的圆角距离的时候才进行裁剪

int maxLeft = Math.max(leftTopRadius, leftBottomRadius);

int maxRight = Math.max(rightTopRadius, rightBottomRadius);

int minWidth = maxLeft + maxRight;

int maxTop = Math.max(leftTopRadius, rightTopRadius);

int maxBottom = Math.max(leftBottomRadius, rightBottomRadius);

int minHeight = maxTop + maxBottom;

if (width >= minWidth && height > minHeight) {

Path path = new Path();

//四个角:右上,右下,左下,左上

path.moveTo(leftTopRadius, 0);

path.lineTo(width - rightTopRadius, 0);

path.quadTo(width, 0, width, rightTopRadius);

path.lineTo(width, height - rightBottomRadius);

path.quadTo(width, height, width - rightBottomRadius, height);

path.lineTo(leftBottomRadius, height);

path.quadTo(0, height, 0, height - leftBottomRadius);

path.lineTo(0, leftTopRadius);

path.quadTo(0, 0, leftTopRadius, 0);

canvas.clipPath(path);

}

super.onDraw(canvas);

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

以前一直是自己在网上东平西凑的找,找到的东西也是零零散散,很多时候都是看着看着就没了,时间浪费了,问题却还没得到解决,很让人抓狂。

后面我就自己整理了一套资料,还别说,真香!

资料有条理,有系统,还很全面,我不方便直接放出来,大家可以先看看有没有用得到的地方吧。

系列教程图片

2020Android复习资料汇总.png

flutter

NDK

设计思想开源框架

微信小程序

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

图片转存中…(img-YTXPYCiM-1712195743388)]

[外链图片转存中…(img-t4N9RJ9x-1712195743388)]

[外链图片转存中…(img-qe01JnBf-1712195743388)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现这个要求,你可以自定义一个继承自 ImageView 的类,并在其中重写 onMeasure 方法来控制 ImageView 的最大长度和高度。同时,在加载图片时,你可以根据图片的宽高比例来计算缩放比例,然后使用 Matrix 对图片进行缩放操作。 下面是一个示例代码: ```java public class CustomImageView extends ImageView { private int mMaxWidth; // 最大宽度 private int mMaxHeight; // 最大高度 public CustomImageView(Context context) { super(context); init(); } public CustomImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { // 设置默认的最大宽度和高度 mMaxWidth = Integer.MAX_VALUE; mMaxHeight = Integer.MAX_VALUE; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 获取 ImageView 的测量模式和尺寸 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); // 计算根据最大宽度和高度得到的宽度和高度 int maxWidth = Math.min(widthSize, mMaxWidth); int maxHeight = Math.min(heightSize, mMaxHeight); int scaledWidth = widthSize; int scaledHeight = heightSize; // 根据图片的宽高比例计算缩放比例 Drawable drawable = getDrawable(); if (drawable != null) { int imageWidth = drawable.getIntrinsicWidth(); int imageHeight = drawable.getIntrinsicHeight(); float scale = Math.min((float) maxWidth / imageWidth, (float) maxHeight / imageHeight); scaledWidth = (int) (imageWidth * scale); scaledHeight = (int) (imageHeight * scale); } // 根据测量模式设置最终的宽度和高度 int finalWidth = (widthMode == MeasureSpec.EXACTLY) ? widthSize : scaledWidth; int finalHeight = (heightMode == MeasureSpec.EXACTLY) ? heightSize : scaledHeight; // 设置最终的宽度和高度 setMeasuredDimension(finalWidth, finalHeight); } public void setMaxSize(int maxWidth, int maxHeight) { mMaxWidth = maxWidth; mMaxHeight = maxHeight; } } ``` 你可以在布局文件中使用这个自定义的 ImageView,然后通过调用 `setMaxSize()` 方法来设置最大宽度和高度。当加载图片时,ImageView 会按照比例缩放图片来适应最大的宽度和高度限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值