Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 1 | /* |
Jakub Gielzak | aea7364 | 2019-01-25 15:04:36 +0000 | [diff] [blame] | 2 | * Copyright 2018 The Android Open Source Project |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | package com.example.androidx.viewpager2 |
| 18 | |
| 19 | import android.os.Bundle |
| 20 | import android.view.View |
| 21 | import android.widget.AdapterView |
| 22 | import android.widget.ArrayAdapter |
| 23 | import android.widget.Button |
| 24 | import android.widget.CheckBox |
| 25 | import android.widget.Spinner |
| 26 | import android.widget.SpinnerAdapter |
| 27 | import androidx.fragment.app.FragmentActivity |
| 28 | import androidx.viewpager2.widget.ViewPager2 |
Jakub Gielzak | b60fc00 | 2018-10-19 16:36:59 +0100 | [diff] [blame] | 29 | import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL |
| 30 | import androidx.viewpager2.widget.ViewPager2.ORIENTATION_VERTICAL |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 31 | import com.example.androidx.viewpager2.cards.Card |
| 32 | |
| 33 | /** |
| 34 | * Base class for the two activities in the demo. Sets up the list of cards and implements UI to |
| 35 | * jump to arbitrary cards using setCurrentItem, either with or without smooth scrolling. |
| 36 | */ |
| 37 | abstract class BaseCardActivity : FragmentActivity() { |
| 38 | |
| 39 | lateinit var viewPager: ViewPager2 |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 40 | private lateinit var cardSelector: Spinner |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 41 | private lateinit var smoothScrollCheckBox: CheckBox |
| 42 | private lateinit var rotateCheckBox: CheckBox |
| 43 | private lateinit var translateCheckBox: CheckBox |
| 44 | private lateinit var scaleCheckBox: CheckBox |
| 45 | private lateinit var gotoPage: Button |
| 46 | private lateinit var orientationSelector: Spinner |
Jelle Fresen | 87099db | 2019-01-25 16:10:58 +0000 | [diff] [blame] | 47 | private lateinit var disableUserInputCheckBox: CheckBox |
Jakub Gielzak | b60fc00 | 2018-10-19 16:36:59 +0100 | [diff] [blame] | 48 | private var orientation: Int = ORIENTATION_HORIZONTAL |
Jelle Fresen | b82b827 | 2018-10-12 16:18:19 +0100 | [diff] [blame] | 49 | |
Jakub Gielzak | b60fc00 | 2018-10-19 16:36:59 +0100 | [diff] [blame] | 50 | private val translateX get() = orientation == ORIENTATION_VERTICAL && |
Jelle Fresen | b82b827 | 2018-10-12 16:18:19 +0100 | [diff] [blame] | 51 | translateCheckBox.isChecked |
Jakub Gielzak | b60fc00 | 2018-10-19 16:36:59 +0100 | [diff] [blame] | 52 | private val translateY get() = orientation == ORIENTATION_HORIZONTAL && |
Jelle Fresen | b82b827 | 2018-10-12 16:18:19 +0100 | [diff] [blame] | 53 | translateCheckBox.isChecked |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 54 | |
Jelle Fresen | 53d5dd8 | 2018-12-17 16:46:52 +0000 | [diff] [blame] | 55 | protected open val layoutId: Int = R.layout.activity_no_tablayout |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 56 | |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 57 | private val mAnimator = ViewPager2.PageTransformer { page, position -> |
| 58 | val absPos = Math.abs(position) |
| 59 | page.apply { |
Jelle Fresen | b82b827 | 2018-10-12 16:18:19 +0100 | [diff] [blame] | 60 | rotation = if (rotateCheckBox.isChecked) position * 360 else 0f |
| 61 | translationY = if (translateY) absPos * 500f else 0f |
| 62 | translationX = if (translateX) absPos * 350f else 0f |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 63 | if (scaleCheckBox.isChecked) { |
Jelle Fresen | b82b827 | 2018-10-12 16:18:19 +0100 | [diff] [blame] | 64 | val scale = if (absPos > 1) 0F else 1 - absPos |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 65 | scaleX = scale |
| 66 | scaleY = scale |
| 67 | } else { |
| 68 | scaleX = 1f |
| 69 | scaleY = 1f |
| 70 | } |
| 71 | } |
| 72 | } |
| 73 | |
Jelle Fresen | e280e94 | 2018-10-17 12:56:29 +0100 | [diff] [blame] | 74 | public override fun onCreate(savedInstanceState: Bundle?) { |
| 75 | super.onCreate(savedInstanceState) |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 76 | setContentView(layoutId) |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 77 | |
| 78 | viewPager = findViewById(R.id.view_pager) |
| 79 | orientationSelector = findViewById(R.id.orientation_spinner) |
Jelle Fresen | 87099db | 2019-01-25 16:10:58 +0000 | [diff] [blame] | 80 | disableUserInputCheckBox = findViewById(R.id.disable_user_input_checkbox) |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 81 | cardSelector = findViewById(R.id.card_spinner) |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 82 | smoothScrollCheckBox = findViewById(R.id.smooth_scroll_checkbox) |
| 83 | rotateCheckBox = findViewById(R.id.rotate_checkbox) |
| 84 | translateCheckBox = findViewById(R.id.translate_checkbox) |
| 85 | scaleCheckBox = findViewById(R.id.scale_checkbox) |
| 86 | gotoPage = findViewById(R.id.jump_button) |
| 87 | |
Jelle Fresen | 87099db | 2019-01-25 16:10:58 +0000 | [diff] [blame] | 88 | disableUserInputCheckBox.setOnCheckedChangeListener { _, isDisabled -> |
| 89 | viewPager.isUserInputEnabled = !isDisabled |
| 90 | } |
| 91 | |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 92 | orientationSelector.adapter = createOrientationAdapter() |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 93 | cardSelector.adapter = createCardAdapter() |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 94 | |
| 95 | viewPager.setPageTransformer(mAnimator) |
| 96 | |
| 97 | orientationSelector.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { |
| 98 | override fun onItemSelected( |
| 99 | parent: AdapterView<*>, |
Jelle Fresen | 5d176f6 | 2018-10-12 16:44:53 +0100 | [diff] [blame] | 100 | view: View?, |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 101 | position: Int, |
| 102 | id: Long |
| 103 | ) { |
| 104 | when (parent.selectedItem.toString()) { |
Jakub Gielzak | b60fc00 | 2018-10-19 16:36:59 +0100 | [diff] [blame] | 105 | HORIZONTAL -> orientation = ORIENTATION_HORIZONTAL |
| 106 | VERTICAL -> orientation = ORIENTATION_VERTICAL |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 107 | } |
Jelle Fresen | b82b827 | 2018-10-12 16:18:19 +0100 | [diff] [blame] | 108 | viewPager.orientation = orientation |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 109 | } |
| 110 | |
| 111 | override fun onNothingSelected(adapterView: AdapterView<*>) {} |
| 112 | } |
| 113 | |
| 114 | gotoPage.setOnClickListener { |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 115 | val card = cardSelector.selectedItemPosition |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 116 | val smoothScroll = smoothScrollCheckBox.isChecked |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 117 | viewPager.setCurrentItem(card, smoothScroll) |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 118 | } |
| 119 | } |
| 120 | |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 121 | private fun createCardAdapter(): SpinnerAdapter { |
| 122 | val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, Card.DECK) |
| 123 | adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) |
| 124 | return adapter |
| 125 | } |
| 126 | |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 127 | private fun createOrientationAdapter(): SpinnerAdapter { |
| 128 | val adapter = ArrayAdapter(this, |
| 129 | android.R.layout.simple_spinner_item, arrayOf(HORIZONTAL, VERTICAL)) |
| 130 | adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) |
| 131 | return adapter |
| 132 | } |
| 133 | |
| 134 | companion object { |
Jelle Fresen | 245f8ec | 2018-12-17 16:21:41 +0000 | [diff] [blame] | 135 | val cards = Card.DECK |
Florina Muntenescu | ad8d1a6 | 2018-09-21 16:21:40 +0100 | [diff] [blame] | 136 | private const val HORIZONTAL = "horizontal" |
| 137 | private const val VERTICAL = "vertical" |
| 138 | } |
| 139 | } |