
рдЖрдЬ рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдзреБрдВрдзрд▓рд╛ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред 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>
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рднреА рд╕реИрдиреНрдп рдирд╣реАрдВ рд╣реИ - рдмреАрдЪ рдореЗрдВ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рддрд╕реНрд╡реАрд░ред рдЖрдк рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реИрдЦрд┐рдХ -рдЖрдЙрдЯрдЖрдЙрдЯ рдХреЛ рднреА рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрд╡рд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реВрдВрдЧрд╛ред
рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдкрд╛рда рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЗрд╕ рдкрд░ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ:
- рдЫрд╡рд┐ рд╕реЗ, рдЙрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдХрд╛рдЯ рджреЗрдВ рдЬреЛ рд╕реАрдзреЗ TextView рдХреЗ рдкреАрдЫреЗ рд╕реНрдерд┐рдд рд╣реИ
- рдзреЛ рд▓реЗрдВ
- рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рдгрд╛рдо TextView рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
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; } }
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
- рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдмрдирд╛рддреЗ рд╕рдордп - рдПрдХ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрд░реЗ "рд╕реЗрд╡рд╛ рдкреИрдирд▓" рдореЗрдВ рдПрдХ TextView рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЧрддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛) рдФрд░ рдзреБрдВрдзрд▓рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ
applyBlur()
рдЕрдВрджрд░ applyBlur()
рдореИрдВ onPreDrawListener
рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ onPreDrawListener
ред рдореИрдВ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореЗрд░реЗ UI рддрддреНрд╡ рдЕрднреА рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдзреБрдВрдзрд▓рд╛ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЙрд╕ рдХреНрд╖рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рдореЗрд░рд╛ рд▓реЗрдЖрдЙрдЯ рдорд╛рдкрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ред рдкрд╣рд▓рд╛ рдлреНрд░реЗрдо рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛редonPreDraw()
рдЕрдВрджрд░ onPreDraw()
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдХрд░рддрд╛ рд╣реВрдВ onPreDraw()
рд╣реИ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рд╕рдЪ рдореЗрдВ рдмрджрд▓рдирд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ false
рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕реЗ рд╕рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред- рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ - рд╣рдо onPreDraw рдЗрд╡реЗрдВрдЯреНрд╕ рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ
- рдЕрдм рдореБрдЭреЗ рдЕрдкрдиреЗ рдЗрдореЗрдЬ рд╡реНрдпреВ рд╕реЗ рдмрд┐рдЯрдореИрдк рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕реЗ рдПрдХ рдбреНрд░рд╛рдЗрдВрдЧ рдХреИрд╢ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдПрдВ
- рдареАрдХ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдзреБрдВрдзрд▓рд╛ред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдпрд╣ рдХреЛрдб рд▓реЗрдЖрдЙрдЯ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде "рдУрд╡рд░рд░рд╛рдЗрдЯ" рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдкрдХреЛ onGlobalLayoutListener рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛
- рдмреНрд▓рд░ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВ - рдЗрд╕ рддрд░рд╣ рдХрд╛ рдСрдкрд░реЗрд╢рди рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ "рдЕрдирд▓реЛрдб" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпреВрдЖрдИ рдХреЛ рдЕрд╡рд░реБрджреНрдз рди рдХрд░реЗрдВред AsyncTask рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╡рд╛рдкрд╕
blur()
:
- рдПрдХ рдЦрд╛рд▓реА рдмрд┐рдЯрдореИрдк рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ TextView рдХреЗ рдЕрдиреБрд░реВрдк рдЖрдХрд╛рд░ - рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВ
- рдПрдХ рдХреИрдирд╡рд╕ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕ рдмрд┐рдЯрдореИрдк рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рд╣реЛ рд╕рдХреЗрдВ
- рд╣рдо рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ TextView рд╕реНрдерд┐рдд рд╣реИ
- рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдбреНрд░рд╛
- рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд┐рдЯрдореИрдк рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдХреЗ рдкреАрдЫреЗ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ
- рдПрдХ рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
- рд╣рдорд╛рд░реЗ рдмрд┐рдЯрдореИрдк рдХреЛ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- рдПрдХ рдмреНрд▓рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ (ScriptIntrinsicBlur)
- рдмреНрд▓рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рддреНрд░рд┐рдЬреНрдпрд╛ 20) рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ
- рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рд╣рдорд╛рд░реЗ рдмрд┐рдЯрдореИрдк рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВред
- рдорд╣рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдзреБрдВрдзрд▓рд╛ рдмрд┐рдЯрдореИрдк рд╣реИ - рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВ
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╕рд╛рде
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"); }
scaleFactor
рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЪрд┐рддреНрд░ рдХреЛ рдХрд┐рддрдирд╛ рдХрдо рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ 8 рдЧреБрдирд╛ рдХрдо рдХрд░ рджреЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рддрд╕реНрд╡реАрд░ рдХреЛ рдХрдо / рдмрдврд╝рд╛рддреЗ рд╕рдордп рд╣рдо рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╢реЗрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рд╣рдо рдореБрдЦреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмреНрд▓рд░ рд░реЗрдбрд┐рдпрд╕ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдкреНрд░рд╣рд╛рд░ рд╕реЗ рдореИрдВ 2x рддрдХ рдХрдо рд╣реЛ рдЧрдпрд╛- рдПрдХ рдмрд┐рдЯрдореИрдк рдмрдирд╛рдПрдБред рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдХрдо рд╣реЛрдЧрд╛ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, 8 рдмрд╛рд░ред
- рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬрдм рдореИрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЭрдВрдбрд╛
FILTER_BITMAP_FLAG
рд╕реЗрдЯ рдХрд░рддрд╛ FILTER_BITMAP_FLAG
, рдЬреЛ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рдЪреМрд░рд╕рд╛рдИ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ - рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо рдзрдмреНрдмрд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдмрд╣реБрдд рдЫреЛрдЯреА рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рд╛рде рдФрд░ рдПрдХ рдЫреЛрдЯреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдЬреЛ рд╣рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
- рд╣рдордиреЗ рдЗрд╕ рдЫреЛрдЯреА рд╕реА рддрд╕реНрд╡реАрд░ рдХреЛ TextView рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рд╣реИ - рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдмрдврд╝реЗрдЧреАред
рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд░реЗрдВрдбрд░рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ FastBlur рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реБрдЖ рдХрд┐ рд╣рдордиреЗ рдЖрд╡рдВрдЯрди рдФрд░ рд╡рд╛рдкрд╕ рдмрд┐рдЯрдореИрдк рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрдЪрд╛рдпрд╛ред
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдзреБрдВрдзрд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдорд┐рд▓рд╛
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:
GitHub рдкрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрддрд▓реЗрдЦ рдХрд╛ рдкреВрд░реНрд╡рдЬрдзрдмреНрдмрд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдПрд╕рдУ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ