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布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/img"
android:layout_width="180dp"
android:layout_height="200dp"
android:src="@drawable/ic_launcher"
android:layout_centerInParent="true"/>
</RelativeLayout>
这里写代码片
MainActivity代码
public class MainActivity extends Activity { private ImageView img; private String path
@Override
protected 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;
}
}
我写的这个是从网上获取的图片,千万不要忘记加联网权限,然后进行搓圆;
重要内容
需要加联网权限
下面看一下效果图:
好了,功能也就实现了,哈哈哈,还有另一用写法,下篇我将写出来让大家看下。。。。。。