【问题标题】:Function to animate an ImageView in a RecyclerView在 RecyclerView 中为 ImageView 设置动画的函数
【发布时间】:2019-04-02 12:48:03
【问题描述】:

要转发我的应用程序,我需要一个在 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 和 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)

    }
   }

   }

【问题讨论】:

    标签: android kotlin android-animation android-recyclerview


    【解决方案1】:

    似乎没有人对 RecyclerViews 可以做什么感兴趣...

    我仍然有一个问题,当单击 imageView 时,这是左侧正在旋转的那个!我不明白会发生什么,调试器中的检​​查显示变量正常,索引是位置并且不改变......

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

    我修改了函数中的代码,如果旋转完成了,将flagCard替换为iflagCard(因为两个flag,一个向上,一个向下,当然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 函数: 我尝试使用“抽象运算符乐趣集(索引:Int,元素:E):E” 但由于抽象而无法构建!

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多