Android实现毛玻璃效果的对话框
一个popwindow,在弹出的时候背景是原界面的截图加高斯模糊效果:
创新互联建站专业为企业提供巴彦淖尔网站建设、巴彦淖尔做网站、巴彦淖尔网站设计、巴彦淖尔网站制作等企业网站建设、网页设计与制作、巴彦淖尔企业网站模板建站服务,10年巴彦淖尔做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
先给出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(); } }
第二种样式,比第一种简单但是效果更明显也更大众化
这个是在原来布局的最上层加上了一个不可见的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://ybzwz.com/article/ihpgoi.html