博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中自定义圆形图片(一)
阅读量:4188 次
发布时间:2019-05-26

本文共 3905 字,大约阅读时间需要 13 分钟。

android中自定义圆形图片

1,前天写了自定义属性,今天就来介绍一下自定义圆形图片。其实再写自定义圆形图片时也没用到自定义属性;

2,在写这个时将会用到几个控件:

Paint(画笔)

用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等 直接使用无参构造方法就可以创建Paint实例: Paint paint = new Paint( );

可以通过下述方法来设置Paint(画笔)的相关属性,另外,关于这个属性有两种, 图形绘制相关与文本绘制相关:

setARGB(int a,int r,int g,int b): 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。

setAlpha(int a): 设置绘制图形的透明度。

setColor(int color): 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。

setAntiAlias(boolean aa): 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。

setDither(boolean dither): 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰

3,画笔有了,自然会少不了Canvas(画布):

首先是构造方法,Canvas的构造方法有两种:

Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。

Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,将内容都绘制在bitmap上,因此bitmap不得为null。

4,drawXXX()方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层。 比如:

drawCircle(float cx, float cy, float radius,Paint paint): 绘制圆,参数一是中心点的x轴,参数二是中心点的y轴,参数三是半径,参数四是paint对象;

drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint);对图片剪接和限定显示区域Rect src: 是对图片进行裁截,若是空null则显示整个图片RectF dst:是图片在Canvas画布中显示的区域,大于src则把src的裁截区放大,小于src则把src的裁截区缩小

5,我们知道ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值

这都是色彩的存储方法:

ALPHA_8就是Alpha由8位组成

ARGB_4444就是由4个4位组成即16位,
ARGB_8888就是由4个8位组成即32位,
RGB_565就是R为5位,G为6位,B为5位共16位

由此可见:

ALPHA_8 代表8位Alpha位图
ARGB_4444 代表16位ARGB位图
ARGB_8888 代表32位ARGB位图

RGB_565 代表8位RGB位图位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。

6,paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));这句代码是为paint设置绘图模式,具体含义如下:

setXfermode设置两张图片相交时的模式。

就是在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。

下面给你们贴一下代码:

这里写代码片xml布局

这里写代码片

MainActivity代码

public class MainActivity extends Activity {
private ImageView img;
private String path = ““;

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    img = (ImageView) findViewById(R.id.img);    loadImg();}private void loadImg() {    new Thread(new Runnable() {        @Override        public void run() {            try {                URL url = new URL(path);                HttpURLConnection conn = (HttpURLConnection) url                        .openConnection();                InputStream in = conn.getInputStream();                final Bitmap bitmap = BitmapFactory.decodeStream(in);                final Bitmap bit = getBound(bitmap);                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // TODO Auto-generated method stub                        if (bitmap != null) {                            img.setImageBitmap(bit);                        }                    }                });            } catch (MalformedURLException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }).start();}private Bitmap getBound(Bitmap bitmap) {    // 根据传入的bitmap创建一个bitmap2,宽高根据bitmap,并改变图片格式    Bitmap bitmap2 = Bitmap.createBitmap(bitmap.getWidth(),            bitmap.getHeight(), Config.ARGB_4444);    // 创建画布并将bitmap2当作画布的背景    Canvas canvas = new Canvas(bitmap2);    // 创建画布并设为抗锯齿    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);    // 设置画笔颜色    paint.setColor(Color.RED);    // 设置画布填充色    canvas.drawARGB(0, 0, 0, 0);    // 计算绘制圆的半径    float radius = Math.min(bitmap.getWidth(), bitmap.getHeight()) / 2;    // 根据bitmap的宽高的中心点为圆点和圆的半径画圆    canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2,            radius, paint);    // 重置画笔    paint.reset();    // 两个view重叠的部分    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));    // 把bitmap画到画布上 第一个0代表位图左边的位置;第二个0代表顶部的位置;    canvas.drawBitmap(bitmap, 0, 0, paint);    return bitmap2;}

}

我写的这个是从网上获取的图片,千万不要忘记加联网权限,然后进行搓圆;

重要内容

需要加联网权限

下面看一下效果图:

这里写图片描述

好了,功能也就实现了,哈哈哈,还有另一用写法,下篇我将写出来让大家看下。。。。。。

你可能感兴趣的文章
一个开源的IoC采集服务器体系结构设计
查看>>
“人民币找零”问题的贪婪法解决算法
查看>>
“装箱”问题的贪婪法解决算法
查看>>
“马的遍历”问题的贪婪法解决算法
查看>>
国际象棋“皇后”问题的回溯算法
查看>>
长整数的基本操作
查看>>
用长整数求取普通整数的阶乘
查看>>
竞赛选手问题的解答算法
查看>>
逐月对比的交叉表处理
查看>>
特殊分页处理
查看>>
树形数据转换
查看>>
展开BOM
查看>>
触发器维护已经用编号/未用编号
查看>>
比较两个数据库的表结构差异
查看>>
将表/查询存储为标准的XML文件
查看>>
查询数据库中,表结构的详细信息
查看>>
通过作业,定时同步两个数据库
查看>>
导入/导出Excel
查看>>
导入/导出dBase
查看>>
数据库中存储与读取文件
查看>>