android ui components

https://www.altova.com/manual/MobileTogether/mobiletogetherdesigner/mtdobjsfeatures_sizes.html

1.业务样式:

 enum class CardViewItemMediaStyleType(val radio: Float) {
        Square(1f),
        Rectangle(1.7f),
    }

2.业务数据

class CardViewItemMediaData(
        eventId: String,
        var dataType: CardViewItemMediaDataType,
)

enum class CardViewItemMediaDataType(var durationMargin: Margin) {
        NONE(Margin.MarginDefault),
        VIDEO(Margin.MarginDefault),
        MUSIC(Margin.MarginDefault),
        MORE(Margin.MarginDefault),
)

3.边距调整

  class Margin(var left: Int, var top: Int, var right: Int, var bottom: Int) {
        companion object Margin {
            val MarginDefault = Margin(0, 0, 8, 8)
            val MarginWaterfall = Margin(0, 0, 4, 4)
        }
    }

4.提供能力

5.事件通知

    enum class CardViewItemMediaElement {
        ROOT, COVER, VIEWS, SIZE, TIME, TITLE, AUTHOR_ICON, AUTHOR_NAME, ACTION_DOWN, ACTION_MORE
    }

demo-XML

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        tools:context="me.vd.app.MainActivity">

        <Button
            android:id="@+id/demo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="demo" />

        <me.vd.lib.ui.widget.cardview.view.CardViewGroupTitle
            android:id="@+id/groupTitle1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.CardViewGroupTitle
            android:id="@+id/groupTitle2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#30000000" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemArrow
            android:id="@+id/arrowItem"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <me.vd.lib.ui.widget.text.TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="中文字体"
                android:textSize="20dp" />

            <me.vd.lib.ui.widget.text.TextViewMedium
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="中文字体"
                android:textSize="20dp" />

            <me.vd.lib.ui.widget.text.TextViewBold
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="中文字体"
                android:textSize="20dp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <me.vd.lib.ui.widget.button.ToggleButton
                android:id="@+id/toggleButton1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <me.vd.lib.ui.widget.button.ToggleButton
                android:id="@+id/toggleButton2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMusic
            android:id="@+id/cardViewMusic"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/border_color" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemDown
            android:id="@+id/cardViewDownload"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardMediaViewPager
            android:id="@+id/cardMediaViewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardSetsViewPager
            android:id="@+id/cardSetsViewPager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="16dp"
            android:paddingRight="16dp">

            <me.vd.lib.ui.widget.cardview.view.CardViewGroupTitle
                android:id="@+id/cardImageViewPagerTitle"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp" />

            <me.vd.lib.ui.widget.cardview.view.viewpager.CardImageViewPager
                android:id="@+id/cardImageViewPager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:layout_marginBottom="30dp" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <me.vd.lib.ui.widget.cardview.view.components.CardViewItemSets
                    android:id="@+id/cardViewSets1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1" />

                <me.vd.lib.ui.widget.cardview.view.components.CardViewItemSets
                    android:id="@+id/cardViewSets2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1" />

            </LinearLayout>

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemSetsHorizontal
                android:id="@+id/cardViewSetsHorizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMediaHorizontal
            android:id="@+id/mediaCardHorizontal1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMediaHorizontal
            android:id="@+id/mediaCardHorizontal2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemImageRounder
            android:id="@+id/mediaCardLImageRounder"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemImage
            android:id="@+id/mediaCardLImage"
            android:layout_width="200dp"
            android:background="#000000"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemImage
                android:id="@+id/mediaCardLImage1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemImage
                android:id="@+id/mediaCardLImage2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemImage
                android:id="@+id/mediaCardLImage3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemImage
                android:id="@+id/mediaCardLImage4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
                android:id="@+id/mediaCardL1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="5dp"
                android:layout_weight="1" />

            <View
                android:layout_width="5dp"
                android:layout_height="1dp" />

            <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
                android:id="@+id/mediaCardL2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="5dp"
                android:layout_weight="1" />
        </LinearLayout>

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
            android:id="@+id/mediaCard"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#000000"
            app:CardViewImageMinHeight="88dp"
            app:CardViewImageMinWidth="156dp" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
            android:id="@+id/mediaCard1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
            android:id="@+id/mediaCard2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
            android:id="@+id/mediaCard3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemMedia
            android:id="@+id/mediaCard4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.components.CardViewItemHead
            android:id="@+id/userHead"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.CardViewGroup
            android:id="@+id/cardViewGroup1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.CardViewGroup
            android:id="@+id/cardViewGroup2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.CardViewGroup
            android:id="@+id/cardViewGroup3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <me.vd.lib.ui.widget.cardview.view.viewpager.CardViewPager
            android:id="@+id/cardViewPager7"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

</ScrollView>

Demo-Usage

package me.vd.app

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import me.vd.lib.ui.widget.button.ToggleButton
import me.vd.lib.ui.widget.cardview.view.CardViewGroup
import me.vd.lib.ui.widget.cardview.view.CardViewGroupTitle
import me.vd.lib.ui.widget.cardview.view.CardViewItem
import me.vd.lib.ui.widget.cardview.view.components.*
import me.vd.lib.ui.widget.cardview.view.CardViewPagerView
import me.vd.lib.ui.widget.cardview.view.viewpager.*

class MainActivity : AppCompatActivity() {

    private val IMAMGE1 =
        "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1000551505,2077899926&fm=26&gp=0.jpg"
    private val IMAMGE2 =
        "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2F3d3bbb5626df7c0a52b0e665eea40a45dde19b051b795-9m8Sul_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621504511&t=02349c7e63dbc0ef576b20aefd93ff1e"
    private val IMAMGE3 =
        "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fmedia-cdn.tripadvisor.com%2Fmedia%2Fphoto-s%2F07%2F96%2Faf%2F8a%2Ftup-island.jpg&refer=http%3A%2F%2Fmedia-cdn.tripadvisor.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1621504511&t=e936958cad376c1542d7ada058cbc7c2"
    private val IMAMGE4 =
        "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=4015235454,569502415&fm=26&gp=0.jpg"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<View>(R.id.demo).setOnClickListener {
            startActivity(Intent(this,
                DemoActivity::class.java))
        }

        buttons()
        titles()

        cardViewSets()
        cardViewDown()

        imageCard()
        musicCard()

        imageCardViewPager()
        mediaCardViewPager()
        cardSetsViewPager()

        mediaCardHorizontal()

        mediaCard()

        userHead()
        cardViewGroupStyle()

        viewPagerItems()
    }

    private fun buttons() {
        val toggleButtonClicker = object : ToggleButton.ToggleButtonClicker {
            override fun onClick(toggleOn: Boolean) {
                Toast.makeText(this@MainActivity, "toggleOn:" + toggleOn, Toast.LENGTH_SHORT).show()
            }
        }

        val toggleButton1 = findViewById<ToggleButton>(R.id.toggleButton1)
        toggleButton1.setStyle(ToggleButton.ToggleButtonStyle.SUBSCRIBER)
            .setClick(toggleButtonClicker)
        toggleButton1.setToggle(true)

        val toggleButton2 = findViewById<ToggleButton>(R.id.toggleButton2)
        toggleButton2.setStyle(ToggleButton.ToggleButtonStyle.SUBSCRIBER_IMMEDIATE)
            .setClick(toggleButtonClicker)
        toggleButton2.setToggle(true)

        val arrowItem = findViewById<CardViewItemArrow>(R.id.arrowItem)
        arrowItem.setData(CardViewItemArrow.CardViewItemArrowData("xxxx",R.drawable.lib_widget_icon_video_icon,"xxx","xxxx"),clicker)
        arrowItem.setData(CardViewItemArrow.CardViewItemArrowData("xxxx",IMAMGE1,"xxx","xxxx"),clicker)
    }

    private fun titles() {
        val groupTitle1 = findViewById<CardViewGroupTitle>(R.id.groupTitle1)
        groupTitle1.setData(CardViewGroupTitle.CardViewGroupTitleData("111",
            "Title",
            arrowVisible = true,
            darkStyle = false), clicker)

        val groupTitle2 = findViewById<CardViewGroupTitle>(R.id.groupTitle2)
        groupTitle2.setData(CardViewGroupTitle.CardViewGroupTitleData("111",
            "Title",
            arrowVisible = true,
            darkStyle = true), clicker)
    }

    private fun userHead() {
        val userHead = findViewById<CardViewItemHead>(R.id.userHead)
        userHead.setData(CardViewItemHead.CardViewItemHeadData("eventId1",
            IMAMGE1,
            "Bird",
            "bird@mail.com"), clicker)

        userHead.setStyle(CardViewItemHead.CardViewItemHeadStyle.NO_LOGIN)
    }

    private fun cardViewSets() {
        val cardViewSetsdata1 = CardViewItemSets.CardViewItemSetsData(
            "1",
            "53", IMAMGE1,
            "2021 New Years")

        val cardViewSetsdata2 = CardViewItemSets.CardViewItemSetsData(
            "1",
            "55", IMAMGE1, "Title", "Author")

        val cardViewSets1 = findViewById<CardViewItemSets>(R.id.cardViewSets1)
        cardViewSets1.setSizeStyle(CardViewItemSets.CardViewItemSetsStyle.Rectangle)
            .setData(cardViewSetsdata1, clicker)

        val cardViewSets2 = findViewById<CardViewItemSets>(R.id.cardViewSets2)
        cardViewSets2.setSizeStyle(CardViewItemSets.CardViewItemSetsStyle.Rectangle)
            .setData(cardViewSetsdata1, clicker)

        val cardViewSetsHorizontal =
            findViewById<CardViewItemSetsHorizontal>(R.id.cardViewSetsHorizontal)
        cardViewSetsHorizontal
            .setSizeStyle(CardViewItemSetsHorizontal.CardViewItemSetsHorizontalStyle.Rectangle)
            .setData(cardViewSetsdata2, clicker)
    }

    private fun cardViewDown() {
        val mediaCardDown = findViewById<CardViewItemDown>(R.id.cardViewDownload)
        mediaCardDown.setData(CardViewItemDown.CardViewItemDownData(
            "1",
            IMAMGE1,
            "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
            "03:18",
            "200.20MB"), clicker)

        mediaCardDown.downloading(20, "152KB/s", "165.0MB")
        mediaCardDown.downloaded()
    }

    private fun musicCard() {
        val cardViewMusicData = CardViewItemMusic.CardViewItemMusicData("111",
            true,
            IMAMGE1,
            "Escape from Pretoria(2020)",
            "The hottest songs this week,served up fresh every friday",
            "49 Musics"
        )
        val cardViewMusic = findViewById<CardViewItemMusic>(R.id.cardViewMusic)
        cardViewMusic.setData(cardViewMusicData, clicker)
        //cardViewMusic.setImageSize(170,170).setData(cardViewMusicData, clicker)
    }

    private fun mediaCardHorizontal() {
        val mediaCard1 = findViewById<CardViewItemMediaHorizontal>(R.id.mediaCardHorizontal1)
        mediaCard1.setSizeStyle(CardViewItemMediaHorizontal.CardViewItemMediaStyleType.Rectangle)
            .setData(CardViewItemMediaHorizontal.CardViewItemMediaData(
                "1",
                CardViewItemMediaHorizontal.CardViewItemMediaDataType.DISPLAY,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                R.drawable.ic_launcher_background,
                "1W",
                "12:12",
                "250MB",
                "1 days ago",false, false), clicker)

        val mediaCard2 = findViewById<CardViewItemMediaHorizontal>(R.id.mediaCardHorizontal2)
        mediaCard2.setSizeStyle(CardViewItemMediaHorizontal.CardViewItemMediaStyleType.RectangleMore)
            .setData(CardViewItemMediaHorizontal.CardViewItemMediaData(
                "1",
                CardViewItemMediaHorizontal.CardViewItemMediaDataType.ACTION_MORE,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "12:12",
                "250MB",
                "1 days ago", false, true), clicker)
    }

    private fun imageCard() {
        val cardViewItemImageRounderData = CardViewItemImageRounder.CardViewItemImageRounderData(
            "111", IMAMGE1, "Escape from Pretoria(2020)")

        val cardViewItemImageRounderDataMore = CardViewItemImageRounder.CardViewItemImageRounderData(
            "111", R.drawable.lib_widget_icon_card_view_download, "xx")

        val mediaCardLImageRounder = findViewById<CardViewItemImageRounder>(R.id.mediaCardLImageRounder)
        //mediaCardLImageRounder.setData(cardViewItemImageRounderData, clicker)
        mediaCardLImageRounder.setImageSize(48).setTextSize(70).setData(cardViewItemImageRounderDataMore, clicker)

//        val cardImageData = CardViewItemImage.CardViewItemImageData("111",
//            IMAMGE1,
//            "Escape from Pretoria(2020)","03:18")

        val cardImageData = CardViewItemImage.CardViewItemImageData("111",
            R.drawable.lib_widget_icon_arrow,"03:18")

        val cardImageData1 = CardViewItemImage.CardViewItemImageData("111",
            IMAMGE1,
            "Escape from Pretoria(2020)",
            "7.9", CardViewItemImage.CardViewItemImageFlag.SCORE)

        val cardImageData2 = CardViewItemImage.CardViewItemImageData("111",
            IMAMGE1,
            "Escape from Pretoria(2020)",
            "7.9", CardViewItemImage.CardViewItemImageFlag.SCORE_IMDB)

        val cardImageData3 = CardViewItemImage.CardViewItemImageData("111",
            IMAMGE1,
            "Escape from Pretoria(2020)", CardViewItemImage.CardViewItemImageFlag.GAME
        )

        val cardImageData4 = CardViewItemImage.CardViewItemImageData("111",
            IMAMGE1,
            "Escape from Pretoria(2020)", CardViewItemImage.CardViewItemImageFlag.MUSIC
        )

        val mediaCardLImage= findViewById<CardViewItemImage>(R.id.mediaCardLImage)
        mediaCardLImage.setSizeStyle(CardViewItemImage.CardViewItemImageStyleType.Rectangle)
            .setData(cardImageData, clicker)

        val mediaCardLImage1 = findViewById<CardViewItemImage>(R.id.mediaCardLImage1)
        mediaCardLImage1.setSizeStyle(CardViewItemImage.CardViewItemImageStyleType.RectangleVertical)
            .setData(cardImageData1, clicker)

        val mediaCardLImage2 = findViewById<CardViewItemImage>(R.id.mediaCardLImage2)
        mediaCardLImage2.setSizeStyle(CardViewItemImage.CardViewItemImageStyleType.RectangleVertical)
            .setData(cardImageData2, clicker)

        val mediaCardLImage3 = findViewById<CardViewItemImage>(R.id.mediaCardLImage3)
        mediaCardLImage3.setSizeStyle(CardViewItemImage.CardViewItemImageStyleType.RectangleVertical)
            .setData(cardImageData3, clicker)

        val mediaCardLImage4 = findViewById<CardViewItemImage>(R.id.mediaCardLImage4)
        mediaCardLImage4.setSizeStyle(CardViewItemImage.CardViewItemImageStyleType.RectangleVertical)
            .setData(cardImageData4, clicker)
    }

    private fun imageCardViewPager() {
        val imageDataTitle = findViewById<CardViewGroupTitle>(R.id.cardImageViewPagerTitle)
        imageDataTitle.setData(CardViewGroupTitle.CardViewGroupTitleData("111",
            "Get Your Heart Racing",
            arrowVisible = true,
            darkStyle = false), clicker)

        val imageData = CardViewItemImage.CardViewItemImageData("",
            IMAMGE1,
            "Bad Boys for Life(2020)",
            CardViewItemImage.CardViewItemImageFlag.GAME)

        val cardImageViewPager = findViewById<CardImageViewPager>(R.id.cardImageViewPager)
        cardImageViewPager.setStyle(CardWrapperViewPager.CardViewPagerStyle.ThreeCard)
            .setItems(arrayOf(imageData, imageData, imageData, imageData, imageData), clicker)
    }

    private fun mediaCardViewPager() {
        val mediaData = CardViewItemMedia.CardViewItemMediaData(
            "1",
            CardViewItemMedia.CardViewItemMediaDataType.MUSIC,
            "music-UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
            IMAMGE1,
            "Artmoeba Productions",
            IMAMGE1,
            "1W",
            "Tracks",
            "", "", false)

        val cardMediaViewPager = findViewById<CardMediaViewPager>(R.id.cardMediaViewPager)
        cardMediaViewPager.setStyle(CardWrapperViewPager.CardViewPagerStyle.ThreeCardSquare)
            .setItems(arrayOf(mediaData, mediaData, mediaData, mediaData, mediaData), clicker)
    }

    private fun cardSetsViewPager() {
        val cardViewSetsdata = CardViewItemSets.CardViewItemSetsData(
            "1",
            "53", IMAMGE1,
            "2021 New Years")

        val cardSetsViewPager = findViewById<CardSetsViewPager>(R.id.cardSetsViewPager)
        cardSetsViewPager.setStyle(CardWrapperViewPager.CardViewPagerStyle.ThreeCardSquare)
            .setItems(arrayOf(cardViewSetsdata, cardViewSetsdata, cardViewSetsdata, cardViewSetsdata, cardViewSetsdata), clicker)
    }

    private fun mediaCard() {
        val mediaCardL1 = findViewById<CardViewItemMedia>(R.id.mediaCardL1)
        mediaCardL1.setSizeStyle(CardViewItemMedia.CardViewItemMediaStyleType.Square).setTitleSize(14f)
            .setData(CardViewItemMedia.CardViewItemMediaData(
                "1",
                CardViewItemMedia.CardViewItemMediaDataType.MUSIC,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "Tracks",
                "250MB", "", isLive = true, isFullMovie = false), clicker)

        val mediaCardL2 = findViewById<CardViewItemMedia>(R.id.mediaCardL2)
        mediaCardL2.setSizeStyle(CardViewItemMedia.CardViewItemMediaStyleType.Rectangle)
            .setData(CardViewItemMedia.CardViewItemMediaData(
                "1",
                CardViewItemMedia.CardViewItemMediaDataType.MORE,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "12:12",
                "250MB", "", isLive = false, isFullMovie = true), clicker)

        val mediaCard = findViewById<CardViewItemMedia>(R.id.mediaCard)
        mediaCard.setSizeRadio(1f).setData(CardViewItemMedia.CardViewItemMediaData(
            "1",
            CardViewItemMedia.CardViewItemMediaDataType.ONLY_DURATION,
            "1.9f-UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
            IMAMGE1,
            "Artmoeba Productions",
            IMAMGE1,
            "1W",
            "12:12",
            "250MB"), clicker)

        val mediaCard1 = findViewById<CardViewItemMedia>(R.id.mediaCard1)
        mediaCard1.setSizeStyle(CardViewItemMedia.CardViewItemMediaStyleType.Square)
            .setData(CardViewItemMedia.CardViewItemMediaData(
                "1",
                CardViewItemMedia.CardViewItemMediaDataType.VIDEO,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "12:12",
                "250MB"), clicker)

        val mediaCard2 = findViewById<CardViewItemMedia>(R.id.mediaCard2)
        mediaCard2.setSizeStyle(CardViewItemMedia.CardViewItemMediaStyleType.Rectangle)
            .setData(CardViewItemMedia.CardViewItemMediaData(
                "1",
                CardViewItemMedia.CardViewItemMediaDataType.MORE,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "12:12",
                "250MB"), clicker)

        val mediaCard3 = findViewById<CardViewItemMedia>(R.id.mediaCard3)
        mediaCard3.setRootSize(280, 245)
            .setData(CardViewItemMedia.CardViewItemMediaData(
                "1",
                CardViewItemMedia.CardViewItemMediaDataType.VIDEO,
                "CardViewItemMedia--UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "12:12",
                "250MB"), clicker)

        val mediaCard4 = findViewById<CardViewItemMedia>(R.id.mediaCard4)
        mediaCard4.setRootSize(270, 245)
            .setData(CardViewItemMedia.CardViewItemMediaData(
                "1",
                CardViewItemMedia.CardViewItemMediaDataType.VIDEO,
                "UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBRELLA | Award-Winning and Oscar®-Qualified CGI Animated…UMBREL",
                IMAMGE1,
                "Artmoeba Productions",
                IMAMGE1,
                "1W",
                "12:12",
                "250MB"), clicker)
    }

    private fun cardViewGroupStyle() {
        val cardViewGroup1 = findViewById<CardViewGroup>(R.id.cardViewGroup1)
        val historyItems = arrayOf(
            CardViewPager.CardViewPagerData("g_1",
                IMAMGE1,
                "Women’s History "),
            CardViewPager.CardViewPagerData("g_2",
                IMAMGE2,
                "Women’s History "),
            CardViewPager.CardViewPagerData("g_3",
                IMAMGE3,
                "Women’s History "))

        cardViewGroup1.setTitle("My record").setItems(
            arrayOf(CardViewItemArrow.CardViewItemArrowData(
                "Record_1",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_history,
                "History"
            ), CardViewPagerView.CardViewPagerViewData(
                "Record_2",
                CardViewPager.CardViewPagerStyle.MeCenter,
                historyItems
            ), CardViewItemArrow.CardViewItemArrowData(
                "Record_3",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_flowing,
                "Following"
            ), CardViewItemArrow.CardViewItemArrowData(
                "Record_4",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_likevideo,
                "Liked Videos"
            ), CardViewItemArrow.CardViewItemArrowData(
                "Record_5",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_watchlist,
                "Watchlist"
            )), clicker)

        val cardViewGroup2 = findViewById<CardViewGroup>(R.id.cardViewGroup2)
        cardViewGroup2.setTitle("Setting").setItems(
            arrayOf(CardViewItemArrow.CardViewItemArrowData(
                "Setting_1",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_language,
                "Language"
            ), CardViewItemArrow.CardViewItemArrowData(
                "Setting_2",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_versions,
                "Version", "1.5.0"
            ), CardViewItemArrow.CardViewItemArrowData(
                "Setting_3",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_clearcache,
                "Clear the Cache", "250MB"
            ), CardViewItemToggle.CardViewItemToggleData(
                "Setting_4",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_notifycation,
                "Notify the Switch", "",
                false
            )), clicker)

        val cardViewGroup3 = findViewById<CardViewGroup>(R.id.cardViewGroup3)
        cardViewGroup3.setTitle("Follow Us").setItems(
            arrayOf(CardViewItemArrow.CardViewItemArrowData(
                "Follow_1",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_fl_facebook,
                "Follow us on Facebook", ""
            ), CardViewItemArrow.CardViewItemArrowData(
                "Follow_2",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_fl_youtube,
                "Follow us on Youtube", ""
            ), CardViewItemArrow.CardViewItemArrowData(
                "Follow_3",
                me.vd.lib.ui.widget.R.drawable.lib_widget_icon_me_settings_fl_tlegram,
                "Join our telegram channel", ""
            )), clicker)
    }

    private val clicker = object : CardViewItem.CardViewItemClicker {
        override fun onClick(
            eventId: String?,
            data: CardViewItem.CardViewItemData?,
            element: Any?
        ) {
            when (element) {
                is CardViewItemMusic.CardViewItemImageElement -> {
                    Toast.makeText(this@MainActivity, "element:${element.name}", Toast.LENGTH_SHORT)
                        .show()
                    Log.d("MainActivityCk-EL-1:", "element: ${element.name}")
                }
                is CardViewItemMedia.CardViewItemMediaElement -> {
                    Toast.makeText(this@MainActivity, "element:${element.name}", Toast.LENGTH_SHORT)
                        .show()
                    Log.d("MainActivityCk-EL-1:", "element: ${element.name}")
                }
                is CardViewItemHead.CardViewItemHeadElement -> {
                    Toast.makeText(this@MainActivity, "element:${element.name}", Toast.LENGTH_SHORT)
                        .show()
                    Log.d("MainActivityCk-EL-2:", "element: ${element.name}")
                }
                is CardViewItemToggle.CardViewItemToggleElement -> {
                    Toast.makeText(this@MainActivity, "element:${element.name}", Toast.LENGTH_SHORT)
                        .show()
                    Log.d("MainActivityCk-EL-3:", "element: ${element.name}")
                }
                else -> {
                    Toast.makeText(this@MainActivity, "eventId:${eventId}", Toast.LENGTH_SHORT)
                        .show()
                    Log.d("MainActivityCk-Click:", "eventId: $eventId \ndata:$data")
                }
            }
        }
    }

    private fun viewPagerItems() {
        val viewPager1 = findViewById<CardViewPager>(R.id.cardViewPager1)
        viewPager1.setStyle(CardViewPager.CardViewPagerStyle.HomeBanner)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3,
                    "Women’s History ")), clicker)

        val viewPager2 = findViewById<CardViewPager>(R.id.cardViewPager2)
        viewPager2.setStyle(CardViewPager.CardViewPagerStyle.MovieBanner)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3,
                    "Women’s History ")), clicker)

        val viewPager3 = findViewById<CardViewPager>(R.id.cardViewPager3)
        viewPager3.setStyle(CardViewPager.CardViewPagerStyle.SingleCard)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3,
                    "Women’s History ")), clicker)

        val viewPager4 = findViewById<CardViewPager>(R.id.cardViewPager4)
        viewPager4.setStyle(CardViewPager.CardViewPagerStyle.ThreeCardSquare)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3,
                    "Women’s History ")), clicker)

        val viewPager5 = findViewById<CardViewPager>(R.id.cardViewPager5)
        viewPager5.setStyle(CardViewPager.CardViewPagerStyle.ThreeCardRectangle)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3,
                    "Women’s History ")), clicker)

        val viewPager6 = findViewById<CardViewPager>(R.id.cardViewPager6)
        viewPager6.setStyle(CardViewPager.CardViewPagerStyle.FourCard)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3,
                    "Women’s History "),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE4,
                    "Women’s History ")), clicker)

        val viewPager7 = findViewById<CardViewPager>(R.id.cardViewPager7)
        viewPager7.setStyle(CardViewPager.CardViewPagerStyle.UserHeads)
            .setItems(arrayOf(
                CardViewPager.CardViewPagerData("1",
                    IMAMGE1,
                    "name"),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE2),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE3),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE4,
                    "name"),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE4,
                    "name"),
                CardViewPager.CardViewPagerData("1",
                    IMAMGE4)),
                clicker)
    }
}

Clicker(Element-Command):

 enum class CardViewItemMediaElement {
        ROOT, COVER, VIEWS, SIZE, TIME, 
        TITLE, AUTHOR_ICON, AUTHOR_NAME,
        ACTION_DOWN, ACTION_MORE
    }
 views?.setOnClickListener { 
  eventClicker?.onClick(eventId, eventData, CardViewItemMediaElement.VIEWS) }
  cover?.setOnClickListener { callClicker(CardViewItemMediaElement.COVER) }

View:CardImageViewPager

class CardImageViewPager(context: Context?, array: AttributeSet?) :
    CardWrapperViewPager(context, array) {

    override fun instanceView(
        container: ViewGroup,
        position: Int,
        data: CardViewItem.CardViewItemData,
        styleType: CardViewPagerStyle?,
        clicker: CardViewItem.CardViewItemClicker?
    ): View {
        val view =
            View.inflate(container.context, R.layout.lib_widget_rv_card_view_image_view_pager, null)
        val imageCard = view.findViewById<CardViewItemImage>(R.id.imageCard)
        imageCard.setSizeStyle(convertType(styleType)).setData(data, clicker)
        return view
    }

    private fun convertType(styleType: CardViewPagerStyle?): CardViewItemImage.CardViewItemImageStyleType {
        return when (styleType) {
            null -> {
                CardViewItemImage.CardViewItemImageStyleType.RectangleVertical
            }
            CardViewPagerStyle.FourCardDarkMode -> {
                CardViewItemImage.CardViewItemImageStyleType.RectangleVerticalDarkMode
            }
            CardViewPagerStyle.FourCard -> {
                CardViewItemImage.CardViewItemImageStyleType.RectangleVertical
            }
            CardViewPagerStyle.ThreeCard -> {
                CardViewItemImage.CardViewItemImageStyleType.RectangleVertical
            }
            else -> CardViewItemImage.CardViewItemImageStyleType.RectangleVertical
        }
    }
}

View: CardWrapperViewPager





open class CardWrapperViewPager(context: Context?, array: AttributeSet?) :
    LinearLayout(context, array) {

    enum class CardViewPagerStyle(
        var viewMargin: Int,
        var viewRadio: Float,
        var itemCount: Float,
        var animationScale: Float,
        var round: Boolean = false,
        var indicatorEnable: Boolean = false
    ) {
        HomeBanner(-1, 1.77f, 1f, 0.8f),
        MovieBanner(-1, 1.77f, 1f, 1f),
        ThreeCard(8, 0.7f, 2.5f, 1f),
        ThreeCardSquare(8, 1f, 2.5f, 1f),
        FourCard(8, 0.7f, 3.5f, 1f),
        FourCardDarkMode(8, 0.7f, 3.5f, 1f),
    }

    private var mRootView: LinearLayout? = null
    private var mViewPager: ViewPager? = null
    private var springDotsIndicator: DotsIndicator? = null
    private var mItemViewPagerData: Array<out CardViewItem.CardViewItemData>? = null
    private var mItemViewStyleType: CardViewPagerStyle? = null

    private var mViewWidth: Int = LayoutParams.MATCH_PARENT
    private var mViewGravity: Int = Gravity.CENTER
    private var mViewRadio: Float = 1f
    private var mViewCount: Float = 1f
    private var mViewRound: Boolean = false

    private var mItemEdge: Int = 0
    private var mItemMargin: Int = 0
    private var mItemScale: Float = 0.8f
    private var indicatorEnable: Boolean = false

    init {
        LinearLayout.inflate(context, R.layout.lib_widget_card_view_pager, this)
        mRootView = findViewById(R.id.lib_widget_viewPager_root)
        mViewPager = findViewById(R.id.lib_widget_viewPager)
        springDotsIndicator = findViewById(R.id.lib_widget_viewPager_indicator)
    }

    fun setStyle(pagerStyle: CardViewPagerStyle): CardWrapperViewPager {
        this.mItemViewStyleType = pagerStyle
        when (pagerStyle) {
            CardViewPagerStyle.HomeBanner -> {
                mViewWidth = ScreenUtils.getScreenWidth(context) - dpx(26 * 2)
                mViewGravity = Gravity.CENTER
                mItemMargin = -dpx((26 + 12) * 2)
                indicatorEnable = false
            }
            CardViewPagerStyle.MovieBanner -> {
                mViewWidth = ScreenUtils.getScreenWidth(context) - dpx(26 * 2)
                mViewGravity = Gravity.LEFT
                mItemMargin = -dpx((26) * 2)
                indicatorEnable = true
            }
            else -> {
                mViewWidth = LinearLayout.LayoutParams.MATCH_PARENT
                mViewGravity = Gravity.CENTER
                mItemMargin = dpx(pagerStyle.viewMargin)
                indicatorEnable = false
            }
        }
        mViewRadio = pagerStyle.viewRadio
        mViewCount = pagerStyle.itemCount
        mViewRound = pagerStyle.round
        mItemScale = pagerStyle.animationScale
        return this
    }

    fun setItems(
        itemPagers: Array<out CardViewItem.CardViewItemData>?,
        clicker: CardViewItem.CardViewItemClicker? = null
    ) {
        mItemViewPagerData = itemPagers

        mViewPager!!.adapter = ViewPagerAdapter(mItemViewPagerData,
            mViewWidth,
            mViewGravity,
            mViewRadio,
            mViewCount,
            mItemViewStyleType,
            clicker)
        mViewPager!!.offscreenPageLimit = mItemViewPagerData?.size ?: 0
        mViewPager?.pageMargin = mItemMargin

        if (!mItemScale.equals(0f) && !mItemScale.equals(1f)) {
            mViewPager!!.setPageTransformer(true, ZoomOutPageTransformer(mItemScale, 1f))
        }

        if (indicatorEnable) {
            springDotsIndicator?.visibility = View.VISIBLE
            springDotsIndicator?.setViewPager(mViewPager!!)
        } else {
            springDotsIndicator?.visibility = View.GONE
        }
    }

    inner class ViewPagerAdapter(
        data: Array<out CardViewItem.CardViewItemData>?,
        var width: Int,
        var cardGravity: Int,
        var cardRadio: Float,
        var cardCount: Float,
        var styleType: CardViewPagerStyle?,
        var clicker: CardViewItem.CardViewItemClicker?
    ) :
        PagerAdapter() {
        private val mData: Array<out CardViewItem.CardViewItemData> =
            data ?: arrayOf()

        override fun getCount(): Int {
            return mData.size
        }

        override fun getPageWidth(position: Int): Float {
            return super.getPageWidth(position) / cardCount
        }

        override fun instantiateItem(container: ViewGroup, position: Int): Any {
            val view = instanceView(container, position, mData[position], styleType, clicker)
            container.addView(view)
            return view
        }

        override fun isViewFromObject(view: View, `object`: Any): Boolean {
            return view === `object`
        }

        override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
            container.removeView(`object` as View)
        }
    }

    protected open fun instanceView(
        container: ViewGroup,
        position: Int,
        data: CardViewItem.CardViewItemData,
        styleType: CardViewPagerStyle?,
        clicker: CardViewItem.CardViewItemClicker?
    ): View {
        return inflate(container.context, R.layout.lib_widget_rv_card_view_wrapper_view_pager, null)
    }

    private fun dpx(dp: Int): Int {
        return ScreenUtils.dp2px(context, dp)
    }

    class ZoomOutPageTransformer(val min: Float, val max: Float) : PageTransformer {
        override fun transformPage(page: View, position: Float) {
            if (min == max) return
            if (position <= 1) {
                val scaleFactor = min + (1 - abs(position)) * (max - min)
                page.scaleX = scaleFactor
                if (position > 0) {
                    page.translationX = -scaleFactor * 2
                } else if (position < 0) {
                    page.translationX = scaleFactor * 2
                }
                page.scaleY = scaleFactor
            } else {
                page.scaleX = min
                page.scaleY = min
            }
        }
    }

    fun setEdgeGlowColor(viewPager: ViewPager?, color: Int) {
        try {
            val clazz: Class<*> = ViewPager::class.java
            for (name in arrayOf(
                "mLeftEdge", "mRightEdge"
            )) {
                val field: Field = clazz.getDeclaredField(name)
                field.isAccessible = true
                val edge: Any = field.get(viewPager) // android.support.v4.widget.EdgeEffectCompat
                val fEdgeEffect: Field = edge.javaClass.getDeclaredField("mEdgeEffect")
                fEdgeEffect.isAccessible = true
                setEdgeEffectColor(fEdgeEffect.get(edge) as EdgeEffect, color)
            }
        } catch (ignored: Exception) {
        }
    }

    fun setEdgeEffectColor(edgeEffect: EdgeEffect, color: Int) {
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                edgeEffect.color = color
                return
            }
            val edgeField: Field = EdgeEffect::class.java.getDeclaredField("mEdge")
            val glowField: Field = EdgeEffect::class.java.getDeclaredField("mGlow")
            edgeField.isAccessible = true
            glowField.isAccessible = true
            val mEdge = edgeField.get(edgeEffect) as Drawable
            val mGlow = glowField.get(edgeEffect) as Drawable
            mEdge.setColorFilter(color, PorterDuff.Mode.SRC_IN)
            mGlow.setColorFilter(color, PorterDuff.Mode.SRC_IN)
            mEdge.callback = null // free up any references
            mGlow.callback = null // free up any references
        } catch (ignored: Exception) {
        }
    }

View: CardViewItemMedia

后面如果动态样式过多,则抽象为delegate模式

class CardViewItemMedia(
    context: Context?,
    array: AttributeSet?
) :
    CardViewItem(context, array) {

    enum class CardViewItemMediaStyleType(val itemCount: Int) {
        HOME(1),
        ITEM(2)
    }

    class CardViewItemMediaData(
        eventId: String,
        var dataType: CardViewItemMediaDataType,
        var title: String,
        var authorHead: String?,
        var authorName: String?,
        var cover: String,
        var views: String? = "",
        var duration: String? = "",
        var size: String? = ""
    ) : CardViewItemData(eventId, "")

    enum class CardViewItemMediaDataType {
        NONE, VIDEO, MUSIC, MORE, WATERFALLS
    }

    enum class CardViewItemMediaElement {
        COVER, VIEWS, SIZE, TITLE, AUTHOR_ICON, AUTHOR_NAME, DOWNLOAD, ACTION_MORE
    }

    var root: View? = null
    var card: View? = null

    private var titles = mutableListOf<TextView?>()
    private var durations = mutableListOf<TextView?>()

    var cover: RoundedImageView? = null
    var iconType: ImageView? = null

    var authorIcon: ImageView? = null
    var authorName: TextView? = null

    var infoStyle1: View? = null
    var infoStyle2: View? = null
    var etxPanel1: View? = null
    var etxPanel2: View? = null

    var views: TextView? = null
    var fileSize: TextView? = null
    var download: ImageView? = null
    var moreIcon: View? = null

    init {
        inflate(context, R.layout.lib_widget_rv_card_view_media, this)
        root = findViewById(R.id.root)
        card = findViewById(R.id.card)

        cover = findViewById(R.id.cover)
        iconType = findViewById(R.id.iconType)
        authorIcon = findViewById(R.id.authorIcon)
        authorName = findViewById(R.id.authorName)
        views = findViewById(R.id.views)
        fileSize = findViewById(R.id.fileSize)
        download = findViewById(R.id.download)

        infoStyle1 = findViewById(R.id.infoStyle1)
        infoStyle2 = findViewById(R.id.infoStyle2)
        etxPanel1 = findViewById(R.id.etxPanel1)
        etxPanel2 = findViewById(R.id.etxPanel2)

        titles.add(etxPanel1?.findViewById(R.id.title))
        titles.add(etxPanel2?.findViewById(R.id.title))
        durations.add(infoStyle1?.findViewById(R.id.duration))
        durations.add(infoStyle2?.findViewById(R.id.duration))

        moreIcon = etxPanel2?.findViewById(R.id.moreIcon)
    }

    fun setStyle(
        style: CardViewItemMediaStyleType = CardViewItemMediaStyleType.HOME
    ): CardViewItemMedia {
        return when (style) {
            CardViewItemMediaStyleType.HOME -> {
                setSizeRadio(1.71f)
            }
            CardViewItemMediaStyleType.ITEM -> {
                setSizeRadio(1.71f)
            }
        }
    }

    fun setSizeRadio(
        radio: Float = 1f
    ): CardViewItemMedia {
        root?.layoutParams?.width = ViewGroup.LayoutParams.MATCH_PARENT
        card?.post {
            val cardWidth = card?.width ?: -1
            card?.layoutParams?.height = (cardWidth / radio).toInt()
            card?.requestLayout()
        }
        return this
    }

    fun setSize(
        cardWidth: Int = 0,
        cardHeight: Int = 0,
        dpi: Boolean = true
    ): CardViewItemMedia {
        root?.layoutParams?.width =
            if (cardWidth == ViewGroup.LayoutParams.WRAP_CONTENT
                || cardWidth == ViewGroup.LayoutParams.MATCH_PARENT
            )
                cardWidth else if (dpi) ScreenUtils.dp2px(context, cardWidth) else cardWidth
        card?.layoutParams?.height =
            if (cardHeight == ViewGroup.LayoutParams.WRAP_CONTENT
                || cardHeight == ViewGroup.LayoutParams.MATCH_PARENT
            )
                cardHeight else if (dpi) ScreenUtils.dp2px(context, cardHeight) else cardHeight
        return this
    }


    override fun <Data : CardViewItemData> setData(
        data: Data,
        clicker: CardViewItemClicker?
    ) {
        super.setData(data, clicker)
        val cardViewData = data as CardViewItemMediaData

        arrayText(titles, cardViewData.title, CardViewItemMediaElement.TITLE)

        GlideImageLoader().loadImage(context, cardViewData.cover, cover, null)
        cover?.setOnClickListener { callClicker(CardViewItemMediaElement.COVER) }

        infoStyle1?.setOnClickListener { callClicker(CardViewItemMediaElement.VIEWS) }
        infoStyle2?.setOnClickListener { callClicker(CardViewItemMediaElement.VIEWS) }

        when (cardViewData.dataType) {
            CardViewItemMediaDataType.NONE -> {
                iconType?.setImageResource(R.drawable.lib_widget_icon_music_icon)
                infoStyle1?.visibility = View.GONE
                etxPanel1?.visibility = View.GONE
            }
            CardViewItemMediaDataType.MUSIC -> {
                iconType?.setImageResource(R.drawable.lib_widget_icon_music_icon)
                infoStyle1?.visibility = View.VISIBLE
                etxPanel1?.visibility = View.VISIBLE
            }
            CardViewItemMediaDataType.VIDEO -> {
                iconType?.setImageResource(R.drawable.lib_widget_icon_video_icon)
                infoStyle1?.visibility = View.VISIBLE
                etxPanel1?.visibility = View.VISIBLE
            }
            CardViewItemMediaDataType.MORE -> {
                iconType?.setImageResource(R.drawable.lib_widget_icon_video_icon)
                infoStyle2?.visibility = View.VISIBLE
                etxPanel2?.visibility = View.VISIBLE
            }
            CardViewItemMediaDataType.WATERFALLS -> {
                iconType?.setImageResource(R.drawable.lib_widget_icon_video_icon)
                infoStyle1?.visibility = View.VISIBLE
                etxPanel1?.visibility = View.VISIBLE
                etxPanel1?.findViewById<View>(R.id.download)?.visibility = View.GONE
            }
        }

        GlideImageLoader().loadImage(context, cardViewData.authorHead, authorIcon, null)
        authorIcon?.setOnClickListener { callClicker(CardViewItemMediaElement.AUTHOR_ICON) }

        cardViewData.authorName?.let {
            authorName?.text = it
            authorName?.visibility = View.VISIBLE
            authorName?.setOnClickListener { callClicker(CardViewItemMediaElement.AUTHOR_NAME) }
        }

        cardViewData.views?.let {
            views?.text = it
            views?.visibility = View.VISIBLE
            views?.setOnClickListener { callClicker(CardViewItemMediaElement.VIEWS) }
        }

        cardViewData.size?.let {
            fileSize?.text = it
            fileSize?.visibility = View.VISIBLE
            fileSize?.setOnClickListener { callClicker(CardViewItemMediaElement.SIZE) }
        }

        arrayText(durations,
            cardViewData.duration,
            CardViewItemMediaElement.VIEWS)

        download?.setOnClickListener { callClicker(CardViewItemMediaElement.DOWNLOAD) }
        moreIcon?.setOnClickListener { callClicker(CardViewItemMediaElement.ACTION_MORE) }
    }

    private fun arrayText(
        array: MutableList<TextView?>,
        text: String?,
        element: CardViewItemMediaElement?
    ) {
        array.forEach { view ->
            view?.text = text ?: ""
            view?.setOnClickListener {
                callClicker(element)
            }
        }
    }