您的位置:首页 > 移动开发 > 微信开发

Android 仿微信显示的聊天照片

2016-08-20 17:18 323 查看
Android 仿微信显示的聊天照片

Android 仿微信显示的聊天照片,效果如下图所示:



这种显示的样式就是和微信的显示照片的样式是一样的,微信的实现我不知道是否和我一样,今天我来和大家介绍一下我的实现方法:

实现思路:照片先在Imageview展示照片的全部,然后再处理照片最终显示成这样,在实际实现中,照片有的是本地照片有的是网络照片,如果是网络照片的话,我们需要在照片加载好了过后再去处理照片,遇到了这个难题,我采取了去判断Imageview是否能拿到已经显示的照片来进行判断是否对照片进行处理,如果Imageview没有拿到照片,我就会通过Handler来消息通知再次去触发照片处理的方法,直到照片加载完成。

废话不多说,代码献上,供大家参考,学习,如果大家有什么好方法希望可以一起探讨:

/***
* //IM聊天照片设置为裁剪后显示的照片
* @param imageView  照片显示的控件
* @param pointNineImage  R.drawable.chat_others_up  .9的图
*/
private void showImage(final ImageView imageView, final int pointNineImage) {
new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap_bg = BitmapFactory.decodeResource(getResources(), pointNineImage);
Bitmap bitmap_in = imageView.getDrawingCache();
if (bitmap_bg != null && bitmap_in != null) {
final Bitmap bp = getRoundCornerImage(imageView.getWidth(), imageView.getHeight(), bitmap_bg, bitmap_in);
final Bitmap bp2 = getShardImage(imageView.getWidth(), imageView.getHeight(), bitmap_bg, bp);
imageView.setImageBitmap(bp2);
} else {
//如果照片没有设置好,再发通知重新设置,直到照片设置完成
android.os.Message message = new android.os.Message();
message.obj = imageView;
message.arg1 = pointNineImage;
setPicHandler.sendMessageAtTime(message, 100);
}
imageView.setDrawingCacheEnabled(false);
}
});
}
}).start();
}

private Handler setPicHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
showImage((ImageView) msg.obj, msg.arg1);
}
};

public Bitmap getRoundCornerImage(int width, int height, Bitmap bitmap_bg, Bitmap bitmap_in) {
Bitmap roundConcerImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(roundConcerImage);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, width, height);
Rect rectF = new Rect(0, 0, bitmap_in.getWidth(), bitmap_in.getHeight());
paint.setAntiAlias(true);
NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null);
patch.draw(canvas, rect);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap_in, rectF, rect, paint);
return roundConcerImage;
}

public Bitmap getShardImage(int width, int height, Bitmap bitmap_bg, Bitmap bitmap_in) {
Bitmap roundConcerImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(roundConcerImage);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, width, height);
paint.setAntiAlias(true);
NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null);
patch.draw(canvas, rect);
Rect rect2 = new Rect(1, 1, width - 1, height - 1);
canvas.drawBitmap(bitmap_in, rect, rect2, paint);
return roundConcerImage;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息