从头开始敲代码之《从BaseApplication/Activity开始(四)》

转载请注明出处:王亟亟的大牛之路

早上无聊看以前下的一大堆资料,发现一个用JNI实现的模糊效果,效果都差不多,但是对JNI的不熟悉让我不太推荐这种办法(不了解的总不方便,调试,修改都是) 然后在Git上找到个不错的实现,还是分2种的,应对于各种需要。

这一篇文章会介绍什么

1.模糊视图处理2.线程操作优化

1.Renderscript 2.FastBlur

效果图

布局:

==”match_parent”><ImageView=”match_parent”android:scaleType=”centerCrop” /><LinearLayout==”vertical”android:layout_gravity=”bottom”/><TextView====”48sp” /></FrameLayout>

并不是自定义控件,而是对图像本身进行了操作。

1.创建了一个空的bitmap,把背景的一部分复制进去,之后我会对这个bitmap进行模糊处理并设置为TextView的背景。

2.通过这个bitmap保存Canvas的状态;

3.在父布局文件中把Canvas移动到TextView的位置;

4.把ImageView的内容绘到bitmap中;

5.此时,我们就有了一个和TextView一样大小的bitmap,它包含了ImageView的一部分内容,也就是TextView背后一层布局的内容;

6.创建一个Renderscript的实例;

7.把bitmap复制一份到Renderscript需要的数据片中;

8.创建Renderscript模糊处理的实例;

9.设置输入,半径范围然后进行模糊处理;

10.把处理后的结果复制回之前的bitmap中;

11.已经把bitmap进行模糊处理了,可以将它设置为TextView背景了;

2种形式在ViewPager中分别实现,RSBlurFragment,FastBlurFragment

FuzzyActivity(容器)

{private CustomPagerAdapter pagerAdapter;private RSBlurFragment rsBlurFragment;private FastBlurFragment fastBlurFragment;private ViewPager viewPager;private ArrayList<Fragment> fragments ;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fuzzy_layout);fragments = new ArrayList<Fragment>();rsBlurFragment=new RSBlurFragment();fastBlurFragment=new FastBlurFragment();fragments.add(rsBlurFragment);fragments.add(fastBlurFragment);pagerAdapter =new CustomPagerAdapter(getSupportFragmentManager(),fragments);viewPager = (ViewPager) findViewById(R.id.pager);viewPager.setAdapter(pagerAdapter);viewPager.setPageTransformer(true, new ZoomOutPageTransformer());viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {(int position, float positionOffset, int positionOffsetPixels) {}(int position) {}(int state) {}});}{private ArrayList<Fragment> fragments ;public CustomPagerAdapter(FragmentManager fm) {super(fm);}public CustomPagerAdapter(FragmentManager fm,ArrayList<Fragment> fragments) {super(fm);this.fragments=fragments;}@Overridepublic Fragment getItem(int i) {return fragments.get(i);}() {return fragments.size();}@Overridepublic CharSequence getPageTitle(int position) {return fragments.get(position).toString();}}}

RSBlurFragment

{private ImageView image;private TextView maimai;private TextView statusText;private CheckBox downScale;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.blur_layout, container, false);image = (ImageView) view.findViewById(R.id.picture);maimai = (TextView) view.findViewById(R.id.text);image.setImageResource(R.drawable.fuzzybg);statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls));addCheckBoxes((ViewGroup) view.findViewById(R.id.controls));applyBlur();return view;}() {image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {() {image.getViewTreeObserver().removeOnPreDrawListener(this);image.buildDrawingCache();Bitmap bmp = image.getDrawingCache();blur(bmp, maimai);return true;}});}@TargetApi(Build.VERSION_CODES.KITKAT)(Bitmap bkg, View view) {long startMs = System.currentTimeMillis();float scaleFactor = 1;float radius = 20;if (downScale.isChecked()) {scaleFactor = 8;radius = 2;}Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth() / scaleFactor),(int) (view.getMeasuredHeight() / scaleFactor), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(overlay);canvas.translate(-view.getLeft() / scaleFactor, -view.getTop() / scaleFactor);canvas.scale(1 / scaleFactor, 1 / scaleFactor);Paint paint = new Paint();paint.setFlags(Paint.FILTER_BITMAP_FLAG);canvas.drawBitmap(bkg, 0, 0, paint);RenderScript rs = RenderScript.create(getActivity());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();statusText.setText(System.currentTimeMillis() – startMs + “ms”);}@Overridepublic String toString() {return “RenderScript”;}private TextView addStatusText(ViewGroup container) {TextView result = new TextView(getActivity());result.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));result.setTextColor(0xFFFFFFFF);container.addView(result);return result;}(ViewGroup container) {downScale = new CheckBox(getActivity());ViewGroup.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);downScale.setLayoutParams(lp);downScale.setText(“Downscale before blur”);downScale.setVisibility(View.VISIBLE);downScale.setTextColor(0xFFFFFFFF);downScale.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {(CompoundButton buttonView, boolean isChecked) {applyBlur();}});container.addView(downScale);}}好好扮演自己的角色,做自己该做的事

从头开始敲代码之《从BaseApplication/Activity开始(四)》

相关文章:

你感兴趣的文章:

标签云: