Android开发基于Drawable实现圆角矩形的方法
程序员文章站
2023-12-14 16:53:04
本文实例讲述了android开发基于drawable实现圆角矩形的方法。分享给大家供大家参考,具体如下:
第一步:写个类继承drawable,重写里面的方法,实现的核心代...
本文实例讲述了android开发基于drawable实现圆角矩形的方法。分享给大家供大家参考,具体如下:
第一步:写个类继承drawable,重写里面的方法,实现的核心代码在draw里
关键技术:bitmapshader
public bitmapshader(bitmap bitmap,shader.tilemode tilex,shader.tilemode tiley)
调用这个方法来产生一个画有一个位图的渲染器(shader)。
bitmap 在渲染器内使用的位图
tilex the tiling mode for x to draw the bitmap in. 在位图上x方向渲染器平铺模式
tiley the tiling mode for y to draw the bitmap in. 在位图上y方向渲染器平铺模式
tilemode:
clamp :如果渲染器超出原始边界范围,会复制范围内边缘染色。
repeat :横向和纵向的重复渲染器图片,平铺。
mirror :横向和纵向的重复渲染器图片,这个和repeat重复方式不一样,他是以镜像方式平铺。
/** * 四种屏幕尺寸分类:: small, normal, large, and xlarge * 四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) * 四种屏幕的dpi:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi * 四种屏幕对应density:0.75,1,1.5,2 * 四种图片资源文件夹:drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi */ /** * 圆角 * * @project app_view * @package com.android.view.drawable * @author chenlin * @version 1.0 * @note todo */ public class roundimagedrawable extends drawable { private paint mpaint; private bitmap mbitmap; private rectf mrectf; private int mround; public roundimagedrawable(bitmap bitmap) { this.mbitmap = bitmap; mpaint = new paint(); mpaint.setantialias(true); bitmapshader shader = new bitmapshader(mbitmap, tilemode.clamp, tilemode.clamp); mpaint.setshader(shader); } /** * 初始化区域 */ @override public void setbounds(int left, int top, int right, int bottom) { mrectf = new rectf(left, top, right, bottom); super.setbounds(left, top, right, bottom); } /** * 核心代码: 绘制圆角 */ @override public void draw(canvas canvas) { canvas.drawroundrect(mrectf, mround, mround, mpaint); } /** * 暴露给外面设置圆角的大小 * * @param round */ public void setround(int round) { this.mround = round; } /** * getintrinsicwidth、getintrinsicheight主要是为了在view使用wrap_content的时候, * 提供一下尺寸,默认为-1可不是我们希望的 */ @override public int getintrinsicheight() { return mbitmap.getheight(); } @override public int getintrinsicwidth() { return mbitmap.getwidth(); } /** * 根据画笔设定drawable的透明度 */ @override public void setalpha(int alpha) { mpaint.setalpha(alpha); } /** * 根据画笔设定drawable的颜色过滤器 */ @override public void setcolorfilter(colorfilter cf) { mpaint.setcolorfilter(cf); } @override public int getopacity() { return pixelformat.translucent; } }
第二步:实现类
public class roundactivity extends activity { private imageview mimageview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_round_drawable); setcontentview(r.layout.activity_round_drawable); mimageview = (imageview) findviewbyid(r.id.iv_round); bitmap bitmap = bitmapfactory.decoderesource(getresources(), r.drawable.aa); roundimagedrawable drawable = new roundimagedrawable(bitmap); drawable.setround(30); mimageview.setimagedrawable(drawable); } }
activity_round_drawable.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <imageview android:id="@+id/iv_round" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaletype="fitxy" /> </linearlayout>
绘制圆形图片
核心代码:
mwidth = math.min(bitmap.getwidth(), bitmap.getheight()); canvas.drawcircle(mwidth / 2, mwidth / 2, mradius, mpaint);
/** * 圆形 * @project app_view * @package com.android.view.drawable * @author chenlin * @version 1.0 * @note todo */ public class circleimagedrawable extends drawable { private bitmap mbitmap; private paint mpaint; private int mwidth; private int mradius; public circleimagedrawable(bitmap bitmap){ this.mbitmap = bitmap; mpaint.setantialias(true); bitmapshader shader = new bitmapshader(mbitmap, tilemode.clamp, tilemode.clamp); mpaint.setshader(shader); mwidth = math.min(bitmap.getwidth(), bitmap.getheight()); mradius = mwidth / 2; } /** * 核心代码 */ @override public void draw(canvas canvas) { canvas.drawcircle(mwidth / 2, mwidth / 2, mradius, mpaint); } /** * getintrinsicwidth、getintrinsicheight主要是为了在view使用wrap_content的时候, * 提供一下尺寸,默认为-1可不是我们希望的 */ @override public int getintrinsicheight() { return mwidth; } @override public int getintrinsicwidth() { return mwidth; } @override public void setalpha(int alpha) { mpaint.setalpha(alpha); } @override public void setcolorfilter(colorfilter cf) { mpaint.setcolorfilter(cf); } @override public int getopacity() { return pixelformat.translucent; } }
更多关于android相关内容感兴趣的读者可查看本站专题:《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。
推荐阅读