Android使用Drawable实现圆角矩形
来源:互联网 发布:网络学历教育 编辑:程序博客网 时间:2024/06/06 18:14
第一步:写个类继承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使用Drawable实现圆角矩形
- Android 自定义Drawable 实现圆角矩形和圆形图片
- Drawable的高效用法,实现 圆角矩形,圆形
- Android 使用Drawable实现圆角与圆形图案
- Android drawable实现圆角边框
- android圆角矩形的实现
- android 使用shape自定义圆角矩形
- 【Android界面实现】Drawable Animation 使用介绍
- Android安卓自定义圆角矩形控件,省去定义drawable里面xml的麻烦,轻松编程
- Android Drawable 那些不为人知的高效用法(Drawable实现圆角,应用更广)
- Android Drawable 实现圆形,方形圆角图片
- Android 自定义Drawable 实现圆角圆形图片
- Android 圆角矩形
- android圆角矩形框xml的实现
- android圆角矩形的view实现(转载)
- Android 自定义 RoundImageView 实现圆角矩形或圆形图片
- Android Drawable设计圆角
- 自定义Drawable实现圆形和圆角Drawable
- OkHttp使用详解
- iOS 开源项目及第三方库汇总
- Maven内置隐式变量的使用
- Yii 2 使用记录
- 自定义字符串切割Split函数
- Android使用Drawable实现圆角矩形
- IO模型
- 昨天面试面到equals()和hashCode()关系了
- iOS开发 ☞ Cornerstone (SVN)用法详解
- 八皇后
- Leangoo大讲堂—北京站精彩回顾
- javaScript使用new关键字时发生了什么?
- 命令学习
- ExtJs怎么才能点击一个按钮后,重新打开一个浏览器窗口?