Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class FlyingBackgroundView(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
- companion object {
- private const val SMOOTH_ANIMATION_DURATION = 10000L
- private const val SCREEN_WIDTH_FACTOR = 3
- private const val SCREEN_HEIGHT_FACTOR = 3
- private const val ICON_SIZE_DP = 60
- }
- private val iconSubstrateColor = Color.parseColor("#eeeeee")
- private val columnContainer: LinearLayout
- private val icons = ArrayList<ImageView>()
- init {
- val iconSize = dpToPx(ICON_SIZE_DP)
- val iconSubstrateSize = iconSize * 1.5f
- val itemSize = iconSubstrateSize * 1.3f
- val screenMetrics = createDisplayMetrics(context as Activity)
- val screenWidth = screenMetrics.widthPixels
- val screenHeight = screenMetrics.heightPixels
- var columnCount = (screenWidth / itemSize).toInt() * SCREEN_WIDTH_FACTOR
- val itemCount = (screenHeight / itemSize).toInt() * SCREEN_HEIGHT_FACTOR
- if (columnCount.isEven()) columnCount++
- val canvasWidth = columnCount * itemSize.toInt()
- val canvasHeight = itemCount * itemSize.toInt()
- columnContainer = LinearLayout(context)
- columnContainer.layoutParams = LinearLayout.LayoutParams(canvasWidth, canvasHeight)
- columnContainer.clipChildren = false
- for (column in 0 until columnCount) {
- val columnLayout = LinearLayout(context)
- columnLayout.layoutParams = LinearLayout.LayoutParams(itemSize.toInt(),
- ViewGroup.LayoutParams.MATCH_PARENT)
- columnLayout.clipChildren = false
- columnLayout.orientation = VERTICAL
- columnLayout.gravity = Gravity.CENTER
- val countOfItems = if (column.isEven()) itemCount else itemCount - 1
- for (item in 0 until countOfItems) {
- val itemLayout = LinearLayout(context)
- itemLayout.layoutParams = LinearLayout.LayoutParams(itemSize.toInt(), itemSize.toInt())
- itemLayout.gravity = Gravity.CENTER
- val substrateLayout = LinearLayout(context)
- substrateLayout.layoutParams = LinearLayout.LayoutParams(iconSubstrateSize.toInt(),
- iconSubstrateSize.toInt())
- substrateLayout.gravity = Gravity.CENTER
- val circleBackground = GradientDrawable()
- circleBackground.shape = GradientDrawable.OVAL
- circleBackground.setColor(iconSubstrateColor)
- substrateLayout.placeBackgroundDrawable(circleBackground)
- val iconView = ImageView(context)
- iconView.layoutParams = LinearLayout.LayoutParams(iconSize, iconSize)
- icons.add(iconView)
- substrateLayout.addView(iconView)
- itemLayout.addView(substrateLayout)
- columnLayout.addView(itemLayout)
- }
- columnContainer.addView(columnLayout)
- }
- val centerX = canvasWidth / SCREEN_WIDTH_FACTOR
- val centerY = canvasHeight / SCREEN_HEIGHT_FACTOR
- columnContainer.x = -centerX.toFloat()
- columnContainer.y = -centerY.toFloat()
- addView(columnContainer)
- (object : Runnable {
- override fun run() {
- val maxX = canvasWidth / SCREEN_WIDTH_FACTOR * (SCREEN_WIDTH_FACTOR - 1)
- val maxY = canvasHeight / SCREEN_HEIGHT_FACTOR * (SCREEN_HEIGHT_FACTOR - 1)
- val randomX = Random().nextInt(maxX)
- val randomY = Random().nextInt(maxY)
- ViewCompat.animate(columnContainer)
- .x(-randomX.toFloat())
- .y(-randomY.toFloat())
- .setDuration(SMOOTH_ANIMATION_DURATION)
- .withEndAction(this)
- .start()
- }
- }).run()
- }
- fun setIcon(@DrawableRes iconResId: Int) {
- icons.forEach { icon ->
- ViewCompat.animate(icon)
- .scaleX(0f)
- .scaleY(0f)
- .alpha(0f)
- .setDuration(1000).withEndAction {
- icon.setImageResource(iconResId)
- ViewCompat.animate(icon)
- .scaleX(1f)
- .scaleY(1f)
- .alpha(1f)
- .setDuration(1000)
- .start()
- }.start()
- }
- }
Add Comment
Please, Sign In to add comment