仿FlipBoard app效果2 setting页面

仿这个写的


image.png

布局文件
底部的子类,通过设置marginbottom为负的高度,使其不可见

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">
<RelativeLayout
    android:id="@+id/layout_top"
    android:layout_width="match_parent"
    android:layout_height="150dp">
    <ImageView
        android:id="@+id/iv_bg"
        android:src="@mipmap/pic11"
        android:scaleType="centerCrop"
        android:layout_width="match_parent"
        android:layout_height="300dp" />
    <View
        android:id="@+id/view_mask"
        android:alpha="0.5"
        android:layout_centerInParent="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <CheckBox
        android:id="@+id/cb"
        android:clickable="false"
        android:layout_centerVertical="true"
        android:layout_marginLeft="30dp"
        android:layout_width="30dp"
        android:layout_height="30dp" />
    <TextView
        android:id="@+id/tv_type"
        android:text="type"
        android:layout_centerInParent="true"
        android:layout_width="60dp"
        android:gravity="center"
        android:textColor="#fff"
        android:layout_height="25dp" />
    <TextView
        android:id="@+id/tv_expand"
        android:text="expand"
        android:gravity="center"
        android:textColor="#fff"
        android:padding="10dp"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/tv_type"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>
    <FrameLayout
        android:id="@+id/layout_expand"
        android:layout_width="match_parent"
        android:layout_marginBottom="-50dp"
        android:layout_height="50dp">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_sub_types"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </FrameLayout>
</LinearLayout>

实体类
data class FlipSettingBean(var type:String,var subTypes: ArrayList<String>?,var colorStr:String,var expanded:Boolean=false,var checked:Boolean=true)
代码文件

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

        setSupportActionBar(toolbar)
        supportActionBar?.apply {
            setTitle("flip board setting")
            setDisplayHomeAsUpEnabled(true)
        }
        initRvDatas()
        initRv()
    }
    var screenWidht=0
    var datas= arrayListOf<FlipSettingBean>()
    var subTypes= arrayListOf<String>("头条","图片","社会","国际","国内")
    private fun initRvDatas() {
        screenWidht=windowManager.defaultDisplay.width
        datas.add(FlipSettingBean("news",subTypes,"#ff0000"))
        datas.add(FlipSettingBean("business",subTypes,"#647464"))
        datas.add(FlipSettingBean("technology",subTypes,"#7575be"))
        datas.add(FlipSettingBean("sports",subTypes,"#30ceac"))
        datas.add(FlipSettingBean("video",subTypes,"#E7D50E"))
        datas.add(FlipSettingBean("fashion",subTypes,"#2283BF"))
        datas.add(FlipSettingBean("foods",subTypes,"#FFAEB9AE"))
        datas.add(FlipSettingBean("travel",subTypes,"#FFA58DBC"))
        datas.add(FlipSettingBean("recreation",subTypes,"#FFF4A34C"))
        datas.add(FlipSettingBean("science",subTypes,"#FFFA4582"))

    }

    private fun initRv(){
        rv.apply {
            layoutManager=LinearLayoutManager(this@ActivityFlipBoardSetting)

            adapter=object :BaseRvAdapter<FlipSettingBean>(datas){
                override fun getLayoutID(viewType: Int): Int {
                    return R.layout.item_flip_setting
                }

                var mSharedPool = RecyclerView.RecycledViewPool()
                override fun onBindViewHolder(holder: BaseRvHolder, position: Int) {
                    var data=getItemData(position)
                    var color=Color.parseColor(data.colorStr)
                    holder.getView<TextView>(R.id.tv_type).apply {
                        text=data.type
                        if(data.checked){
                            setBackgroundResource(R.drawable.shape_white_stoke)
                        }else{
                            setBackgroundColor(color)
                        }
                    }

                    holder.getView<CheckBox>(R.id.cb).isChecked=data.checked
                    holder.getView<View>(R.id.layout_expand).apply {
                        visibility=if(data.expanded) View.VISIBLE else View.GONE
                        setBackgroundColor(color)
                    }
                    holder.getView<View>(R.id.view_mask).apply {
                        setBackgroundColor(color)
                        visibility=if(data.checked)View.VISIBLE else View.GONE //蒙版的可见性修改
                    }

                    holder.getView<TextView>(R.id.tv_expand).apply {
                        text=if(data.expanded) "collpse" else "expand"
                        setOnClickListener {
                            data.expanded=!data.expanded
                            text=if(data.expanded) "collpse" else "expand"
                            //底部的通过动画来修改bottomMargin实现动态展开的效果
                            holder.getView<View>(R.id.layout_expand).apply {
                                var anim=ValueAnimator.ofInt(0,-50)

                                if(data.expanded){
                                    anim=ValueAnimator.ofInt(-50,0)
                                    visibility=View.VISIBLE
                                }
                                anim.setDuration(200)
                                anim.start()
                                anim.addUpdateListener {
                                    holder.getView<View>(R.id.layout_expand).apply {
                                        var params=layoutParams as LinearLayout.LayoutParams
                                        params.bottomMargin=it.animatedValue as Int
                                        layoutParams=params
                                    }
                                }
                            }
                        }
                    }

                    holder.getView<View>(R.id.layout_top).setOnClickListener {
                        data.checked=!data.checked
                        holder.getView<CheckBox>(R.id.cb).isChecked=data.checked
                        //展开的子类布局收缩
                        holder.getView<View>(R.id.layout_expand).apply {
                            var params=layoutParams as LinearLayout.LayoutParams
                            params.bottomMargin=-50
                            layoutParams=params
                        }
                        //文字修改
                        data.expanded=false
                        holder.getView<TextView>(R.id.tv_expand).text="expand"
   //取消旧的动画
                        with( holder.getView<View>(R.id.view_mask)){
                            if(animation!=null){
                                animation.cancel()
                            }
                        }
                        //开启动画
                        var samll=0.1f
                        var big=1f
                        var scaleAnim=ScaleAnimation(1f,60f/screenWidht,1f,25f/150,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f)
                        if(data.checked){
                             scaleAnim=ScaleAnimation(60f/screenWidht,1f,25f/150,1f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f)
                        }
                        scaleAnim.duration=200
                        scaleAnim.setAnimationListener(object :Animation.AnimationListener{
                            override fun onAnimationRepeat(animation: Animation?) {

                            }

                            override fun onAnimationEnd(animation: Animation?) {
                                holder.getView<View>(R.id.view_mask).visibility=if(data.checked)View.VISIBLE else View.GONE
                                holder.getView<TextView>(R.id.tv_type).apply {
                                    if(data.checked){
                                    }else{
                                        setBackgroundColor(color)
                                    }
                                }
                            }

                            override fun onAnimationStart(animation: Animation?) {
                                holder.getView<TextView>(R.id.tv_expand).visibility=if(data.checked)View.VISIBLE else View.GONE
                                holder.getView<TextView>(R.id.tv_type).apply {
                                    if(data.checked){
                                        setBackgroundResource(R.drawable.shape_white_stoke)
                                    }
                                }
                            }
                        })
                        holder.getView<View>(R.id.view_mask).startAnimation( scaleAnim)
                        holder.getView<View>(R.id.view_mask).visibility=View.VISIBLE
                    }
                    holder.getView<RecyclerView>(R.id.rv_sub_types).apply {
                        recycledViewPool=mSharedPool
                        if(adapter==null){
                            layoutManager=LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false).apply {
                                recycleChildrenOnDetach=true

                            }

                            addItemDecoration(object :RecyclerView.ItemDecoration(){
                                override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State?) {
                                    outRect.right=11

                                }
                            })

                            adapter=object :BaseRvAdapter<String>(data.subTypes){
                                override fun getLayoutID(viewType: Int): Int {
                                    return R.layout.item_flip_sub_type
                                }

                                override fun onBindViewHolder(holder: BaseRvHolder, p: Int) {
                                    holder.setText(R.id.tv_sub_type,getItemData(p)+":$position")

                                }

                                override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRvHolder {
                               
                                    return super.onCreateViewHolder(parent, viewType)
                                }
                            }
                        }else{
                            (adapter as BaseRvAdapter<String>).initData(data.subTypes!!)
                        }

                    }
                }

            }
        }
    }

简单分析下,展开收缩的时候,开启一个动画,修改底部控件的marginBottom来实现平滑出现的效果
整体点击的时候就是对蒙版view进行一个scale的动画。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容