Skip to content

Instantly share code, notes, and snippets.

@hugoangeles0810
Created October 18, 2017 17:27
Show Gist options
  • Save hugoangeles0810/c288c8c6c2be1e3f17c57e8f8ea7eb3f to your computer and use it in GitHub Desktop.
Save hugoangeles0810/c288c8c6c2be1e3f17c57e8f8ea7eb3f to your computer and use it in GitHub Desktop.
package com.tismart.goldfish.presentation.main.view.activities
import android.content.Context
import android.content.Intent
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.support.v4.view.ViewPager
import android.support.v7.app.AppCompatActivity
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Toast
import com.tismart.goldfish.R
import com.tismart.goldfish.presentation.discovercolor.view.activities.DiscoverColorActivity
import com.tismart.goldfish.presentation.inspired.view.activities.InspiredActivity
import com.tismart.goldfish.presentation.main.view.adapters.VPSliderAdapter
import com.tismart.goldfish.presentation.main.viewmodel.vm.SlideVM
import com.tismart.goldfish.presentation.utils.extensions.afterMeasured
import com.tismart.goldfish.presentation.utils.extensions.getColorCompat
import com.tismart.goldfish.presentation.utils.extensions.getDrawableCompat
import com.tismart.goldfish.presentation.utils.interpolators.BounceInterpolator
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.layout_home.*
import kotlinx.android.synthetic.main.layout_home_content.*
import kotlinx.android.synthetic.main.layout_menu.*
import kotlinx.android.synthetic.main.layout_toolbar_logo.*
import java.util.*
class MainActivity : AppCompatActivity() {
private val MARGIN_Y = 36.0f
private val OFFSET = 56.0f
private val DURATION = 750L
private val SLIDE_SWIPE_FACTOR = 5.0
private val SLIDE_DURATION = 5000L
private var isMenuOpen = false
private var isAnimationReady = false
private var scaleX: Float = 0.0f
private var scaleY: Float = 0.0f
private var translateX: Float = 0.0f
private lateinit var slides: List<SlideVM>
private var slideTimer: Timer? = null
private var slideTimerTask: TimerTask? = null
private lateinit var vpSliderAdapter: VPSliderAdapter
companion object {
fun newInstance(ctx: Context): Intent {
return Intent(ctx, MainActivity::class.java)
}
}
private val onPageChangeListener = object : ViewPager.SimpleOnPageChangeListener() {
override fun onPageSelected(pos: Int) {
val currentPos = pos % slides.size
setSliderIndicator(currentPos)
changeButtonsColor(currentPos)
}
}
private val onMenuItemClicked = View.OnClickListener {
when(it.id) {
R.id.tvMenuInspired, R.id.btInspired -> {
selectOptionMenu(tvMenuInspired)
startActivity(InspiredActivity.newInstance(this@MainActivity))
}
R.id.tvMenuDiscoverColor, R.id.btDiscoverColor -> {
selectOptionMenu(tvMenuDiscoverColor)
startActivity(DiscoverColorActivity.newInstance(this@MainActivity))
}
R.id.tvMenuFavorites, R.id.btFavorites -> {
selectOptionMenu(tvMenuFavorites)
Toast.makeText(this@MainActivity, "Activity Favoritos", Toast.LENGTH_SHORT).show()
}
R.id.tvMenuContactUs, R.id.btContactUs -> {
selectOptionMenu(tvMenuContactUs)
Toast.makeText(this@MainActivity, "Activity Contactanos", Toast.LENGTH_SHORT).show()
}
R.id.tvMenuOurProducts -> {
selectOptionMenu(tvMenuOurProducts)
Toast.makeText(this@MainActivity, "Activity Nuestros productos", Toast.LENGTH_SHORT).show()
}
R.id.tvMenuOurWork -> {
selectOptionMenu(tvMenuOurWork)
Toast.makeText(this@MainActivity, "Activity Nuestras obras", Toast.LENGTH_SHORT).show()
}
R.id.tvMenuLocateUs -> {
selectOptionMenu(tvMenuLocateUs)
Toast.makeText(this@MainActivity, "Activity Ubicanos", Toast.LENGTH_SHORT).show()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ui()
}
override fun onResume() {
super.onResume()
slideTimer = Timer()
slideTimerTask = object : TimerTask() {
override fun run() {
if (isAnimationReady && !isMenuOpen) goToNextSlide()
}
}
slideTimer?.schedule(slideTimerTask, SLIDE_DURATION, SLIDE_DURATION)
}
override fun onPause() {
slideTimerTask?.cancel()
slideTimer?.cancel()
slideTimer?.purge()
super.onPause()
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when(item?.itemId) {
android.R.id.home -> handleMenuAnimation()
}
return super.onOptionsItemSelected(item)
}
private fun ui() {
setupToolbar()
setupNavigation()
setupMenuAnimation()
setupSlider()
}
private fun setupToolbar() {
setSupportActionBar(toolbar)
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_menu_gris)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
private fun setupNavigation() {
tvMenuInspired.setOnClickListener(onMenuItemClicked)
btInspired.setOnClickListener(onMenuItemClicked)
tvMenuDiscoverColor.setOnClickListener(onMenuItemClicked)
btDiscoverColor.setOnClickListener(onMenuItemClicked)
tvMenuFavorites.setOnClickListener(onMenuItemClicked)
btFavorites.setOnClickListener(onMenuItemClicked)
tvMenuContactUs.setOnClickListener(onMenuItemClicked)
btContactUs.setOnClickListener(onMenuItemClicked)
tvMenuOurProducts.setOnClickListener(onMenuItemClicked)
tvMenuOurWork.setOnClickListener(onMenuItemClicked)
tvMenuLocateUs.setOnClickListener(onMenuItemClicked)
}
private fun setupMenuAnimation() {
rootContainer.afterMeasured {
val displayMetrics = resources.displayMetrics
val initialWidth = rootContainer.measuredWidth
val initialHeight = rootContainer.measuredHeight
val ratio = rootContainer.measuredWidth.toFloat() / initialHeight.toFloat()
val density = displayMetrics.scaledDensity
val endHeight = (initialHeight - 2 * MARGIN_Y * density)
val endWidth = (endHeight * ratio)
scaleX = endWidth / initialWidth
scaleY = endHeight / initialHeight
translateX = initialWidth - OFFSET * density - MARGIN_Y * density * ratio
isAnimationReady = true
}
}
private fun setupSlider() {
slides = listOf(
SlideVM(R.drawable.bg_home, R.color.colorButtonOption1, R.color.colorButtonOption2, R.color.colorButtonOption3),
SlideVM(R.drawable.bg_home, R.color.colorButtonOption2, R.color.colorButtonOption3, R.color.colorButtonOption1),
SlideVM(R.drawable.bg_home, R.color.colorButtonOption3, R.color.colorButtonOption1, R.color.colorButtonOption2)
)
vpSliderAdapter = VPSliderAdapter(slides, supportFragmentManager)
vpSlider.adapter = vpSliderAdapter
vpSlider.addOnPageChangeListener(onPageChangeListener)
vpSlider.offscreenPageLimit = 2
vpSlider.setScrollDurationFactor(SLIDE_SWIPE_FACTOR)
showSliderIndicators(slides.size)
}
private fun goToNextSlide() {
var nextItem = 0
if (vpSlider.currentItem + 1 < vpSliderAdapter.count) {
nextItem = vpSlider.currentItem + 1
}
vpSlider.post {
vpSlider.setCurrentItem(nextItem, true)
}
}
private fun handleMenuAnimation() {
if (!isAnimationReady) return
if (isMenuOpen) {
closeMenuAnimation()
} else {
openMenuAnimation()
}
}
private fun openMenuAnimation() {
homeContainer.animate()
.translationX(translateX)
.scaleX(scaleX)
.scaleY(scaleY)
.setInterpolator(BounceInterpolator())
.withEndAction({
isMenuOpen = true
clButtonsContainer.isClickable = true
})
.setDuration(DURATION)
.start()
}
private fun closeMenuAnimation() {
homeContainer.animate()
.translationX(0f)
.scaleX(1f)
.scaleY(1f)
.setInterpolator(BounceInterpolator())
.withEndAction({
isMenuOpen = false
clButtonsContainer.isClickable = false
})
.setDuration(DURATION)
.start()
}
private fun showSliderIndicators(size: Int) {
for(i in 1..size) {
val ivIndicator = ImageView(this)
ivIndicator.setImageDrawable(getDrawableCompat(R.drawable.selector_pager_indicator))
ivIndicator.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
ivIndicator.setPadding(3, 0, 3, 0)
llSliderIndicators.addView(ivIndicator)
}
llSliderIndicators.getChildAt(0).isSelected = true
}
private fun setSliderIndicator(pos: Int) {
val n = slides.size-1
for (i in 0..n) {
llSliderIndicators.getChildAt(i).isSelected = false
}
llSliderIndicators.getChildAt(pos).isSelected = true
}
private fun changeButtonsColor(pos: Int) {
val slideVM = slides[pos]
val drawableDiscover = btDiscoverColor.background as GradientDrawable
drawableDiscover.setColor(getColorCompat(slideVM.colorOption1))
val drawableFavorites = btFavorites.background as GradientDrawable
drawableFavorites.setColor(getColorCompat(slideVM.colorOption2))
val drawableContactUse = btContactUs.background as GradientDrawable
drawableContactUse.setColor(getColorCompat(slideVM.colorOption3))
}
private fun selectOptionMenu(view: View) {
tvMenuInspired.alpha = 0.3f
tvMenuDiscoverColor.alpha = 0.3f
tvMenuFavorites.alpha = 0.3f
tvMenuContactUs.alpha = 0.3f
tvMenuOurProducts.alpha = 0.3f
tvMenuOurWork.alpha = 0.3f
tvMenuLocateUs.alpha = 0.3f
view.alpha = 1.0f
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment