本文共 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;}
}
我写的这个是从网上获取的图片,千万不要忘记加联网权限,然后进行搓圆;
重要内容
需要加联网权限
下面看一下效果图:
好了,功能也就实现了,哈哈哈,还有另一用写法,下篇我将写出来让大家看下。。。。。。