Skip to content

Commit 0cdb38e

Browse files
author
tiansj
committed
毛玻璃效果,使用FastBlurFragment/RSBlurFragment,看效果
1 parent 73afdc3 commit 0cdb38e

File tree

13 files changed

+746
-55
lines changed

13 files changed

+746
-55
lines changed

app/app.iml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
6565
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
6666
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
67+
<excludeFolder url="file://$MODULE_DIR$/build/.DS_Store" />
6768
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
6869
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
6970
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/debug" />
@@ -72,6 +73,7 @@
7273
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/22.2.1/jars" />
7374
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.squareup.leakcanary/leakcanary-android/1.3/jars" />
7475
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/in.srain.cube/ultra-ptr/1.0.10/jars" />
76+
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/jp.wasabeef/blurry/1.0.5/jars" />
7577
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
7678
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
7779
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
@@ -89,11 +91,13 @@
8991
<orderEntry type="library" exported="" name="ultra-ptr-1.0.10" level="project" />
9092
<orderEntry type="library" exported="" name="systembartint-1.0.3" level="project" />
9193
<orderEntry type="library" exported="" name="leakcanary-android-1.3" level="project" />
92-
<orderEntry type="library" exported="" name="butterknife-7.0.1" level="project" />
94+
<orderEntry type="library" exported="" name="blurry-1.0.5" level="project" />
9395
<orderEntry type="library" exported="" name="glide-3.6.1" level="project" />
9496
<orderEntry type="library" exported="" name="fastjson-1.1.34.android" level="project" />
95-
<orderEntry type="library" exported="" name="support-annotations-22.2.1" level="project" />
97+
<orderEntry type="library" exported="" name="butterknife-7.0.1" level="project" />
9698
<orderEntry type="library" exported="" name="picasso-2.5.2" level="project" />
99+
<orderEntry type="library" exported="" name="support-annotations-22.2.1" level="project" />
100+
<orderEntry type="library" exported="" name="renderscript-v8" level="project" />
97101
<orderEntry type="library" exported="" name="haha-1.1" level="project" />
98102
<orderEntry type="library" exported="" name="okhttp-2.4.0" level="project" />
99103
<orderEntry type="library" exported="" name="ormlite-core-4.48" level="project" />

app/src/main/java/com/yuzhi/fine/fragment/DemoPtrFragment.java

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.yuzhi.fine.fragment;
22

3-
import android.app.Activity;
43
import android.os.Bundle;
54
import android.support.v4.app.Fragment;
65
import android.view.LayoutInflater;
@@ -16,6 +15,7 @@
1615
import com.squareup.okhttp.Request;
1716
import com.squareup.picasso.Picasso;
1817
import com.yuzhi.fine.R;
18+
import com.yuzhi.fine.activity.MainActivity;
1919
import com.yuzhi.fine.http.HttpClient;
2020
import com.yuzhi.fine.http.HttpResponseHandler;
2121
import com.yuzhi.fine.model.SearchParam;
@@ -35,15 +35,13 @@
3535
import in.srain.cube.views.ptr.PtrDefaultHandler;
3636
import in.srain.cube.views.ptr.PtrFrameLayout;
3737
import in.srain.cube.views.ptr.PtrHandler;
38-
import in.srain.cube.views.ptr.PtrUIHandler;
3938
import in.srain.cube.views.ptr.header.StoreHouseHeader;
40-
import in.srain.cube.views.ptr.indicator.PtrIndicator;
4139

4240
/**
4341
* Created by tiansj on 15/9/4.
4442
*/
4543
public class DemoPtrFragment extends Fragment {
46-
private Activity context;
44+
private MainActivity context;
4745

4846
private SearchParam param;
4947
private int pno = 1;
@@ -65,7 +63,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
6563
@Override
6664
public void onActivityCreated(Bundle savedInstanceState) {
6765
super.onActivityCreated(savedInstanceState);
68-
context = getActivity();
66+
context = (MainActivity) getActivity();
6967
initData();
7068
initView();
7169
loadData();
@@ -80,6 +78,7 @@ protected void convert(BaseAdapterHelper helper, SearchShop shop) {
8078
.setImageUrl(R.id.logo, shop.getLogo()); // 自动异步加载图片
8179
}
8280
};
81+
listView.setDrawingCacheEnabled(true);
8382
listView.setAdapter(adapter);
8483

8584
// header custom begin
@@ -135,10 +134,105 @@ public void onScrollStateChanged(AbsListView view, int scrollState) {
135134
@Override
136135
public void onScroll(AbsListView view, int firstVisibleItem,
137136
int visibleItemCount, int totalItemCount) {
137+
// getLastVisibleItemBitmap(firstVisibleItem+visibleItemCount);
138+
// takeScreenShot(context);
138139
}
139140
});
141+
140142
}
141143

144+
// public void takeScreenShot(Activity activity) {
145+
// // View是你需要截图的View
146+
// View view = activity.getWindow().getDecorView();
147+
// view.setDrawingCacheEnabled(true);
148+
// view.buildDrawingCache();
149+
// Bitmap b1 = view.getDrawingCache();
150+
//
151+
// // 获取状态栏高度
152+
// Rect frame = new Rect();
153+
// activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
154+
// int statusBarHeight = frame.top;
155+
// System.out.println(statusBarHeight);
156+
//
157+
// // 获取屏幕长和高
158+
// int width = activity.getWindowManager().getDefaultDisplay().getWidth();
159+
// int height = activity.getWindowManager().getDefaultDisplay().getHeight();
160+
// // 去掉标题栏
161+
//// Bitmap b = Bitmap.createBitmap(b1, 0, height-120, width, 120);
162+
// Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
163+
// - statusBarHeight);
164+
// view.destroyDrawingCache();
165+
// context.blurFooterBar(b);
166+
//// return b;
167+
// }
168+
//
169+
// private void getLastVisibleItemBitmap(int pos) {
170+
// View childView = adapter.getView(pos, null, listView);
171+
// if(childView == null) {
172+
// return;
173+
// }
174+
// childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY),
175+
// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
176+
//
177+
// childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
178+
// childView.setDrawingCacheEnabled(true);
179+
// childView.buildDrawingCache();
180+
//// return childView.getDrawingCache();
181+
// context.blurFooterBar(childView.getDrawingCache());
182+
// }
183+
//
184+
// public Bitmap getWholeListViewItemsToBitmap() {
185+
// int itemscount = adapter.getCount();
186+
// int allitemsheight = 0;
187+
// List<Bitmap> bmps = new ArrayList<Bitmap>();
188+
//
189+
// for (int i = 0; i < itemscount; i++) {
190+
//
191+
// View childView = adapter.getView(i, null, listView);
192+
// childView.measure(View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.EXACTLY),
193+
// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
194+
//
195+
// childView.layout(0, 0, childView.getMeasuredWidth(), childView.getMeasuredHeight());
196+
// childView.setDrawingCacheEnabled(true);
197+
// childView.buildDrawingCache();
198+
// bmps.add(childView.getDrawingCache());
199+
// allitemsheight+=childView.getMeasuredHeight();
200+
// }
201+
//
202+
// Bitmap bigbitmap = Bitmap.createBitmap(listView.getMeasuredWidth(), allitemsheight, Bitmap.Config.ARGB_8888);
203+
// Canvas bigcanvas = new Canvas(bigbitmap);
204+
//
205+
// Paint paint = new Paint();
206+
// int iHeight = 0;
207+
//
208+
// for (int i = 0; i < bmps.size(); i++) {
209+
// Bitmap bmp = bmps.get(i);
210+
// bigcanvas.drawBitmap(bmp, 0, iHeight, paint);
211+
// iHeight+=bmp.getHeight();
212+
//
213+
// bmp.recycle();
214+
// bmp=null;
215+
// }
216+
//
217+
//
218+
// return bigbitmap;
219+
// }
220+
//
221+
//
222+
// private void applyBlur() {
223+
// listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
224+
// @Override
225+
// public boolean onPreDraw() {
226+
// listView.getViewTreeObserver().removeOnPreDrawListener(this);
227+
// listView.buildDrawingCache();
228+
//
229+
// Bitmap bmp = listView.getDrawingCache();
230+
// context.blurFooterBar(bmp);
231+
// return true;
232+
// }
233+
// });
234+
// }
235+
142236
private void initData() {
143237
param = new SearchParam();
144238
pno = 1;
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package com.yuzhi.fine.fragment;
2+
3+
import android.graphics.Bitmap;
4+
import android.graphics.Canvas;
5+
import android.graphics.Paint;
6+
import android.graphics.drawable.BitmapDrawable;
7+
import android.os.Bundle;
8+
import android.support.v4.app.Fragment;
9+
import android.view.LayoutInflater;
10+
import android.view.View;
11+
import android.view.ViewGroup;
12+
import android.view.ViewTreeObserver;
13+
import android.widget.CheckBox;
14+
import android.widget.CompoundButton;
15+
import android.widget.FrameLayout;
16+
import android.widget.ImageView;
17+
import android.widget.LinearLayout;
18+
import android.widget.RadioGroup;
19+
import android.widget.TextView;
20+
21+
import com.yuzhi.fine.R;
22+
import com.yuzhi.fine.activity.MainActivity;
23+
import com.yuzhi.fine.ui.blur.FastBlur;
24+
25+
/**
26+
* Created by paveldudka on 3/4/14.
27+
*/
28+
public class FastBlurFragment extends Fragment {
29+
private final String DOWNSCALE_FILTER = "downscale_filter";
30+
31+
MainActivity activity;
32+
View view;
33+
RadioGroup group;
34+
35+
private ImageView image;
36+
private TextView text;
37+
private CheckBox downScale;
38+
private TextView statusText;
39+
40+
@Override
41+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
42+
view = inflater.inflate(R.layout.fragment_layout, container, false);
43+
return view;
44+
}
45+
46+
@Override
47+
public void onActivityCreated(Bundle savedInstanceState) {
48+
super.onActivityCreated(savedInstanceState);
49+
activity = (MainActivity) getActivity();
50+
group = (RadioGroup) activity.findViewById(R.id.group);
51+
52+
image = (ImageView) view.findViewById(R.id.picture);
53+
text = (TextView) view.findViewById(R.id.text);
54+
image.setImageResource(R.drawable.newer02);
55+
statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls));
56+
addCheckBoxes((ViewGroup) view.findViewById(R.id.controls));
57+
58+
if (savedInstanceState != null) {
59+
downScale.setChecked(savedInstanceState.getBoolean(DOWNSCALE_FILTER));
60+
}
61+
applyBlur();
62+
}
63+
64+
private void applyBlur() {
65+
image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
66+
@Override
67+
public boolean onPreDraw() {
68+
image.getViewTreeObserver().removeOnPreDrawListener(this);
69+
image.buildDrawingCache();
70+
71+
Bitmap bmp = image.getDrawingCache();
72+
blur(bmp, group);
73+
return true;
74+
}
75+
});
76+
}
77+
78+
private void blur(Bitmap bkg, View view) {
79+
long startMs = System.currentTimeMillis();
80+
float scaleFactor = 1;
81+
float radius = 20;
82+
if (downScale.isChecked()) {
83+
scaleFactor = 8;
84+
radius = 2;
85+
}
86+
87+
Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()/scaleFactor),
88+
(int) (view.getMeasuredHeight()/scaleFactor), Bitmap.Config.ARGB_8888);
89+
Canvas canvas = new Canvas(overlay);
90+
canvas.translate(-view.getLeft()/scaleFactor, -view.getTop()/scaleFactor);
91+
canvas.scale(1 / scaleFactor, 1 / scaleFactor);
92+
Paint paint = new Paint();
93+
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
94+
canvas.drawBitmap(bkg, 0, 0, paint);
95+
96+
overlay = FastBlur.doBlur(overlay, (int) radius, true);
97+
view.setBackground(new BitmapDrawable(getResources(), overlay));
98+
statusText.setText(System.currentTimeMillis() - startMs + "ms");
99+
}
100+
101+
@Override
102+
public String toString() {
103+
return "Fast blur";
104+
}
105+
106+
private void addCheckBoxes(ViewGroup container) {
107+
108+
downScale = new CheckBox(getActivity());
109+
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
110+
downScale.setLayoutParams(lp);
111+
downScale.setText("Downscale before blur");
112+
downScale.setVisibility(View.VISIBLE);
113+
downScale.setTextColor(0xFFFFFFFF);
114+
downScale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
115+
@Override
116+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
117+
applyBlur();
118+
}
119+
});
120+
container.addView(downScale);
121+
}
122+
123+
private TextView addStatusText(ViewGroup container) {
124+
TextView result = new TextView(getActivity());
125+
result.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
126+
result.setTextColor(0xFFFFFFFF);
127+
container.addView(result);
128+
return result;
129+
}
130+
131+
@Override
132+
public void onSaveInstanceState(Bundle outState) {
133+
outState.putBoolean(DOWNSCALE_FILTER, downScale.isChecked());
134+
super.onSaveInstanceState(outState);
135+
}
136+
}

0 commit comments

Comments
 (0)