本文实例讲述了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程序设计有所帮助。
本文向大家介绍Android实现圆角矩形和圆形ImageView的方式,包括了Android实现圆角矩形和圆形ImageView的方式的使用技巧和注意事项,需要的朋友参考一下 Android中实现圆角矩形和圆形有很多种方式,其中最常见的方法有ImageLoader设置Option和自定义View。 1.ImageLoader加载图片 ImageLoader.getInstance().displa
本文向大家介绍Android开发实现图片圆角的方法,包括了Android开发实现图片圆角的方法的使用技巧和注意事项,需要的朋友参考一下 本文讲述了Android开发实现图片圆角的方法。分享给大家供大家参考,具体如下: 或者: 更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解
本文向大家介绍Android实现空心圆角矩形按钮的实例代码,包括了Android实现空心圆角矩形按钮的实例代码的使用技巧和注意事项,需要的朋友参考一下 页面上有时会用到背景为空心圆角矩形的Button,可以通过xml绘制出来。 drawrable文件夹下bg_red_hollow_rectangle.xml shape:图形,rectangle为矩形; stoke:描边 solid:填充 corn
本文向大家介绍Android实现自定义ImageView的圆角矩形图片效果,包括了Android实现自定义ImageView的圆角矩形图片效果的使用技巧和注意事项,需要的朋友参考一下 android中的ImageView只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆角矩形的图片,这个时候,我们就需要自定义ImageView了,其原理就是首先获取到图片的Bitmap,然后进行裁剪对
本文向大家介绍iOS实现圆角箭头矩形的提示框,包括了iOS实现圆角箭头矩形的提示框的使用技巧和注意事项,需要的朋友参考一下 先来看看我们见过的一些圆角箭头矩形的提示框效果图 一、了解CGContextRef 首先需要对 CGContextRef 了解, 作者有机会再进行下详细讲解, 这篇中简单介绍下, 方便后文阅读理解. 先了解 CGContextRef 坐标系 坐标系 举例说明 : 对于 商城类
本文向大家介绍Android实现圆形图片或者圆角图片,包括了Android实现圆形图片或者圆角图片的使用技巧和注意事项,需要的朋友参考一下 Android圆形图片或者圆角图片的快速实现,具体内容如下 话不多说直接上code xml文件布局 初始化控件之后用工具类加载 //第一个参数上下文,第二个控件名称,第三个图片url地址,第四个参数圆角大小 ViewUtils.loadImageRadius(
本文向大家介绍Android自定义控件之圆形/圆角的实现代码,包括了Android自定义控件之圆形/圆角的实现代码的使用技巧和注意事项,需要的朋友参考一下 一、问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的: 二、怎么搞? 机智的我,第一想法就是,切一张中间圆形透明、四周与底色相同、尺寸与头像相同的蒙板图片,盖在头像上不就完事了嘛,哈哈哈! 在背景纯色的前提下,这的
我正在尝试生成随机大小的椭圆,并将其绘制到地图上(只是一个二维瓷砖阵列)。在大多数情况下,这是可行的,然而,当房间比它更宽时,它似乎会切断墙角。 下面是我绘制椭圆的代码。基本上是取一个矩形并在其中绘制椭圆。 我这样称呼这种方法。在随机位置生成随机大小的矩形,然后创建墙砖的椭圆,然后用地砖覆盖内侧墙砖。 还有一个额外的问题,有人知道我怎么才能不把1块瓷砖放在椭圆的顶部/底部吗?