1,在项目中我们常有这样的需求,就是在个人中心的时候,当用户登录后,要显示用户登陆后的头像,然后背景是用户头像的虚化 ,接下来就来实现一下这个功能,先看一下效果

2,实现起来也挺简单的,没什么难度 ,不多说,直接上代码

contain_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/rl_content"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context="com.wangjitao.bluedemotest.MainActivity"tools:showIn="@layout/activity_main"><ImageViewandroid:id="@+id/imageview_ll"android:layout_width="match_parent"android:layout_height="300dp"android:scaleType="fitXY"/><ImageViewandroid:id="@+id/imageview"android:layout_width="64dp"android:layout_height="64dp"android:layout_centerInParent="true"/>
</RelativeLayout>

 MainActivity.java

package com.wangjitao.bluedemotest;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.RelativeLayout;import com.squareup.picasso.Picasso;public class MainActivity extends AppCompatActivity {private Context mContext = MainActivity.this;private ImageView imageView ;private ImageView imageview_ll ;private RelativeLayout mRelativeLayout ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show();}});initView();}private void initView() {imageView = (ImageView) findViewById(R.id.imageview);imageview_ll = (ImageView) findViewById(R.id.imageview_ll);mRelativeLayout = (RelativeLayout) findViewById(R.id.rl_content);Picasso.with(mContext).load(R.mipmap.img_feed_sakura).placeholder(R.drawable.img_circle_placeholder).resize(getResources().getDimensionPixelSize(R.dimen.global_menu_avatar_size),getResources().getDimensionPixelSize(R.dimen.global_menu_avatar_size)).centerCrop().transform(new CircleTransformation()).into(imageView);Bitmap bkg = BitmapFactory.decodeResource(getResources(), R.mipmap.img_feed_sakura);imageview_ll.setImageBitmap(fastblur(bkg,10));//blur(bkg,mRelativeLayout,20f);}private void blur(Bitmap bkg, View view, float radius) {  //view.getMeasuredWidth() view.getMeasuredHeight()Bitmap overlay = Bitmap.createBitmap(view.getMeasuredWidth(),view.getMeasuredHeight() , Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(overlay);canvas.drawBitmap(bkg, -view.getLeft(), -view.getTop(), null);RenderScript rs = RenderScript.create(this);Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());blur.setInput(overlayAlloc);blur.setRadius(radius);blur.forEach(overlayAlloc);overlayAlloc.copyTo(overlay);view.setBackground(new BitmapDrawable(getResources(), overlay));rs.destroy();}/** This method was copied from http://stackoverflow.com/a/10028267/694378.* The only modifications I've made are to remove a couple of Log* statements which could slow things down slightly.*/public Bitmap fastblur(Bitmap sentBitmap, int radius) {// Stack Blur v1.0 from// http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html//// Java Author: Mario Klingemann <mario at quasimondo.com>// http://incubator.quasimondo.com// created Feburary 29, 2004// Android port : Yahel Bouaziz <yahel at kayenko.com>// http://www.kayenko.com// ported april 5th, 2012// This is a compromise between Gaussian Blur and Box blur// It creates much better looking blurs than Box Blur, but is// 7x faster than my Gaussian Blur implementation.//// I called it Stack Blur because this describes best how this// filter works internally: it creates a kind of moving stack// of colors whilst scanning through the image. Thereby it// just has to add one new block of color to the right side// of the stack and remove the leftmost color. The remaining// colors on the topmost layer of the stack are either added on// or reduced by one, depending on if they are on the right or// on the left side of the stack.//// If you are using this algorithm in your code please add// the following line://// Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com>Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);if (radius < 1) {return (null);}int w = bitmap.getWidth();int h = bitmap.getHeight();int[] pix = new int[w * h];bitmap.getPixels(pix, 0, w, 0, 0, w, h);int wm = w - 1;int hm = h - 1;int wh = w * h;int div = radius + radius + 1;int r[] = new int[wh];int g[] = new int[wh];int b[] = new int[wh];int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;int vmin[] = new int[Math.max(w, h)];int divsum = (div + 1) >> 1;divsum *= divsum;int dv[] = new int[256 * divsum];for (i = 0; i < 256 * divsum; i++) {dv[i] = (i / divsum);}yw = yi = 0;int[][] stack = new int[div][3];int stackpointer;int stackstart;int[] sir;int rbs;int r1 = radius + 1;int routsum, goutsum, boutsum;int rinsum, ginsum, binsum;for (y = 0; y < h; y++) {rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;for (i = -radius; i <= radius; i++) {p = pix[yi + Math.min(wm, Math.max(i, 0))];sir = stack[i + radius];sir[0] = (p & 0xff0000) >> 16;sir[1] = (p & 0x00ff00) >> 8;sir[2] = (p & 0x0000ff);rbs = r1 - Math.abs(i);rsum += sir[0] * rbs;gsum += sir[1] * rbs;bsum += sir[2] * rbs;if (i > 0) {rinsum += sir[0];ginsum += sir[1];binsum += sir[2];} else {routsum += sir[0];goutsum += sir[1];boutsum += sir[2];}}stackpointer = radius;for (x = 0; x < w; x++) {r[yi] = dv[rsum];g[yi] = dv[gsum];b[yi] = dv[bsum];rsum -= routsum;gsum -= goutsum;bsum -= boutsum;stackstart = stackpointer - radius + div;sir = stack[stackstart % div];routsum -= sir[0];goutsum -= sir[1];boutsum -= sir[2];if (y == 0) {vmin[x] = Math.min(x + radius + 1, wm);}p = pix[yw + vmin[x]];sir[0] = (p & 0xff0000) >> 16;sir[1] = (p & 0x00ff00) >> 8;sir[2] = (p & 0x0000ff);rinsum += sir[0];ginsum += sir[1];binsum += sir[2];rsum += rinsum;gsum += ginsum;bsum += binsum;stackpointer = (stackpointer + 1) % div;sir = stack[(stackpointer) % div];routsum += sir[0];goutsum += sir[1];boutsum += sir[2];rinsum -= sir[0];ginsum -= sir[1];binsum -= sir[2];yi++;}yw += w;}for (x = 0; x < w; x++) {rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;yp = -radius * w;for (i = -radius; i <= radius; i++) {yi = Math.max(0, yp) + x;sir = stack[i + radius];sir[0] = r[yi];sir[1] = g[yi];sir[2] = b[yi];rbs = r1 - Math.abs(i);rsum += r[yi] * rbs;gsum += g[yi] * rbs;bsum += b[yi] * rbs;if (i > 0) {rinsum += sir[0];ginsum += sir[1];binsum += sir[2];} else {routsum += sir[0];goutsum += sir[1];boutsum += sir[2];}if (i < hm) {yp += w;}}yi = x;stackpointer = radius;for (y = 0; y < h; y++) {// Preserve alpha channel: ( 0xff000000 & pix[yi] )pix[yi] = ( 0xff000000 & pix[yi] ) | ( dv[rsum] << 16 ) | ( dv[gsum] << 8 ) | dv[bsum];rsum -= routsum;gsum -= goutsum;bsum -= boutsum;stackstart = stackpointer - radius + div;sir = stack[stackstart % div];routsum -= sir[0];goutsum -= sir[1];boutsum -= sir[2];if (x == 0) {vmin[y] = Math.min(y + r1, hm) * w;}p = x + vmin[y];sir[0] = r[p];sir[1] = g[p];sir[2] = b[p];rinsum += sir[0];ginsum += sir[1];binsum += sir[2];rsum += rinsum;gsum += ginsum;bsum += binsum;stackpointer = (stackpointer + 1) % div;sir = stack[stackpointer];routsum += sir[0];goutsum += sir[1];boutsum += sir[2];rinsum -= sir[0];ginsum -= sir[1];binsum -= sir[2];yi += w;}}bitmap.setPixels(pix, 0, w, 0, 0, w, h);return (bitmap);}
}

 CircleTransformation.java

package com.wangjitao.bluedemotest;import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;import com.squareup.picasso.Transformation;public class CircleTransformation implements Transformation {private static final int STROKE_WIDTH = 6;@Overridepublic Bitmap transform(Bitmap source) {int size = Math.min(source.getWidth(), source.getHeight());int x = (source.getWidth() - size) / 2;int y = (source.getHeight() - size) / 2;Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);if (squaredBitmap != source) {source.recycle();}Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());Canvas canvas = new Canvas(bitmap);Paint avatarPaint = new Paint();BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);avatarPaint.setShader(shader);Paint outlinePaint = new Paint();outlinePaint.setColor(Color.WHITE);outlinePaint.setStyle(Paint.Style.STROKE);outlinePaint.setStrokeWidth(STROKE_WIDTH);outlinePaint.setAntiAlias(true);float r = size / 2f;canvas.drawCircle(r, r, r, avatarPaint);canvas.drawCircle(r, r, r - STROKE_WIDTH / 2, outlinePaint);squaredBitmap.recycle();return bitmap;}@Overridepublic String key() {return "circleTransformation()";}
}

  

 

 

Android -- 背景虚化相关推荐

  1. Android 背景虚化实现

    需求: 弹出dialog或者其他一个页面,UI背景显示虚化. 注意:这里虚化并不等于暗化,暗化比较简单通过设置FLAG_DIM_BEHIND即可. 在Andorid 4.1 之前(SDK_INT &l ...

  2. Android背景虚化的PopupWindow 可指定虚化区域

    转载请注明出处 使用方式同系统PopupWindow: //初始化并设置返回键以及点击外部消失 mPopupWindow = new BackgroundBlurPopupWindow(mTextVi ...

  3. Android 背景虚化

    首先是生成背景的Bitmap: private Bitmap createViewBitmap(View view) {view.setDrawingCacheEnabled(true);view.b ...

  4. OpenCV在Android上实现人脸背景虚化

    1. 背景 在手机拍照技术日新月异的今天,很多手机厂商都陆续上了双摄,并衍生出人像模式(背景虚化).虽然博主不是很懂双摄虚化的原理,但是看到一些样张之后,还是被深深吸引,觉得很漂亮,很有虚幻的感觉. ...

  5. Android仿网易云音乐播放页面 背景虚化碟片效果

    1.效果图 仿网易云音乐播放页面,主要有4个关键点: 背景虚化.获取音乐的专辑封面,将此图片作为背景图,并进行模糊虚化处理 碟片合成.获取音乐的专辑封面,和黑色碟片图片进行合成 碟片旋转.音乐播放时, ...

  6. opencv在手机上实现照片背景虚化

    概述 使用androidstudio开发,在手机上实现照片背景虚化 详细 代码下载:http://www.demodashi.com/demo/10599.html 一.准备工作 1.需要下载安装an ...

  7. Google Pixel 2拍照黑科技:单摄搞定背景虚化+内部潜伏神秘芯片

    安妮 夏乙 发自 凹非寺 量子位 出品 | 公众号 QbitAI Google最新亲儿子Google Pixel 2系列一发布,拍照效果的好评就已铺天盖地. 凭借着几乎毫无亮点的单摄像头,这款手机在D ...

  8. opencv图像处理之在手机上实现背景虚化

    1.高端数码相机都具有背景虚化功能.背景虚化就是使景深变浅,使焦点聚集在主题上.一般的相机最好的虚拟方法便是用微距拍摄,如果主景与背景相距比较远,由于光学透镜对非焦点处景物的不能清晰成像的特点,可以免 ...

  9. python背景虚化

    python背景虚化 文章目录: 一.背景虚化知识导读 1.背景虚化的特点 2.虚化算法设计:[参考](http://www.php361.com/index.php?c=index&a=vi ...

  10. 背景虚化_一分钟学会背景虚化,掌握3个关键就能拍出好照片

    照片想要好看,只要让画面简洁就可以了,简洁背景+显眼主体=一张好看的照片.但生活中,很难有简洁的背景,就需要借助相机控制景深,让画面相对简洁了. 景深 景深,是摄影名词,就是对焦点前后的清晰范围,范围 ...

最新文章

  1. java中memcached
  2. Hyperledger Fabric Docker 文件路径权限
  3. 12、MyISAM存储引擎
  4. IDEA中进行SpringBoot开发时提示:Error resolving template xxx, template might not exist or might not be acce
  5. java xml 反射_java使用dom4j解析xml配置文件实现抽象工厂反射示例
  6. select html value属性,HtmlSelect.DataValueField 属性 (System.Web.UI.HtmlControls) | Microsoft Docs...
  7. Linux GRUB 引导Win 7 ---- error: invalid EFI file path
  8. 列表、元组、字典、集合的定义、操作与综合练习
  9. XML序列化和反序列化 以及相关类的写法
  10. BethuneX:DBA最信赖的监控和智能巡检平台
  11. oracle查看视图数据,查看oracle 10g 视图-数据库专栏,ORACLE
  12. 严重性 代码 说明 项目 文件 行 警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 opencv-05 d:\opencv\o
  13. editplus3 关联鼠标右键
  14. Linuxbt下载工具-Transmission-支持命令行!!!
  15. 友盟+短视频行业研究
  16. oracle rman迁移spfile,RMAN 异机迁移实战操作-附加常用命令
  17. python中dispatch_在django,dispatch的用途是什么?
  18. 科学巨星的美丽轨迹——走近博弈论大师纳什
  19. Android原生蓝牙音乐绑定、Sink端play流程
  20. 重温C语言 | 指针基础(指针与内存)

热门文章

  1. atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
  2. paip.获取文件名从路径uapi java python php总结...
  3. paip.discuz x2.5 用户及积分账户的接口attilax总结
  4. 代码积累与编程能力哪个更重要
  5. HPC+AI融合发展的挑战和应对方法探讨
  6. 基于弹性计算网络能力提升容器密度最佳实践
  7. 一位腾讯离职创业 6 年 CEO 的忠告:不要等公司倒闭,才思考这 3 个问题
  8. 【图像压缩】基于matlab JEPG图像压缩【含Matlab源码 1167期】
  9. 【图像处理】基于matlab GUI Hough变换+PDE图像去雨(带面板)【含Matlab源码 811期】
  10. 【CPI指数预测】基于matlab BP神经网络CPI指数预测【含Matlab源码 662期】