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, );
}
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(, , width, height);
Rect rectF = new Rect(, , 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(, , width, height);
paint.setAntiAlias(true);
NinePatch patch = new NinePatch(bitmap_bg, bitmap_bg.getNinePatchChunk(), null);
patch.draw(canvas, rect);
Rect rect2 = new Rect(, , width - , height - );
canvas.drawBitmap(bitmap_in, rect, rect2, paint);
return roundConcerImage;
}