天天看点

Android 仿微信显示的聊天照片

Android 仿微信显示的聊天照片

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;
        }