android 底部圆角,android 实现部分圆角图片
需求
recyclerview 展示商品需要显示大量的图片,图片只需要顶部的角是圆角,底部的角是直角
遇到的问题
早期的时候我写过一个实现圆角的图片方式,但是有问题。滑动图片列表发现滑动卡顿,是因为我将drawable 转为Bitmap ,耗时严重 这个方法耗时有1ms~ 47ms,根据图片大小决定,所以滑动就感觉卡卡的
private Bitmap drawable2Bitmap(Drawable drawable){
//获取 Drawable 的内部宽高,包含 padding
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
//创建一个w,h的bitmap
Bitmap bitmap = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
//设置绘画区域
drawable.setBounds(0,0,width,height);
drawable.draw(canvas);
return bitmap;
}
注意
需要跟Glide搭配使用,要使用.asBitmap().placeholder().error().into(target);
优化后的代码
public class FilletImageViewV2 extends android.support.v7.widget.AppCompatImageView {
//最后确认的宽高
private RectF drawRectF;
private Paint mPaint;
private Matrix matrix;
private BitmapShader bitmapShader;
private boolean topLeftRightCorner,bottomLeftRightCorner;//定义上面与下面的是否为圆角
private int radius = 5;
public FilletImageViewV2(Context context) {
this(context,null);
}
public FilletImageViewV2(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public FilletImageViewV2(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
private void init(Context context, AttributeSet attrs){
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.FilletImageView);
topLeftRightCorner = typedArray.getBoolean(R.styleable.FilletImageView_topLeftRightCorner,false);
bottomLeftRightCorner = typedArray.getBoolean(R.styleable.FilletImageView_bottomLeftRightCorner,false);
radius = typedArray.getInt(R.styleable.FilletImageView_filletImageRadius,5);
typedArray.recycle();
mPaint = new Paint();
mPaint.setAntiAlias(true);
matrix = new Matrix();
radius = dip2px(radius);
}
public int getRadius() {
return radius;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
drawRectF = new RectF(0,0,w,h);
}
@Override
protected void onDraw(Canvas canvas) {
//创建一个和原图大小的图片
if (this.getDrawable() == null){
return;
}
Bitmap sourceBitMap = ((BitmapDrawable)this.getDrawable()).getBitmap();
if (sourceBitMap == null){
return;
}
//创建一个和原图大小的图片
long startTime = System.currentTimeMillis(); //起始时间
Bitmap sourceBitMap = ((BitmapDrawable)this.getDrawable()).getBitmap();
long endTime = System.currentTimeMillis(); //结束时间
long runTime = endTime - startTime;
Log.i("test", String.format("方法使用时间 %d ms", runTime));
//BitmapShader 为着色器
bitmapShader = new BitmapShader(sourceBitMap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
// float scaleMax = 1.0f,scaleX=1.0f,scaleY=1.0f;
float scaleMax = 1.0f;
// 如果图片的宽或者高与view的宽高不匹配,计算出需要缩放的比例;缩放后的图片的宽高,一定要大于我们view的宽高;所以我们这里取大值;
if (getWidth() != sourceBitMap.getWidth() || getHeight() !=sourceBitMap.getHeight()){
/* scaleX = (float) getWidth() / (float)sourceBitMap.getWidth();
scaleY = (float)getHeight() / (float)sourceBitMap.getHeight();*/
scaleMax = Math.max((float) getWidth() / (float)sourceBitMap.getWidth(),(float)getHeight() / (float)sourceBitMap.getHeight());
}
//对我们创建出来的bitmap进行缩放
matrix.setScale(scaleMax,scaleMax);
bitmapShader.setLocalMatrix(matrix);
mPaint.setShader(bitmapShader);
//纠正圆角
// int radius = (int) (getRadius() * scaleMax);
//画出我们需要的直角图形
canvas.drawRoundRect(drawRectF,radius,radius,mPaint);
if (topLeftRightCorner){
//左边底部
canvas.drawRect(0,canvas.getHeight() - radius ,radius,canvas.getHeight(),mPaint);
//右边底部
canvas.drawRect(canvas.getWidth() - radius, canvas.getHeight() - radius,canvas.getWidth(),canvas.getHeight(),mPaint);
}
if (bottomLeftRightCorner){
//左边顶部
canvas.drawRect(0,0,radius,radius,mPaint);
//右边顶部
canvas.drawRect(canvas.getWidth() - radius,0,canvas.getWidth(),radius,mPaint);
}
}
public int dip2px(float dipValue){
final float scale = Resources.getSystem().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
}
android 底部圆角,android 实现部分圆角图片相关推荐
- android 底部通知,Android Fragment实现底部通知栏
Android Fragment实现底部通知栏,供大家参考,具体内容如下 截图如下: 1. 第一步先要创建fragment(动态注册) 然后将两个勾选取消掉(还有一种是自己手动创建) 会自动生成相对应 ...
- android 底部回弹,Android View滚动、拉伸到顶/底部弹性回弹复位
<Android View滚动.拉伸到顶/底部弹性回弹复位> 我在上一篇文章介绍了如何实现一个Android ListView拉到顶/底部后,像橡皮筋一样弹性回弹复位(<And ...
- android 底部动画,Android实现360手机助手底部的动画菜单
首先来看下我们实现的效果和360效果的对比: 360手机助手效果演示 本库实现的效果(Icon来自360手机助手,侵删) xml布局文件 注:为了美观,讲每个Button的高度以及固定,设置wrap_ ...
- android 底部导航,Android 底部导航之BottomNavigationBar
方式一.BottomNavigationBar实现 效果: BottomNavigationBar效果 利用三方BottomNavigationBar实现 使用步骤: 导入依赖 XML引用 找控件 设 ...
- android 底部选项,Android:底部的选项卡
当年话下 )只需查看FrameLayout(@id/tabcontent)的内容,因为我不知道它在滚动时将如何处理.在我的例子中,它可以工作,因为我使用ListView作为选项卡的内容.希望能有所帮助 ...
- 简书 android底部导航,Android BottomNavigationView底部导航栏的使用
基础使用 先导入依赖(这里以AndroidX为例) implementation 'com.google.android.material:material:1.0.0' 在布局中使用 android ...
- android 简单实现圆角,Android 实现圆角图片的简单实例
Android 实现圆角图片的简单实例 实现效果图: 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出.于是自己自定义了个View,实现图片的圆角以及圆形效 ...
- Android BitmapShader 实战 实现圆形、圆角图片
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41967509,本文出自:[张鸿洋的博客] 1.概述 记得初学那会写过一篇博客An ...
- Android 开发 设置banner圆角,滑动时,图片圆角失效
Android 开发中有时需要设置banner图片以圆角显示,设置圆角简单,可以使用自定义ImageView, 但是在滑动过程中会出现直角的情况,这时,只需要对父View进行裁剪即可: main_ba ...
- android中图片圆角,Android中实现圆角图片的几种方法
Android中实现圆角图片有多种姿势,不知你解锁了几种? 方法一:setXfermode法 此种方式就是再new一个相同尺寸的bitmap,然后使用paint.setXfermode(new Por ...
最新文章
- 鼠标坏了你别扔,可以修的
- 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
- jsp_servlet时序图
- time时间格式输出转换
- python的原则_python 类的使用原则
- Qt编写数据可视化大屏界面电子看板12-数据库采集
- 关于mono的编译与安装
- rsr分档matlab,matlab练习程序(dubins曲线)
- 计算机职业核心素养,计算机专业人才核心素养研究-计算机专业论文-计算机论文(10页)-原创力文档...
- ESP32 LVGL8.1 ——event 事件 (event 17)
- 文件管理,文件判断,时间戳,通配符类命令
- ros源码下载及编译
- vue 中嵌入iframe页面
- 赴北京美国大使馆L1签证面签记
- Andriod 实现一个微信聊天框(一)
- 【数据知多少】一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)
- idea配置tomcat日志中文乱码,且修改后idea正常,但cmd窗口任然中文乱码解决方法
- Houdini 如何加材质贴图
- Windows 无法连接到SENS服务
- 多域名指向同一个网站
热门文章
- javascript判断日期奇偶_js中判断奇数或偶数
- 计算机技能鉴定操作试题,计算机操作员中级操作技能考核试卷职业技能鉴定国家题库...
- 骑士聚会问题(PPT截取)
- 2dpsk差分相干解调matlab,基于systemview和matlab的2DPSK
- 树莓派linux系统识别u盘启动,使用U-Boot让树莓派从U盘启动
- java uuid fasterxml_可笑!可悲!可叹!你竟然还不知道Java如何生成UUID?
- continue后面的语句还执行吗_循环结构辅助控制语句
- apiclod 上传图片_Apicloud——关于上传图片、视频(二)
- matlab实验与系统信号实验二,信号与系统上机实验-matlab(第一第二次实验课)new
- nacis服务注册原理_HwServiceManager篇Android10.0 HwBinder通信原理(五)