Android实现毛玻璃效果的对话框

一个popwindow,在弹出的时候背景是原界面的截图加高斯模糊效果:

创新互联建站专业为企业提供巴彦淖尔网站建设、巴彦淖尔做网站、巴彦淖尔网站设计、巴彦淖尔网站制作等企业网站建设、网页设计与制作、巴彦淖尔企业网站模板建站服务,10年巴彦淖尔做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

Android实现毛玻璃效果的对话框

先给出popwindow的布局文件

<?xml version="1.0" encoding="utf-8"?> 
 
 
  
 
  
 
  
 
  
 
  
 
 

里面那个自定义imageView控件在我上一篇博客里,下面是activity的布局

 
 
  
 
  
 
  
 
 

用于圆角的背景xml,放在drawable文件夹中

<?xml version="1.0" encoding="UTF-8" ?> 
 
  
   
   
   
   
    
   
  
  
   
   
    
   
  
 

activity的源码

package com.npi.blureffect; 
 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Point; 
import android.os.Build; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.PopupWindow; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
 
public class TestActivity extends Activity { 
TextView textView1; 
RelativeLayout window; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_test); 
 textView1 = (TextView) findViewById(R.id.textView1); 
 window = (RelativeLayout)findViewById(R.id.window); 
 textView1.setOnClickListener(new OnClickListener() { 
  
  @Override 
  public void onClick(View v) { 
  // TODO Auto-generated method stub 
  initPopuptWindow(window); 
  } 
 }); 
  
 } 
PopupWindow popupWindow; 
 
 /** 
 * 创建PopupWindow 
 */ 
 protected void initPopuptWindow(View layout) { 
 // TODO Auto-generated method stub 
 //对当前页面进行截屏 
 layout.setDrawingCacheEnabled(true); 
 layout.buildDrawingCache(); //启用DrawingCache并创建位图 
 Bitmap screen = Bitmap.createBitmap(layout.getDrawingCache()); //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收 
 layout.setDrawingCacheEnabled(false); //禁用DrawingCahce否则会影响性能 
  
 //将截屏进行模糊 
 screen = Blur.fastblur(this, screen, 15); 
  
 // 获取自定义布局文件activity_popupwindow_left.xml的视图 
 final View popupWindow_view = getLayoutInflater().inflate(R.layout.ioswindow, null, 
  false); 
 // 创建PopupWindow实例,200,LayoutParams.MATCH_PARENT分别是宽度和高度 
 final ScrollableImageView background = (ScrollableImageView) popupWindow_view.findViewById(R.id.imageView1); 
 background.setoriginalImage(screen); 
 final int screenWidth = getScreenWidth(this); 
 final int screenHeight = screen.getHeight(); 
 final int heightless = getScreenHeight(this)-screenHeight; 
 Log.i("Alex", "屏幕宽度为"+screenWidth+"高度为"+screenHeight+"偏差为"+heightless); 
 popupWindow = new PopupWindow(popupWindow_view, (int) (screenWidth*0.8), (int) (screenWidth*0.85*0.5), true); //设置popwindow的大小 
 popupWindow.showAtLocation(textView1, Gravity.CENTER, 0, 0);//设置popwindow的位置 
 popupWindow_view.post(new Runnable() { 
  
  @Override 
  public void run() { 
  // TODO Auto-generated method stub 
  int left = screenWidth/10; 
  Log.i("Alex", screenHeight+"-"+screenWidth*0.85*0.5); 
  int top = (int) ((screenHeight-screenWidth*0.85*0.5)/2-heightless/2); 
  Log.i("Alex", "top是"+top); 
  background.handleScroll(top, left); 
  } 
 }); 
  
 // 设置动画效果 
 // 点击其他地方消失 
 TextView confirm = (TextView) popupWindow_view.findViewById(R.id.textView2); 
 confirm.setOnClickListener(new OnClickListener() { 
  
  @Override 
  public void onClick(View v) { 
  // TODO Auto-generated method stub 
  popupWindow.dismiss(); 
  } 
 }); 
  
 } 
 
 /** 
 * Get the screen width. 
 * 
 * @param context 
 * @return the screen width 
 */ 
 @SuppressWarnings("deprecation") 
 @SuppressLint("NewApi") 
 public static int getScreenWidth(Activity context) { 
 
 Display display = context.getWindowManager().getDefaultDisplay(); 
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
  Point size = new Point(); 
  display.getSize(size); 
  return size.x; 
 } 
 return display.getWidth(); 
 } 
 
 /** 
 * Get the screen height. 
 * 
 * @param context 
 * @return the screen height 
 */ 
 @SuppressWarnings("deprecation") 
 @SuppressLint("NewApi") 
 public static int getScreenHeight(Activity context) { 
 
 Display display = context.getWindowManager().getDefaultDisplay(); 
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
  Point size = new Point(); 
  display.getSize(size); 
  return size.y; 
 } 
 return display.getHeight(); 
 } 
} 

第二种样式,比第一种简单但是效果更明显也更大众化

Android实现毛玻璃效果的对话框

这个是在原来布局的最上层加上了一个不可见的imageView,在弹出popwindow之前用这个imageView盖住底下的东西

布局如下

 
 
  
  
 
  
 
 

activity 如下

package com.npi.blureffect; 
 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.graphics.Point; 
import android.os.Build; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 
import android.widget.PopupWindow; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
 
public class DialogActivity extends Activity { 
TextView textView1; 
RelativeLayout window; 
ImageView background; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.activity_dialog); 
 textView1 = (TextView) findViewById(R.id.textView1); 
 window = (RelativeLayout)findViewById(R.id.window); 
 background = (ImageView) findViewById(R.id.background); 
 
 textView1.setOnClickListener(new OnClickListener() { 
 
 @Override 
 public void onClick(View v) { 
 // TODO Auto-generated method stub 
 initPopuptWindow(window); 
 } 
 }); 
 } 
 
 PopupWindow popupWindow; 
 
 
 /** 
 * 创建PopupWindow 
 */ 
 protected void initPopuptWindow(View layout) { 
 // TODO Auto-generated method stub 
 //对当前页面进行截屏 
 layout.setDrawingCacheEnabled(true); 
 layout.buildDrawingCache(); //启用DrawingCache并创建位图 
 Bitmap screen = Bitmap.createBitmap(layout.getDrawingCache()); //创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收 
 layout.setDrawingCacheEnabled(false); //禁用DrawingCahce否则会影响性能 
 Log.i("Alex", "转换前bitmap的大小是"+screen.getWidth()+" : "+screen.getHeight()); 
 screen = scaleBitmap(screen, screen.getWidth()/2, screen.getHeight()/2);//压缩bitmap到指定大小 
 Log.i("Alex", "转换后bitmap的大小是"+screen.getWidth()+" : "+screen.getHeight()); 
 //将截屏进行模糊 
 screen = Blur.fastblur(this, screen, 10); 
 
 // 获取自定义布局文件activity_popupwindow_left.xml的视图 
 final View popupWindow_view = getLayoutInflater().inflate(R.layout.ioswindow, null, 
 false); 
 
 // 创建PopupWindow实例,200,LayoutParams.MATCH_PARENT分别是宽度和高度 
 background.setImageBitmap(screen); 
 background.setVisibility(View.VISIBLE); 
 final int screenWidth = getScreenWidth(this); 
 popupWindow = new PopupWindow(popupWindow_view, (int) (screenWidth*0.8), (int) (screenWidth*0.85*0.5), true); //设置popwindow的大小 
 popupWindow.showAtLocation(textView1, Gravity.CENTER, 0, 0);//设置popwindow的位置 
 popupWindow_view.post(new Runnable() { 
 
 @Override 
 public void run() { 
 // TODO Auto-generated method stub 
 int left = screenWidth/10; 
 } 
 }); 
 
 // 设置动画效果 
 // 点击其他地方消失 
 TextView confirm = (TextView) popupWindow_view.findViewById(R.id.textView2); 
 confirm.setOnClickListener(new OnClickListener() { 
 
 @Override 
 public void onClick(View v) { 
 // TODO Auto-generated method stub 
 background.setVisibility(View.GONE); 
 popupWindow.dismiss(); 
 } 
 }); 
 
 } 
 
 /** 
 * Get the screen width. 
 * 
 * @param context 
 * @return the screen width 
 */ 
 @SuppressWarnings("deprecation") 
 @SuppressLint("NewApi") 
 public static int getScreenWidth(Activity context) { 
 
 Display display = context.getWindowManager().getDefaultDisplay(); 
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { 
 Point size = new Point(); 
 display.getSize(size); 
 return size.x; 
 } 
 return display.getWidth(); 
 } 
 
 /** 
 * 把一个bitmap压缩,压缩到指定大小 
 * @param bm 
 * @param width 
 * @param height 
 * @return 
 */ 
 private static Bitmap scaleBitmap(Bitmap bm, float width, float height) { 
 if (bm == null) { 
 return null; 
 } 
 int bmWidth = bm.getWidth(); 
 int bmHeight = bm.getHeight(); 
 float scaleWidth = width / bmWidth; 
 float scaleHeight = height / bmHeight; 
 Matrix matrix = new Matrix(); 
 matrix.postScale(scaleWidth, scaleHeight); 
 
 if (scaleWidth == 1 && scaleHeight == 1) { 
 return bm; 
 } else { 
 Bitmap resizeBitmap = Bitmap.createBitmap(bm, 0, 0, bmWidth, 
  bmHeight, matrix, false); 
 bm.recycle();//回收图片内存 
 bm.setDensity(240); 
 return resizeBitmap; 
 } 
 } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。


当前名称:Android实现毛玻璃效果的对话框
文章起源:http://pwwzsj.com/article/ihpgoi.html