需求

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 实现部分圆角图片相关推荐

  1. android 底部通知,Android Fragment实现底部通知栏

    Android Fragment实现底部通知栏,供大家参考,具体内容如下 截图如下: 1. 第一步先要创建fragment(动态注册) 然后将两个勾选取消掉(还有一种是自己手动创建) 会自动生成相对应 ...

  2. android 底部回弹,Android View滚动、拉伸到顶/底部弹性回弹复位

     <Android View滚动.拉伸到顶/底部弹性回弹复位> 我在上一篇文章介绍了如何实现一个Android ListView拉到顶/底部后,像橡皮筋一样弹性回弹复位(<And ...

  3. android 底部动画,Android实现360手机助手底部的动画菜单

    首先来看下我们实现的效果和360效果的对比: 360手机助手效果演示 本库实现的效果(Icon来自360手机助手,侵删) xml布局文件 注:为了美观,讲每个Button的高度以及固定,设置wrap_ ...

  4. android 底部导航,Android 底部导航之BottomNavigationBar

    方式一.BottomNavigationBar实现 效果: BottomNavigationBar效果 利用三方BottomNavigationBar实现 使用步骤: 导入依赖 XML引用 找控件 设 ...

  5. android 底部选项,Android:底部的选项卡

    当年话下 )只需查看FrameLayout(@id/tabcontent)的内容,因为我不知道它在滚动时将如何处理.在我的例子中,它可以工作,因为我使用ListView作为选项卡的内容.希望能有所帮助 ...

  6. 简书 android底部导航,Android BottomNavigationView底部导航栏的使用

    基础使用 先导入依赖(这里以AndroidX为例) implementation 'com.google.android.material:material:1.0.0' 在布局中使用 android ...

  7. android 简单实现圆角,Android 实现圆角图片的简单实例

    Android 实现圆角图片的简单实例 实现效果图: 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出.于是自己自定义了个View,实现图片的圆角以及圆形效 ...

  8. Android BitmapShader 实战 实现圆形、圆角图片

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41967509,本文出自:[张鸿洋的博客] 1.概述 记得初学那会写过一篇博客An ...

  9. Android 开发 设置banner圆角,滑动时,图片圆角失效

    Android 开发中有时需要设置banner图片以圆角显示,设置圆角简单,可以使用自定义ImageView, 但是在滑动过程中会出现直角的情况,这时,只需要对父View进行裁剪即可: main_ba ...

  10. android中图片圆角,Android中实现圆角图片的几种方法

    Android中实现圆角图片有多种姿势,不知你解锁了几种? 方法一:setXfermode法 此种方式就是再new一个相同尺寸的bitmap,然后使用paint.setXfermode(new Por ...

最新文章

  1. 鼠标坏了你别扔,可以修的
  2. 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
  3. jsp_servlet时序图
  4. time时间格式输出转换
  5. python的原则_python 类的使用原则
  6. Qt编写数据可视化大屏界面电子看板12-数据库采集
  7. 关于mono的编译与安装
  8. rsr分档matlab,matlab练习程序(dubins曲线)
  9. 计算机职业核心素养,计算机专业人才核心素养研究-计算机专业论文-计算机论文(10页)-原创力文档...
  10. ESP32 LVGL8.1 ——event 事件 (event 17)
  11. 文件管理,文件判断,时间戳,通配符类命令
  12. ros源码下载及编译
  13. vue 中嵌入iframe页面
  14. 赴北京美国大使馆L1签证面签记
  15. Andriod 实现一个微信聊天框(一)
  16. 【数据知多少】一文学懂通过Tushare、AKshare、baostock、Ashare、Pytdx获取股票行情数据(含代码)
  17. idea配置tomcat日志中文乱码,且修改后idea正常,但cmd窗口任然中文乱码解决方法
  18. Houdini 如何加材质贴图
  19. Windows 无法连接到SENS服务
  20. 多域名指向同一个网站

热门文章

  1. javascript判断日期奇偶_js中判断奇数或偶数
  2. 计算机技能鉴定操作试题,计算机操作员中级操作技能考核试卷职业技能鉴定国家题库...
  3. 骑士聚会问题(PPT截取)
  4. 2dpsk差分相干解调matlab,基于systemview和matlab的2DPSK
  5. 树莓派linux系统识别u盘启动,使用U-Boot让树莓派从U盘启动
  6. java uuid fasterxml_可笑!可悲!可叹!你竟然还不知道Java如何生成UUID?
  7. continue后面的语句还执行吗_循环结构辅助控制语句
  8. apiclod 上传图片_Apicloud——关于上传图片、视频(二)
  9. matlab实验与系统信号实验二,信号与系统上机实验-matlab(第一第二次实验课)new
  10. nacis服务注册原理_HwServiceManager篇Android10.0 HwBinder通信原理(五)