Android рдкрд░ рдкреНрд░рднрд╛рд╡реА рдмреНрд▓рд░ рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐
рдЖрдЬ рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдзреБрдВрдзрд▓рд╛ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред StackOverflow рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЗрдЦ рдФрд░ рдкреЛрд╕реНрдЯ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рд░рд╛рдп рдФрд░ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреНрдпреЛрдВ?


Google Play Store рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдврд╝рддреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо рдЕрджреНрднреБрдд Muzei рдЖрд╡реЗрджрди + RomanNurik рдпрд╛ рдЙрд╕реА рдпрд╛рд╣реВ рдореМрд╕рдо рд╕реЗ рд▓реЗрдВред рдЗрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдзрдмреНрдмрд╛ рдХреЗ рдХреБрд╢рд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде, рдЖрдк рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рд▓реЗрдЦреЛрдВ рдХреА рдзреБрдВрдзрд▓рд╛ рдЪрд┐рддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдиреЗ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣рд╛рдБ рдХреБрдЫ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ:

рдЫрд╡рд┐

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ



рдкрд╣рд▓реЗ рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ 1 рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ ViewPager рд╕реНрдерд┐рдд рд╣реИред ViewPager рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝реНрд▓рд┐рдк рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝рд╛ рдзрдмреНрдмрд╛ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдпрд╣ рдореЗрд░рд╛ main_layout.xml рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.paveldudka.MainActivity" /> 


рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣ рд╣реИ рдЬреЛ рдЦрдВрдб рд▓реЗрдЖрдЙрдЯ (fragment_layout.xml) рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/picture" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/picture" android:scaleType="centerCrop" /> <TextView android:id="@+id/text" android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="My super text" android:textColor="@android:color/white" android:layout_gravity="center_vertical" android:textStyle="bold" android:textSize="48sp" /> <LinearLayout android:id="@+id/controls" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#7f000000" android:orientation="vertical" android:layout_gravity="bottom"/> </FrameLayout> 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рднреА рд╕реИрдиреНрдп рдирд╣реАрдВ рд╣реИ - рдмреАрдЪ рдореЗрдВ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рддрд╕реНрд╡реАрд░ред рдЖрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реИрдЦрд┐рдХ -рдЖрдЙрдЯрдЖрдЙрдЯ рдХреЛ рднреА рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрд╡рд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реВрдВрдЧрд╛ред

рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдкрд╛рда рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ:


Renderscript


рд╕рдВрднрд╡рддрдГ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрддреНрддрд░ "рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдПрдХ рдЫрд╡рд┐ рдХреЛ рдХреИрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдзреБрдВрдзрд▓рд╛ рдХрд░рдирд╛ рд╣реИ" рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЫрд╡рд┐ рдЙрдкрдХрд░рдг рд╣реИред рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрд╕рдХреЗ рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрд▓рдВрдХ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

 public class RSBlurFragment extends Fragment { private ImageView image; private TextView text; private TextView statusText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); image = (ImageView) view.findViewById(R.id.picture); text = (TextView) view.findViewById(R.id.text); statusText = addStatusText((ViewGroup) view.findViewById(R.id.controls)); applyBlur(); return view; } private void applyBlur() { image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { image.getViewTreeObserver().removeOnPreDrawListener(this); image.buildDrawingCache(); Bitmap bmp = image.getDrawingCache(); blur(bmp, text); return true; } }); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private void blur(Bitmap bkg, View view) { long startMs = System.currentTimeMillis(); float radius = 20; Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()), (int) (view.getMeasuredHeight()), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.translate(-view.getLeft(), -view.getTop()); canvas.drawBitmap(bkg, 0, 0, null); 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"); } @Override public 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; } } 


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


рд╡рд╛рдкрд╕ blur() :


рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд╛рде 57ms рд▓рд┐рдпрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдПрдХ рдлреНрд░реЗрдо рдХреЛ 16ms (~ 60fps) рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлреНрд░реЗрдо рджрд░ рдЙрд╕ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП 17fps рддрдХ рдЧрд┐рд░ рдЬрд╛рддреА рд╣реИ рдЬрдм рдзреБрдВрдзрд▓рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдХрд╣реВрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдзрдмреНрдмрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ ScriptIntrinsicBlur API> 16 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдмреЗрд╢рдХ, рдЖрдк рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдкреЛрд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╕реНрддрд░ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдЕрднрд┐рд╕рд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдЗрдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦреЗрдВред

FastBlur



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдзреБрдВрдзрд▓рд╛рдкрди рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд╣реЗрд░рдлреЗрд░ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЦреБрдж рд╣реА рдЗрди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдзреБрдВрдзрд▓рд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рдПрдХ рдЪреБрдирдирд╛ рд╣реИред
рд╕рднреА рдЬрд╛рдирдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ ( рдпрд╛ рдпрд╣реАрдВ, рдпрд╣рд╛рдБ ) рдкрд░, рдореИрдВ рдХрд▓рдВрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рдерд╛ред

рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛ред рдореИрдВ рд╕рднреА рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдХрд▓рдВрдХ () рдлрд╝рдВрдХреНрд╢рди рдЕрд▓рдЧ рд╣реЛрдЧрд╛:

 private void blur(Bitmap bkg, View view) { long startMs = System.currentTimeMillis(); float radius = 20; Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()), (int) (view.getMeasuredHeight()), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(overlay); canvas.translate(-view.getLeft(), -view.getTop()); canvas.drawBitmap(bkg, 0, 0, null); overlay = FastBlur.doBlur(overlay, (int)radius, true); view.setBackground(new BitmapDrawable(getResources(), overlay)); statusText.setText(System.currentTimeMillis() - startMs + "ms"); } 


рдФрд░ рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдЦрд░рд╛рдм рд╣реИ - 147ms ! рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдзреАрдореА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рджреВрд░ рд╣реИ! рдореБрдЭреЗ рдЧреЙрд╕ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рднреА рдбрд░ рд▓рдЧрддрд╛ рд╣реИред

рдЕрдиреБрдХреВрд▓рди



рдЪрд▓реЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдзрдмреНрдмрд╛ рд╣реИред рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ, рдзреБрдВрдзрд▓рд╛рдкрди рдкрд┐рдХреНрд╕рд▓ рдХреЗ "рдиреБрдХрд╕рд╛рди" рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ (рдореИрдВ рдЧрдгрд┐рдд рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╢рдкрде рдирд╣реАрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрдереНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреА рдореЗрд░реА рд╕рдордЭ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдзрд┐рдХ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ :))ред рдФрд░ рдХреНрдпрд╛ рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ "рдЦреЛ" рдкрд┐рдХреНрд╕рд▓ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЪрд┐рддреНрд░ рдХреЛ рдХрдо рдХрд░рдирд╛!

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рдЫрд╡рд┐ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдзреБрдВрдзрд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ?

рдЪрд▓реЛ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ!

рдЫрд╡рд┐

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 13ms рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ 2ms FastBlur рд╣реИрдВред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХрд▓рдВрдХ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рддреБрд▓рдиреАрдп рд╣реИред

рдЖрдЗрдП рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рдореИрдВ рдХреЗрд╡рд▓ FastBlur рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕рдорд╛рди рд╣реЛрдЧрд╛ (рдХреЛрдб рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ):

 private void blur(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); overlay = FastBlur.doBlur(overlay, (int)radius, true); view.setBackground(new BitmapDrawable(getResources(), overlay)); statusText.setText(System.currentTimeMillis() - startMs + "ms"); } 




рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ FastBlur рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдХрд┐ рд╣рдордиреЗ рдЖрд╡рдВрдЯрди рдФрд░ рд╡рд╛рдкрд╕ рдмрд┐рдЯрдореИрдк рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрдЪрд╛рдпрд╛ред

рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:
GitHub рдкрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд
рд▓реЗрдЦ рдХрд╛ рдкреВрд░реНрд╡рдЬ
рдзрдмреНрдмрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдПрд╕рдУ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ

Source: https://habr.com/ru/post/In215077/


All Articles