在RecyclerView中为ImageView设置动画的功能

时间:2019-04-02 12:48:04

标签: android kotlin android-recyclerview android-animation recycler-adapter

要转发我的应用程序,我需要一个可在recyclerView中旋转imageView的函数。 recyclerView是已经运行良好的3个recyclerview之一,可以通过cardView单击。 那里的短片:

https://mega.nz/#!W6AyAYaY!07WG8kr_POYiGsgt0yja6fk8RaclZLw2-MiMFrmEQmk

我创建了具有几个成员的类,这些成员允许知道对象的状态。

我是Android编程的新手,要使这些recyclerView正常运行很困难:-)

4月7日:我终于成功实现了我的职能 但是结果很奇怪! 可以看到那里: https://mega.nz/#!DzI2iaiB!VBG9Ex4TZlAsoUYPSRhXXMP4weH-9hXyjbqF1nCRyeA

有一个旋转的imageView,但这是左边的,而不是单击的,并且是混合的,即图片之间的交换。

我的问题是:imageViews是否像cardViews一样可点击和可聚焦? 如果是这样,我可以尝试使imageView可聚焦和可单击(实际上cardView是...) 索引是recyclerViews呢?不是带有索引的点击的Cardview吗?还是屏幕上的左边一个? 我很困惑:-)

以下:CardView和imageView的布局;我尝试在其中编写函数的MainActivity;以及用于该功能的Top RecyclerView的适配器 在索引处(索引,标签和位置)旋转(180°)imageView

 no change about that xml file    
<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
  <androidx.cardview.widget.CardView
        android:id="@+id/flag_card_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:focusable="true"
        android:clickable="true"
        android:foreground="?android:attr/selectableItemBackground">
    <androidx.constraintlayout.widget.ConstraintLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"

            xmlns:app="http://schemas.android.com/apk/res-auto">

<ImageView
        android:id="@+id/flagcountry"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        app:layout_constraintDimensionRatio="W,55:100"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginLeft="2dp"/>

<TextView
        android:id="@+id/flagname"
        android:layout_width="6dp"
        android:layout_height="match_parent"
        app:layout_constraintLeft_toRightOf="@id/flagcountry"
        android:layout_centerVertical="true"/>
    </androidx.constraintlayout.widget.ConstraintLayout>
   </androidx.cardview.widget.CardView>
   </RelativeLayout>

 under new kt file
   package training.geography.triplerecyclerview

    import android.provider.Settings.Global.getString
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.ImageView
    import android.widget.TextView
    import androidx.cardview.widget.CardView
    import androidx.recyclerview.widget.RecyclerView

   class FlagAdapter(val flagcountrylist: List<FlagCard>,
              val flagitemClickListener : View.OnClickListener
              //val flagitemOnLongClickListener : View.OnLongClickListener
):
RecyclerView.Adapter<FlagAdapter.FlagViewHolder> () {
class FlagViewHolder(flagView: View) : RecyclerView.ViewHolder(flagView) {
    val flagcardView = flagView.findViewById<CardView>(R.id.flag_card_view)
    val flagcountry = flagView.findViewById<ImageView>(R.id.flagcountry)
    val flagname = flagView.findViewById<TextView>(R.id.flagname)
}

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
    FlagViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    val viewItem = inflater.inflate(R.layout.item_flag, parent, false)
    return FlagViewHolder(viewItem)
}

override fun onBindViewHolder(flagholder: FlagViewHolder, position: Int) {
    //val flagcountry: String = flagcountrylist.FlagCard.flagimage[position]
    //var flagimageList: List<String> = flagcountrylist.map { it.flagimage }
    var flagsouthList: List<String> = flagcountrylist.map { it.flagsouth }
    var iflagsouth = flagsouthList[position]
    flagholder.flagname.text = iflagsouth
    flagholder.flagcardView.tag = position
    flagholder.flagcardView.setOnClickListener(flagitemClickListener)
    //flagholder.flagcardView.setOnLongClickListener(itemOnLongClickListener)

    when (position){
        0 -> flagholder.flagcountry.setImageResource(R.drawable.afgcol)
        1 -> flagholder.flagcountry.setImageResource(R.drawable.argsvk)
        2 -> flagholder.flagcountry.setImageResource(R.drawable.armche)
        3 -> flagholder.flagcountry.setImageResource(R.drawable.auttgo)
        4 -> flagholder.flagcountry.setImageResource(R.drawable.azepry)
        5 -> flagholder.flagcountry.setImageResource(R.drawable.bhrtur)
        6 -> flagholder.flagcountry.setImageResource(R.drawable.bratls)
        7 -> flagholder.flagcountry.setImageResource(R.drawable.bwasur)
        8 -> flagholder.flagcountry.setImageResource(R.drawable.cafbtn)
        9 -> flagholder.flagcountry.setImageResource(R.drawable.critun)
        10 -> flagholder.flagcountry.setImageResource(R.drawable.pandza)
        11 -> flagholder.flagcountry.setImageResource(R.drawable.persau)
        12 -> flagholder.flagcountry.setImageResource(R.drawable.svnago)
        13 -> flagholder.flagcountry.setImageResource(R.drawable.sweben)
        14 -> flagholder.flagcountry.setImageResource(R.drawable.tcdgbr)
        15 -> flagholder.flagcountry.setImageResource(R.drawable.thabol)
        16 -> flagholder.flagcountry.setImageResource(R.drawable.tjkdeu)
        17 -> flagholder.flagcountry.setImageResource(R.drawable.tkmbel)
        18 -> flagholder.flagcountry.setImageResource(R.drawable.tzablz)
        19 -> flagholder.flagcountry.setImageResource(R.drawable.ukrcmr)
        20 -> flagholder.flagcountry.setImageResource(R.drawable.uryblr)
        21 -> flagholder.flagcountry.setImageResource(R.drawable.venbgd)
        22 -> flagholder.flagcountry.setImageResource(R.drawable.vnmbfa)
        23 -> flagholder.flagcountry.setImageResource(R.drawable.yembih)
        24 -> flagholder.flagcountry.setImageResource(R.drawable.zmbchl)
        25 -> flagholder.flagcountry.setImageResource(R.drawable.zwealb)
    }
    //var iflagcard:String  = imagelist[position]
 //holder.flagcountry.setImageResource(iflagcard)
}

override fun getItemCount(): Int {
        return flagcountrylist.size
    }
}


---------------------------------------
 //under new MainActivity file with function modified
 // i don't know what to do with the variable 
 // flagtempup, i use it to set the string in 
 // iflagtrigramdown, and i have te warning variable not used...


 package training.geography.triplerecyclerview

 import android.nfc.Tag
 import android.os.Bundle
 import android.view.View
 import android.view.View.OnClickListener
 import android.view.animation.Animation
 import android.view.animation.RotateAnimation
 import android.widget.ImageView
 import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import androidx.cardview.widget.CardView
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import kotlinx.android.synthetic.main.item_flag.*

 data class FlagCard(var flagtrigramup: String, var flagtrigramdown: String,
                    var flagimage: String, var flagsouth: String, var  rotationpossible: Boolean=(true))

  data class CountryCard(val countrytrigram: String, val description: String)

  data class MapCard(var map_left_up: String,
               var map_right_up: String,
               var map_left_down: String,
               var map_right_down: String,
               var maps_img: String,
               var mapnorth: String)


  class MainActivity : AppCompatActivity(), OnClickListener {


var afg_col = FlagCard("col", "afg", "afgcol", "afg", true)
var arg_svk = FlagCard("arg", "svk", "argsvk", "svk", true)
var arm_che = FlagCard("che", "arm", "armche", "arm", true)
var aut_tgo = FlagCard("tgo", "aut", "auttgo", "aut", true)
var aze_pry = FlagCard("aze", "pry", "azepry", "pry", true)
var bhr_tur = FlagCard("tur", "bhr", "bhrtur", "bhr", true)
var bra_tls = FlagCard("tls", "bra", "bratls", "bra", true)
var bwa_sur = FlagCard("sur", "bwa", "bwasur", "bwa", true)
var caf_btn = FlagCard("btn", "caf", "cafbtn", "caf", true)
var cri_tun = FlagCard("cri", "tun", "critun", "tun", true)
var pan_dza = FlagCard("pan", "dza", "pandza", "dza", true)
var per_sau = FlagCard("per", "sau", "persau", "sau", true)
var svn_ago = FlagCard("svn", "ago", "svnago", "ago", true)
var swe_ben = FlagCard("swe", "ben", "sweben", "ben", true)
var tcd_gbr = FlagCard("tcd", "gbr", "tcdgbr", "gbr", true)
var tha_bol = FlagCard("tha", "bol", "thabol", "bol", true)
var tjk_deu = FlagCard("tjk", "deu", "tjkdeu", "deu", true)
var tkm_bel = FlagCard("tkm", "bel", "tkmbel", "bel", true)
var tza_blz = FlagCard("tza", "blz", "tzablz", "blz", true)
var ukr_cmr = FlagCard("ukr", "cmr", "ukrcmr", "cmr", true)
var ury_blr = FlagCard("ury", "blr", "uryblr", "blr", true)
var ven_bgd = FlagCard("ven", "bgd", "venbgd", "bgd", true)
var vnm_bfa = FlagCard("vnm", "bfa", "vnmbfa", "bfa", true)
var yem_bih = FlagCard("yem", "bih", "yembih", "bih", true)
var zmb_chl = FlagCard("zmb", "chl", "zmbchl", "chl", true)
var zwe_alb = FlagCard("zwe", "alb", "zwealb", "alb", true)

var afg = CountryCard("afg", "afg")
var ago = CountryCard("ago", "ago")
var alb = CountryCard("alb", "alb")
var arg = CountryCard("arg", "arg")
var arm = CountryCard("arm", "arm")
var aut = CountryCard("aut", "aut")
var aze = CountryCard("aze", "aze")
var bel = CountryCard("bel", "bel")
var bfa = CountryCard("bfa", "bfa")
var bhr = CountryCard("bhr", "bhr")
var bih = CountryCard("bih", "bih")
var blz = CountryCard("blz", "blz")
var bol = CountryCard("bol", "bol")
var bra = CountryCard("bra", "bra")
var btn = CountryCard("btn", "btn")
var bwa = CountryCard("bwa", "bwa")
var caf = CountryCard("caf", "caf")
var che = CountryCard("che", "che")
var chl = CountryCard("chl", "chl")
var cmr = CountryCard("cmr", "cmr")
var col = CountryCard("col", "col")
var cri = CountryCard("cri", "cri")
var deu = CountryCard("deu", "deu")
var gbr = CountryCard("gbr", "gbr")
var pan = CountryCard("pan", "pan")
var per = CountryCard("per", "per")
var pry = CountryCard("pry", "pry")
var sau = CountryCard("sau", "sau")
var sur = CountryCard("sur", "sur")
var svk = CountryCard("svk", "svk")
var svn = CountryCard("svn", "svn")
var swe = CountryCard("swe", "swe")
var tcd = CountryCard("tcd", "tcd")
var tgo = CountryCard("tgo", "tgo")
var tha = CountryCard("tha", "tha")
var tjk = CountryCard("tjk", "tjk")
var tkm = CountryCard("tkm", "tkm")
var tls = CountryCard("tls", "tls")
var tun = CountryCard("tun", "tun")
var tur = CountryCard("tur", "tur")
var tza = CountryCard("tza", "tza")
var ukr = CountryCard("ukr", "ukr")
var ury = CountryCard("ury", "ury")
var ven = CountryCard("ven", "ven")
var vnm = CountryCard("vnm", "vnm")
var yem = CountryCard("yem", "yem")
var zmb = CountryCard("zmb", "zmb")
var zwe = CountryCard("zwe", "zwe")

var arm_bol_gbr_ago = MapCard("arm", "bol", "gbr", "ago", "bol", "armbolgbrago")
var aze_bra_aut_ben = MapCard("aze", "bra", "aut", "ben", "bra", "azebraautben")
var bfa_blr_col_bgd = MapCard("bfa", "blr", "col", "bgd", "blr", "bfablrcolbgd")
var bwa_bel_bhr_chl = MapCard("bwa", "bel", "bhr", "chl", "bel", "bwabelbhrchl")
var caf_afg_alb_arg = MapCard("caf", "afg", "alb", "arg", "afg", "cafafgalbarg")
var che_tkm_tur_sur = MapCard("che", "tkm", "tur", "sur", "tkm", "chetkmtursur")
var cri_cmr_btn_bih = MapCard("cri", "cmr", "btn", "bih", "cmr", "cricmrbtnbih")
var sau_blz_deu_dza = MapCard("sau", "blz", "deu", "dza", "blz", "saublzdeudza")
var svn_tha_tcd_pry = MapCard("svn", "tha", "tcd", "pry", "tha", "svnthatcdpry")
var swe_tls_tgo_per = MapCard("swe", "tls", "tgo", "per", "tls", "swetlstgoper")
var tjk_pan_svk_tza = MapCard("tjk", "pan", "svk", "tza", "pan", "tjkpansvktza")
var ven_zwl_yem_ukr = MapCard("ven", "zwl", "yem", "ukr", "zwl", "venzwlyemukr")
var zmb_tur_ury_vnm = MapCard("zmb", "tur", "ury", "vnm", "tur", "zmbtururyvnm")


var flagcountrylist = listOf<FlagCard>(
    afg_col,
    arg_svk,
    arm_che,
    aut_tgo,
    aze_pry,
    bhr_tur,
    bra_tls,
    bwa_sur,
    caf_btn,
    cri_tun,
    pan_dza,
    per_sau,
    svn_ago,
    swe_ben,
    tcd_gbr,
    tha_bol,
    tjk_deu,
    tkm_bel,
    tza_blz,
    ukr_cmr,
    ury_blr,
    ven_bgd,
    vnm_bfa,
    yem_bih,
    zmb_chl,
    zwe_alb
)


val flagadapter = FlagAdapter(flagcountrylist, this)


var countryList = listOf<CountryCard>(
    afg,
    ago,
    alb,
    arg,
    arm,
    aut,
    aze,
    bel,
    bfa,
    bhr,
    bih,
    blz,
    blz,
    bol,
    bra,
    btn,
    bwa,
    caf,
    che,
    chl,
    cmr,
    col,
    cri,
    deu,
    gbr,
    pan,
    per,
    pry,
    sau,
    sur,
    svk,
    svn,
    swe,
    tcd,
    tgo,
    tha,
    tjk,
    tkm,
    tls,
    tun,
    tur,
    tza,
    ukr,
    ury,
    ven,
    vnm,
    yem,
    zmb,
    zwe
)
val countryadapter = CountryAdapter(countryList)


var mapcountrylist = listOf<MapCard>(
    arm_bol_gbr_ago,
    aze_bra_aut_ben,
    bfa_blr_col_bgd,
    bwa_bel_bhr_chl,
    caf_afg_alb_arg,
    che_tkm_tur_sur,
    cri_cmr_btn_bih,
    sau_blz_deu_dza,
    svn_tha_tcd_pry,
    swe_tls_tgo_per,
    tjk_pan_svk_tza,
    ven_zwl_yem_ukr,
    zmb_tur_ury_vnm
)
val mapadapter = MapAdapter(mapcountrylist)


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val flagsrecyclerView = findViewById<RecyclerView>(R.id.flagsRecyclerView)
    flagsrecyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)
    flagsrecyclerView.adapter = flagadapter


    val countryrecyclerView = findViewById<RecyclerView>(R.id.countriesRecyclerView)
    countryrecyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)
    countryrecyclerView.adapter = countryadapter


    val maprecyclerView = findViewById<RecyclerView>(R.id.mapsRecyclerView)
    maprecyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false)
    maprecyclerView.adapter = mapadapter

}

  fun rotateFlagCard (flagCard: FlagCard, position: Int) : FlagCard {

    var flagtrigramuplist: List<String> = flagcountrylist.map{it.flagtrigramup }
    var iflagtrigramup : String = flagtrigramuplist[position]

    var flagimagelist = flagcountrylist.map{it.flagimage}
    var iflagimage = flagimagelist[position]
    var flagsouthlist = flagcountrylist.map { it.flagsouth }
    var iflagsouth = flagsouthlist[position]
    var rotationpossiblelist : List<Boolean> = flagcountrylist.map{ it.rotationpossible }
    var irotationpossible = rotationpossiblelist[position]
    var iflagimageView = findViewById<ImageView>(R.id.flagcountry)

    when (position) {
        0 ->  iflagimageView.setImageResource(R.drawable.afgcol)
        1 ->  iflagimageView.setImageResource(R.drawable.argsvk)
        2 -> iflagimageView.setImageResource(R.drawable.armche)
        3 ->  iflagimageView.setImageResource(R.drawable.auttgo)
        4 -> iflagimageView.setImageResource(R.drawable.azepry)
        5 ->  iflagimageView.setImageResource(R.drawable.bhrtur)
        6 ->  iflagimageView.setImageResource(R.drawable.bratls)
        7 ->  iflagimageView.setImageResource(R.drawable.bwasur)
        8 ->  iflagimageView.setImageResource(R.drawable.cafbtn)
        9 ->  iflagimageView.setImageResource(R.drawable.critun)
        10 ->  iflagimageView.setImageResource(R.drawable.pandza)
        11 ->  iflagimageView.setImageResource(R.drawable.persau)
        12 ->  iflagimageView.setImageResource(R.drawable.svnago)
        13 ->  iflagimageView.setImageResource(R.drawable.sweben)
        14 ->  iflagimageView.setImageResource(R.drawable.tcdgbr)
        15 ->  iflagimageView.setImageResource(R.drawable.thabol)
        16 ->  iflagimageView.setImageResource(R.drawable.tjkdeu)
        17 ->  iflagimageView.setImageResource(R.drawable.tkmbel)
        18 ->  iflagimageView.setImageResource(R.drawable.tzablz)
        19 ->  iflagimageView.setImageResource(R.drawable.ukrcmr)
        20 ->  iflagimageView.setImageResource(R.drawable.uryblr)
        21 ->  iflagimageView.setImageResource(R.drawable.venbgd)
        22 ->  iflagimageView.setImageResource(R.drawable.vnmbfa)
        23 ->  iflagimageView.setImageResource(R.drawable.yembih)
        24 ->  iflagimageView.setImageResource(R.drawable.zmbchl)
        25 ->  iflagimageView.setImageResource(R.drawable.zwealb)
        else -> throw AssertionError()
    }

    if (irotationpossible)
        {
        iflagimageView.animate().apply {
            rotationBy(180f)
            duration = 1000L
            start()
          // permutation of values north south
            var flagtrigramdownlist :List<String> = flagcountrylist.map{it.flagtrigramdown}
            var iflagtrigramdown : String = flagtrigramdownlist[position]
        var flagtempup: String = iflagtrigramup
            var flagtempdown: String = iflagtrigramdown
        iflagtrigramup = iflagsouth
        //flagtempdown = flagtempup
            iflagtrigramdown = flagtempup

        var iflagCard = FlagCard( iflagtrigramup, iflagtrigramdown, iflagimage, iflagsouth, irotationpossible )
            return iflagCard
        }
    } else {
        return flagCard
        //Toast.makeText(this, "flag already matched country", Toast.LENGTH_LONG).show()
    }
}


    override fun onClick(flagcardView: View) {
    if (flagcardView.tag != null) {
        val index = flagcardView.tag as Int
        var flagsouthList: List<String> = flagcountrylist.map{it.flagsouth }
        val flags = flagsouthList[index]
        Toast.makeText(this, "country : ${flags}", Toast.LENGTH_LONG).show()
        var flagcard:FlagCard = flagcountrylist[index]
        rotateFlagCard (flagcard, index)

    }
   }

   }

1 个答案:

答案 0 :(得分:0)

似乎没有人对使用RecyclerViews感兴趣...

我仍然有一个问题,当单击imageView时,这是左边的一个折弯!我不明白会发生什么,调试器中的检​​查表明变量正常,idex处于位置并且没有变化...

我尝试将旋转功能应用于cardView,结果相同!

我修改了函数中的代码,如果完成了旋转,则用iflagCard替换了flagCard(因为两个标志,一个向上,一个向下,当然FlagCard是不同的...)

这里是新代码:

if (irotationpossible)
    {
        iflagcardView.animate().apply {
            rotationBy(180f)
            duration = 1000L
            start()
            // permutation of values north south
            var flagtrigramdownlist :List<String> = flagcountrylist.map{it.flagtrigramdown}
            var iflagtrigramdown : String = flagtrigramdownlist[position]
            var flagtempup: String = iflagtrigramup
            var flagtempdown: String = iflagtrigramdown
            iflagtrigramup = iflagsouth
            iflagsouth = flagtempup
            iflagtrigramdown = flagtempup

            var iflagCard = FlagCard( iflagtrigramup, iflagtrigramdown, iflagimage, iflagsouth, irotationpossible )
            //flagcountrylist.toSet(position, iflagCard)
            //abstract operator fun set(position: Int, iflagCard: FlagCard): FlagCard
            flagcountrylist.removeAt(position)
            flagcountrylist.add(position, iflagCard)
            return iflagCard
        }
    } else {
        return flagCard
        //Toast.makeText(this, "flag already matched country", Toast.LENGTH_LONG).show()
    }

我的问题现在是关于Kotlin中mutableListOf的set函数: 我尝试使用“抽象运算符有趣的集(索引:整数,元素:E):E” 但由于抽象而无法构建!

除了我的解决方案之外,还有其他方法可以删除然后在相同索引处添加吗?

是否有任何实验过的开发人员对应用程序中的奇怪旋转感到好奇? https://www.youtube.com/watch?v=d9o7fttLBxk

为什么索引不正确的图像?