天天看點

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