由于項(xiàng)目需要塌衰,實(shí)現(xiàn)一個(gè)類(lèi)似于華為雜志鎖屏上滑模糊的效果豌注,先說(shuō)一下思路:
- 自定義一個(gè)類(lèi)似抽屜拖拽效果從手機(jī)底部滑進(jìn)的view,支持手勢(shì)滑動(dòng)揉忘,并提供上下滑動(dòng)變化監(jiān)聽(tīng)跳座;
- 在上下滑動(dòng)變化的監(jiān)聽(tīng)方法,截屏:截取自定義view下面的視圖泣矛,進(jìn)行模糊處理躺坟,然后作為view的背景。
下面說(shuō)一下詳細(xì)細(xì)節(jié):
首先乳蓄,從底部滑出的view在網(wǎng)上有很多咪橙,我這里用的是https://github.com/yingLanNull/ScrollLayout,我是直接下載源碼虚倒,這樣可以根據(jù)自己的需求進(jìn)行修改:源碼中美侦,view的狀態(tài)有三個(gè):CLOSE、OPEN魂奥、EXIT菠剩,其中:
- CLOSE是view滑到屏幕頂部時(shí)的狀態(tài);
- OPEN是view顯示時(shí)的狀態(tài)耻煤;
- EXIT時(shí)view隱藏或滑到屏幕底部時(shí)的狀態(tài)具壮;
這里的view是繼承的ScrollLayout:
int offset = (int) (ScreenUtil.getScreenHeight((Activity)context) * 0.5);
setMinOffset(0); //view滑到屏幕頂部時(shí)view下方視圖的可見(jiàn)距離
setMaxOffset(offset); //打開(kāi)狀態(tài)時(shí)內(nèi)容顯示區(qū)域的高度
setExitOffset(0); //view退出時(shí)屏幕底部可見(jiàn)距離,0為不可見(jiàn)
setIsSupportExit(true); //是否支持下滑退出哈蝇,支持會(huì)有下滑到最底部時(shí)的回調(diào)
setAllowHorizontalScroll(true);
setOnScrollChangedListener(mOnScrollChangedListener); //設(shè)置上下滑動(dòng)監(jiān)聽(tīng)
setToExit(); //默認(rèn)令view置于屏幕底部
在上下滾動(dòng)的監(jiān)聽(tīng)中截取自定義view下面的視圖棺妓,進(jìn)行模糊處理,然后作為view的背景:
private ScrollLayout.OnScrollChangedListener mOnScrollChangedListener = new ScrollLayout.OnScrollChangedListener(){
@Override
public void onScrollProgressChanged(float currentProgress) {
NLog.i(TAG + ":onScrollProgressChanged currentProgress:"+currentProgress);
if (currentProgress > -1) {
float precent = 255;
if(currentProgress>= 0) {
precent = 255 * currentProgress;
if (precent > 255) {
precent = 255;
} else if (precent < 0) {
precent = 0;
}
}
BlurBitmapUtil.blur(rootView, toBlurView, 14, 8); //截取自定義toBlurView下面的視圖炮赦,進(jìn)行模糊處理怜跑,然后作為toBlurView的背景
if(getBackground()!= null) {
getBackground().setAlpha(255 - (int) precent);
}
}
}
@Override
public void onScrollFinished(ScrollLayout.Status currentStatus) {
if (currentStatus.equals(ScrollLayout.Status.EXIT)) {
}
}
@Override
public void onChildScroll(int top) {
}
};
blur的方法如下:
/**
* 設(shè)置高斯模糊
*
* @param fromView 從某個(gè)View獲取截圖
* @param toView 高斯模糊設(shè)置到某個(gè)View上
* @param radius 模糊度
* 取值在 0 - 25 之間,值越大吠勘,越模糊性芬。
* @param scaleFactor 縮放比例 一般設(shè)置為 8 即可,不需要特別注意剧防。
* 設(shè)置這個(gè)屬性植锉,先進(jìn)性縮放,再進(jìn)行高斯模糊峭拘,效果會(huì)更好一點(diǎn)俊庇。
*/
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static void blur(View fromView, View toView, float radius,
float scaleFactor) {
// 獲取View的截圖
// fromView.buildDrawingCache();
// Bitmap bkg = fromView.getDrawingCache();
NLog.i(TAG + ":blur: bkg:"+bkg);
//無(wú)需每次都截取搏熄,節(jié)約時(shí)間
if(bkg == null){
bkg = BitmapUtil.takeShotBy(fromView);
}
if (radius < 1 || radius > 26) {
scaleFactor = 8;
radius = 2;
}
Bitmap overlay = Bitmap.createBitmap(
(int) (toView.getWidth() / scaleFactor),
(int) (toView.getHeight() / scaleFactor),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(overlay);
int[] position = new int[2];
toView.getLocationInWindow(position);
int x = position[0];
int y = position[1];
NLog.i(TAG + ":blur: x:"+x+";y:"+y+";toView.getTop():"+toView.getTop());
canvas.translate(-x / scaleFactor, -y
/ scaleFactor);
canvas.scale(1 / scaleFactor, 1 / scaleFactor);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bkg, 0, 0, paint);
overlay = doBlur(overlay, (int) radius, true);//這個(gè)方法用的是FastBlur,自己百度就有
toView.setBackground(new BitmapDrawable(overlay));
}
基本就可以了暇赤,代碼已上傳至GitHub:https://github.com/ruoki/ScrollLayoutWithBlur.git,歡迎修正和star!