Android рдореЗрдВ рд╕реВрдЪреА рджреГрд╢реНрдп рдЖрдЗрдЯрдо рдПрдирд┐рдореЗрдЯреЗрдб

рд╢реБрдн рджрд┐рди, рд╣рд░рдЬреЗрдЯреАред

рдЖрдЬ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде Android рдореЗрдВ ListView рдЖрдЗрдЯрдореНрд╕ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХреЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЖрдорддреМрд░ рдкрд░, рдПрдХ ListView рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рдПрдХ рдЙрдкрдпреБрдХреНрдд рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдмреЗрд╕ рдПрдбреЗрдкреНрдЯрд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛; рдЖрдк рдпрд╣рд╛рдВ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЬ рд╣рдо рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЛ "рдЕрдЪрд╛рдирдХ" рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рдЙрдирдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдЪреЗрддрди рдХрд░реЗрдВрдЧреЗред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдирдпрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ "рдПрдирд┐рдореЗрдЯреЗрдбрдбреЗрдЯрд┐рд╕реНрдЯ рд╡реНрдпреВрдкреНрд▓рд╛рдВрдЯ" рдХрд╣рд╛ рд╣реИред рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╕рдордп, рдореИрдВ рдЕрднреА рддрдХ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реВрдВ, рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
рдЕрдЧрд▓рд╛ рдХрджрдо рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ListViewAnimations рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХреНрд▓реЛрди рдХрд░рдХреЗ GitHub рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрдЧреЗред
git clone github.com/nhaarman/ListViewAnimations.git git clone github.com/nhaarman/ListViewAnimations.git рдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЧреНрд░рд╣рдг рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдХреЗред рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ LiastViewAnimations рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЧреНрд░рд╣рдг рдореЗрдВ, рдпрд╣ рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ -> рдЖрдпрд╛рдд -> рдХрд╛рд░реНрдпрд╕реНрдерд▓ рдореЗрдВ рдореМрдЬреВрджрд╛ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЛрдб рдФрд░ рдирдП рдЕрдирдкреИрдХ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ lib рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред

рдЕрдм рд╣рдореЗрдВ ListViewAnimations рдХреЛ рдЙрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ "AnimatedListViewSample" рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЦреЛрд▓реЗрдВ, рдмрд╛рдИрдВ рдУрд░ рд╕реВрдЪреА рдореЗрдВ "рдПрдВрдбреНрд░реЙрдЗрдб" рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рджрд╛рдПрдВ рдкреИрдирд▓ рдХреЛ "рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдЕрдиреБрднрд╛рдЧ рддрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВред Add рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╕реВрдЪреА рдореЗрдВ рд╕реЗ AnimatedListViewLibrary рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рдЫрд╡рд┐

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕рд░рд▓ рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ рдЬреЛ рд▓рд┐рд╕реНрдЯ рд╡реНрдпреВрдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реАред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЧреНрд░рд╣рдг рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдмрдирд╛рдПрдВ: рдлрд╝рд╛рдЗрд▓ -> рдирдпрд╛ -> рдЕрдиреНрдп ...
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реВрдЪреА рд╕реЗ "рдПрдВрдбреНрд░реЙрдЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ" рдЪреБрдиреЗрдВ, рдлрд┐рд░ рд░рд┐рдХреНрдд рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рд▓реЙрдиреНрдЪрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рддрд╛рдХрд┐ рд╡рд┐рдЬрд╝рд╛рд░реНрдб рдкреНрд░рдХрдЯ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд▓реЗ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдореЗрди рдХреНрд▓рд╛рд╕ рдФрд░ рдПрдХ рдПрдХреНрд╕рдПрдордПрд▓ рдлрд╛рдЗрд▓ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ (рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдЖрдЙрдЯ рдореЗрдВ) рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА_рдореИрди.рдПрдХреНрд╕рдПрдордПрд▓ рдХреА рд▓реЛрдХреЗрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрдЧрд╛ред

 package com.example.animatedlistviewsample; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 


рд▓реЗрдЖрдЙрдЯ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рдХрд╛рд▓реЗрдВ, рдПрдХ рд░рд┐рдХреНрдд рд╕реНрдХреНрд░реАрди рд░рд╣рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рдВрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рдЖрдкрдХрд╛ activity_main.xml рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > </RelativeLayout> 


рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЛ ListActivity рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ ListView рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдЗрдП, рдорд╛рдирдХ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ рдПрдХ TextView рддрддреНрд╡ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдбреЗрдкреНрдЯрд░ рдмрдирд╛рдПрдВ:

 private class MyBaseAdapter extends BaseAdapter { @Override public int getCount() { return 100; } @Override public String getItem(int position) { return String.format(" : %d", position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = LayoutInflater.from(getBaseContext()).inflate(android.R.layout.list_content, parent, false); } ((TextView)convertView.findViewById(android.R.id.text1)).setText(getItem(position)); return convertView; } } 


рдореИрдВрдиреЗ рдПрдбрд╛рдкреНрдЯрд░ рдХреЛрдб рдХреЛ рдореЗрдирдРрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреНрд▓рд╛рд╕ рдХреЗ рдареАрдХ рдЕрдВрджрд░ рд░рдЦрд╛ред

рдпрд╣ рд╣рдорд╛рд░реЗ рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ ListView рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред

рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

getListView().setAdapter(new MyBaseAdapter()); рдСрди-рдкреНрд░рд┐рдЯ рд╡рд┐рдзрд┐ рдХреЛ рд╕реБрдкрд░рдЪрд╛рдЗрдк рдСрдирдХреНрд░рд┐рдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рджред

MainActivity.java рдХреЛрдб рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 package com.example.animatedlistviewsample; import android.os.Bundle; import android.app.Activity; import android.app.ListActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getListView().setAdapter(new MyBaseAdapter()); } private class MyBaseAdapter extends BaseAdapter { @Override public int getCount() { return 100; } @Override public String getItem(int position) { return String.format(" : %d", position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = LayoutInflater.from(getBaseContext()).inflate(android.R.layout.simple_list_item_1, parent, false); } ((TextView)convertView.findViewById(android.R.id.text1)).setText(getItem(position)); return convertView; } } } 


рдЖрдк рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ AndroidManifest рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╣реИ:
 <activity android:name="com.example.animatedlistviewsample.MainActivity" android:label="@string/title_activity_main" > <intent-filter> <category android:name="android.intent.category.LAUNCHER"/> <action android:name="android.intent.action.MAIN"/> </intent-filter> </activity> 


рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪреА рдорд┐рд▓реЗрдЧреА:
ActivityMain

рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рд╕реНрдЯ рд╡реНрдпреВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣рдж рддрдХ рд╢реЗрд╖ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реВрдЪреА рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЪреЗрддрди рдХрд░рдирд╛ред ListViewAnimations рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдбреЗрдкреНрдЯрд░ рд╣реИрдВ:
- SwingBottomInAnimationAdapter.java
- SwingLeftInAnimationAdapter.java
- SwingRightInAnimationAdapter.java
- AlphaInAnimationAdapter.java

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

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SwingBottomInAnimationAdapter swingBottomInAdapter = new SwingBottomInAnimationAdapter(new MyBaseAdapter()); swingBottomInAdapter.setAbsListView(getListView()); getListView().setAdapter(swingBottomInAdapter); } 


swingBottomInAdapter.setAbsListView(getListView()); рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SwingBottomInAnimationAdapter рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдкрдирд╛ рдХреЛрдб рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдпрд╛ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВред рдХреНрдпрд╛ рдпрд╣ рд╕реБрдВрджрд░ рд╣реИ?

рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles