IOS-рд╢реИрд▓реА рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ ViewPager рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реБрдП

рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдирдП рдЯреБрдХрдбрд╝реЗ рдЦреЛрд▓рддреЗ рд╕рдордп рдПрдирд┐рдореЗрд╢рди рдФрд░ рдмрджрд▓рд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред рд╣рдореЗрдВ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдпрд╛ рддреЛ рдЯреБрдХрдбрд╝реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдКрдкрд░ рд▓реЗрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЗрд▓рдирд╛ (рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛)ред рд░рд┐рдкреНрд▓реЗ рдореЗрдВ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдирд┐рдореЗрд╢рди рд╣реИрдВ:


рдпрд╣ рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
.beginTransaction() .setCustomAnimations( R.anim.enter_from_left, //   2 R.anim.exit_to_right, //   1 R.anim.enter_from_right, //   1 R.anim.exit_to_left) //   2 .replace(R.id.container, myFragment) .commit() 

рдЫрд╡рд┐


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


рд╕реНрдЯреИрдХ рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдЬреЛрдбрд╝рдирд╛ (рдЬреЛрдбрд╝рдирд╛) рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкреАрдЫреЗ рд╡рд╛рд▓рд╛ рдЧрддрд┐рд╣реАрди рд╣реЛрдЧрд╛ред


рдФрд░ рдпрд╣ рд╕рдм, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЦрд░рд╛рдм рдкреНрд░рддрд┐рдкрд╛рджрди рдФрд░ рдЯреВрдЯреЗ рд╣реБрдП рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде рд╣реИред


рдирддреАрдЬрддрди, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ VKontakte рдпрд╛ Instagram рдЬреИрд╕реЗ рдмрдбрд╝реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднреА рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред


рдбреЗрдврд╝ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдиреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдПрдХреНрд╕ (рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг) рдкреЗрд╢ рдХрд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд┐рдпрд╛:


рдЫрд╡рд┐


рдпрд╣рд╛рдВ, рд╕рд╛рдордиреЗ рдФрд░ рдкреАрдЫреЗ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЗрд╢рд╛рд░реЗ рдХреЗ рд╕рд╛рде рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реИред


рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдЕрдВрд╢реЛрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:


рдЫрд╡рд┐


рддреЛ, NavigatorViewPager рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:


 class NavigatorViewPager : ViewPager { init { init() } constructor(context: Context) : super(context) constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) override fun canScrollHorizontally(direction: Int): Boolean { return false } //  private fun init() { // PageTransformer       setPageTransformer(false, NavigatorPageTransformer()) //   overScrollMode = View.OVER_SCROLL_NEVER //       , //    setDurationScroll(300) } //      fun setDurationScroll(millis: Int) { try { val viewpager = ViewPager::class.java val scroller = viewpager.getDeclaredField("mScroller") scroller.isAccessible = true scroller.set(this, OwnScroller(context, millis)) } catch (e: Exception) { e.printStackTrace() } } //      DecelerateInterpolator() inner class OwnScroller(context: Context, durationScroll: Int) : Scroller(context, DecelerateInterpolator(1.5f)) { private var durationScrollMillis = 1 init { this.durationScrollMillis = durationScroll } override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) { super.startScroll(startX, startY, dx, dy, durationScrollMillis) } } } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░рд╛ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:


 <info.yamm.project2.navigator.NavigatorViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/navigator_view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" android:fitsSystemWindows="false" tools:context=".activities.MainActivity"/> 

рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реЗрдЯ рдмреНрд▓реИрдХред рдмрдВрдж рдЯреБрдХрдбрд╝реЗ рдкрд░ рдЫрд╛рдпрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдЧреЗ рдпрд╣ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред


рдЕрдм рд╣рдореЗрдВ рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЯреБрдХрдбрд╝реЗ рдбрд╛рд▓реЗрдВрдЧреЗ:


 class NavigatorAdapter(val fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) { // ArrayList      private val listOfFragments: ArrayList<BaseFragment> = ArrayList() //  fun addFragment(fragment: BaseFragment) { listOfFragments.add(fragment) notifyDataSetChanged() } //   fun removeLastFragment() { listOfFragments.removeAt(listOfFragments.size - 1) notifyDataSetChanged() } //     fun getFragmentsCount(): Int { return listOfFragments.size } override fun getItemPosition(`object`: Any): Int { val index = listOfFragments.indexOf(`object`) //        return if (index == -1) PagerAdapter.POSITION_NONE else index } override fun getItem(position: Int): Fragment? { return listOfFragments[position] } override fun getCount(): Int { return listOfFragments.size } override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { super.destroyItem(container, position, `object`) } } 

рд╣рдорд╛рд░реЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмрдирд╛рдПрдБ:


 class NavigatorPageTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) { // PageTransformer       view.apply { val pageWidth = width when { //        position <= -1 -> { //   INVISIBLE       //    visibility = View.INVISIBLE } // ,          position > 0 && position <= 1 -> { alpha = 1f visibility = View.VISIBLE translationX = 0f } //         // (    ,     NavigatorViewPager?) position <= 0 -> { alpha = 1.0F - Math.abs(position) / 2 translationX = -pageWidth * position / 1.3F visibility = View.VISIBLE } //    ,     else -> { visibility = View.INVISIBLE } } } } } 

рдЕрдм - рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк! рд╣рдо рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдВрд╢реЛрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рд▓рд┐рдЦрддреЗ рд╣реИрдВ:


 class MainActivity : BaseActivity() { private lateinit var navigatorAdapter: NavigatorAdapter private lateinit var navigatorViewPager: NavigatorViewPager private lateinit var mainFragment: MainFragment override fun onCreate(savedInstanceState: Bundle?) { setTheme(info.yamm.project2.R.style.AppTheme) //   navigatorViewPager = findViewById<NavigatorViewPager>(info.yamm.project2.R.id.navigator_view_pager) //   (    BottomNavigationView   ) mainFragment = MainFragment() //  navigatorAdapter = NavigatorAdapter(supportFragmentManager) //       addFragment(mainFragment) //     navigatorViewPager.adapter = navigatorAdapter //      // :   FragmentStatePagerAdapter,   //     . // FragmentPagerAdapter   ,         // ,    . // ,     INVISIBLE  PageTransformer //     ,        //   .    , //       navigatorViewPager.offscreenPageLimit = 30 var canRemoveFragment: Boolean = false //         var sumPositionAndPositionOffset = 0.0f //   navigatorViewPager.addOnPageChangeListener(object : OnPageChangeListener { //     ,     override fun onPageScrollStateChanged(state: Int) { if (state == 0 && canRemoveFragment) { while ((navigatorAdapter.getFragmentsCount() - 1) > navigatorViewPager.currentItem) { navigatorAdapter.removeLastFragment() } } } //       //        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { canRemoveFragment = position + positionOffset < sumPositionAndPositionOffset sumPositionAndPositionOffset = position + positionOffset } override fun onPageSelected(position: Int) { } }) } //             fun addFragment(fragment: BaseFragment) { navigatorAdapter.addFragment(fragment) navigatorViewPager.currentItem = navigatorViewPager.currentItem + 1 } //    "" override fun onBackPressed() { if (navigatorAdapter.getFragmentsCount() > 1) { navigatorViewPager.setCurrentItem(navigatorViewPager.currentItem - 1, true) } else { finish() } } } 

рд╡рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рд╣реИред рдЕрдм рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╣рдо рдПрдХреНрдЯреАрд╡рд┐рдЯреА рд╕реЗ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ:


 (activity as MainActivity).addFragment(ConversationFragment()) 

рдФрд░ рдЬрдм рджрд╛рдИрдВ рдУрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕реНрд╡рдпрдВ рд╣реА рд╣рдорд╛рд░реЗ рдСрдирдкреЗрдВрдЬрдЪреЗрдВрдЬрд▓рд┐рд╕реНрдЯрд░ рд╢реНрд░реЛрддрд╛ рдХреА рдорджрдж рд╕реЗ рд╕реНрдЯреИрдХ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


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

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


All Articles