【Android学习笔记】圆角矩形ImageView自定义控件的实现与使用

  在做安卓项目的过程中,我们总会遇到需要以圆角矩形控件来显示图标、图片或者按钮的需求,解决办法有两种,一种是在drawable下创建shape布局xml文件,另一种是自定义一个继承于ImageView的自定义控件类来实现,下面是具体的实现办法。

  首先我们命名一个XCRoundRectImageView类,并继承于ImageView。代码如下:

 1 import android.content.Context;
 2 import android.graphics.Bitmap;
 3 import android.graphics.Bitmap.Config;
 4 import android.graphics.Canvas;
 5 import android.graphics.Paint;
 6 import android.graphics.PixelFormat;
 7 import android.graphics.RectF;
 8 import android.graphics.PorterDuff.Mode;
 9 import android.graphics.PorterDuffXfermode;
10 import android.graphics.Rect;
11 import android.graphics.drawable.BitmapDrawable;
12 import android.graphics.drawable.Drawable;
13 import android.util.AttributeSet;
14 import android.widget.ImageView;
15
16 17
18 /**
19  * Created by Yang on 2016-03-18.
20  * 自定义的圆角矩形ImageView,可以直接当组件在布局中使用。
21  */
22 public class XCRoundRectImageView extends ImageView {
23     private Paint paint;
24
25     public XCRoundRectImageView(Context context) {
26         this(context, null);
27     }
28
29     public XCRoundRectImageView(Context context, AttributeSet attrs) {
30         this(context, attrs, 0);
31     }
32
33     public XCRoundRectImageView(Context context, AttributeSet attrs, int defStyle) {
34         super(context, attrs, defStyle);
35         paint = new Paint();
36     }
37
38     /**
39      * 绘制圆角矩形图片
40      */
41     @Override
42     protected void onDraw(Canvas canvas) {
43         Drawable drawable = getDrawable();
44         if (null != drawable) {
45             Bitmap bitmap = null;
46             if (drawable instanceof BitmapDrawable) {
47                 bitmap = ((BitmapDrawable) drawable).getBitmap();
48             } else if (drawable instanceof AsyncDrawable) {
49                 bitmap = Bitmap.createBitmap(getWidth(),
50                         getHeight(),
51                         drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
52                 Canvas canvas1 = new Canvas(bitmap);
53                 drawable.setBounds(0, 0, getWidth(), getHeight());
54                 drawable.draw(canvas1);
55             }
56             //10为设置的圆角矩形圆角角度大小,可修改
57             Bitmap b = getRoundBitmap(bitmap, 10);
58             final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());
59             final Rect rectDest = new Rect(0, 0, getWidth(), getHeight());
60             paint.reset();
61             canvas.drawBitmap(b, rectSrc, rectDest, paint);
62         } else {
63             super.onDraw(canvas);
64         }
65     }
66
67     /**
68      * 获取圆角矩形图片方法
69      * @param bitmap
70      * @return Bitmap
71      */
72     private Bitmap getRoundBitmap(Bitmap bitmap, int roundPx) {
73         Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
74         Canvas canvas = new Canvas(output);
75         final int color = 0xff424242;
76         final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
77         final RectF rectF = new RectF(rect);
78         paint.setAntiAlias(true);
79         canvas.drawARGB(0, 0, 0, 0);
80         paint.setColor(color);
81         int x = bitmap.getWidth();
82         canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
83         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
84         canvas.drawBitmap(bitmap, rect, rect, paint);
85         return output;
86     }
87 }

只需要在需要圆角矩形的地方引用自定义控件即可,代码如下

<<!--你的包名-->.view.XCRoundRectImageView
                    android:id="@+id/xCRoundRectImageView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
时间: 2024-10-13 01:32:13

【Android学习笔记】圆角矩形ImageView自定义控件的实现与使用的相关文章

Android学习笔记-绘制圆形ImageView实例

现在很多的APP都很喜欢圆形的头像,这里就简单的写个圆形的ImageView~ 第三方圆形ImageView控件: RoundedImageView CircleImageView 实现代码: 自定义ImageView:RoundImageView.java package com.jay.demo.imageviewdemo; import android.content.Context; import android.graphics.Bitmap; import android.graph

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

android学习笔记——利用BaseAdapter生成40个列表项

RT: main.xml ? 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"               android:orientation="vertical"        

android学习笔记——使用QuickContactBadge关联联系人

本文大部分内容来自<疯狂android讲义>. QuickContactBadge继承了ImageView,因此它的本质也是图片,也可以通过android:src属性指定它显示的图片.QuickcontactBadge额外增加的功能是:该图片可以关联到手机中指定联系人,当用户单击该图片时,系统将会打开相应联系人的联系方式界面. 为了让QuickContactBadge与特定联系人关联,可以调用如下方法进行关联. assignContactFromEmail(String emailAddres

Pro Android学习笔记(三):了解Android资源(上)

在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源resource(上).XML解析(XmlPullParser),Android学习笔记(三九):资源resource(下). Strings资源.位于res/values下,可以有一个或多个xml文件.其中最为常见的是strings.xml,对于demo这类小例子,为了方便常全部都放在strings.x

【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 之前,我们直接在activity中执行http通信,在通信过程中可能会出现连接超时.socket超时等情况,超时阈值一般是秒级,例如AndroidHttpClient中设置的20秒,如果出现超时,就

【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 应用有时需要从web中下载一个大文件,并保存在本地,这个操作过程是标准的,因此在Android2.3引入了DownloadManager类.相关的学习也可以参考Android学习笔记(四六):互联网通信-文件下载. 小例子 先看一个小例子,如下图所示.lay

【转】Pro Android学习笔记(三):了解Android资源(上)

在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源resource(上).XML解析(XmlPullParser),Android学习笔记(三九):资源resource(下). Strings资源.位于res/values下,可以有一个或多个xml文件.其中最为常见的是strings.xml,对于demo这类小例子,为了方便常全部都放在strings.x

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE