出来工作不久,只是平常经常会用到平时比较少用到而要用是时候又不想自己再敲起来麻烦的一些问题,把它记录下来,不但可以为自己整理了自己的知识,也可以为后来人一些借鉴。
第一次开始写博客,也由于学了Android不久,所以这开始到以后的时间写的东西可能都会比较偏实用性而比较少去深究其内部的实现原理等底层的东西,也可能会有较多的错误,望各位前辈指出与指教,新进行业的也可以一起讨论,一起进步。
由于现在很多的应用都喜欢使用圆形的头像,而网上相关的代码与项目也很多,但实现的原理大多都是相同的,其原理是用两层的图形,一层是所要的头像,一层是一个圆,最后合成为只显示两张图片的重叠部分就是所要的圆了。这里写一个比较简单实现方法,以后用得上了直接抄来就可以用了。先看结果
,
是不是看着有点像了?那就再看看代码的实现吧
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String path = "http://s3.sinaimg.cn/small/00266k4lgy6SSRyCBmGe2&690";
imageView = (ImageView) findViewById(R.id.iv);
imageView.setImageBitmap(getRoundBitmap(path, 200));
}
首先在Activity的onCreate()方法中找到要显示图片的ImageView,再将getRoundBitmap(path, 200)方法得到的圆角图片设置进去,其中第一个参数是存放图片的地址,可以是本地也可以是网络地址。
getRoundBitmap()方法的方法体如下:
public Bitmap getRoundBitmap(final String path, final int size) {
if (path.startsWith("http:")) {
new Thread() {
public void run() {
HttpGet httpGet = new HttpGet(path);
HttpClient httpClient = new DefaultHttpClient();
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
Bitmap bitmap2 = BitmapFactory.decodeStream(httpResponse.getEntity().getContent());
bitmap = getBitmap(size, bitmap2);
Message msg = new Message();
msg.obj = bitmap;
handler.sendMessage(msg);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} else {
Bitmap srcBitmap = BitmapFactory.decodeFile(path);
bitmap = getBitmap(size, srcBitmap);
}
return bitmap;
}
//关键代码
public static Bitmap getBitmap(int size, Bitmap srcBitmap) {
Bitmap bitmap = Bitmap.createBitmap(size, size,
Bitmap.Config.ARGB_8888);//创建一个可修改的Bitmap
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);//消除锯齿
RectF rect = new RectF(0, 0, size, size);
canvas.drawRoundRect(rect, size / 2, size / 2, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//显示为前景在里面的部分
canvas.drawBitmap(srcBitmap, null, rect, paint);
return bitmap;
}
当然由于查询网络的图片要消耗一定的时间,当返回时有可能还没加载到图片,所以要建一个Handlar类用来当加载图片完成时及时显示到ImageView上。
Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
imageView.setImageBitmap((Bitmap) msg.obj);
};
};
这样就可以了,由于代码相对比较简单也容易理解,这里没做过多的解释,原理就是跟根图形合成,先画一个圆边矩形,当圆角的半径为边长的一半时,画出来的矩形就是圆了。再用一个要显示成圆形的Bitmap与之合成,合成模式为显示Bitmap在圆的里面的部分,所合成的图形就是所要的效果了。