美文网首页
仿FlipBoard app效果2 setting页面

仿FlipBoard app效果2 setting页面

作者: 有点健忘 | 来源:发表于2018-05-23 17:45 被阅读13次

仿这个写的


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的动画。

相关文章

  • 仿FlipBoard app效果2 setting页面

    仿这个写的 布局文件底部的子类,通过设置marginbottom为负的高度,使其不可见 实体类data class...

  • 1.10 设置

    1、设置页面 1.1 新建setting页面 app.json 1.2 在tab选项卡中加入setting页面 a...

  • 仿FlipBoard app效果1首页悬浮窗

    三星以前的手机自带一个FlipBoard的app,就是个简报吧。在主页面手指右滑可以看到,新版本的samsung貌...

  • 教你仿写 Flipboard 的翻页效果

    前言 自从清明放假之后,状态就一直一般般,(放假使我快乐,不要上学,我要放假!)导致更文也断了一段时间,鸽了好一段...

  • WebView仿原生app页面切换效果

    前言 在开发中,有时候我们会在app中使用WebView加载一个web页面。这样可以适当减轻我们开发的难度。但是弊...

  • Android仿Flipboard动画

    @(Alu) 1.上原图 前几天在Hencoder征稿看到的Filpboard 里的的动画效果: 先bb一句:在看...

  • 仿闲鱼APP,中间凸起tab页面

    1)前言 仿闲鱼APP,中间凸起Tab页面; 2)解决方案 首先创建CCTabBarController继承于UI...

  • Spring Data JPA练习

    仿chrome商店 效果图 chrome商店页面chrome商店页面 chrome插件详情页面chrome插件详情...

  • Android app 程序相关整理

    **** ### Android app 程序相关 *** #### app 原理相关(非页面效果) * app启...

  • 【iOS】tableviewCell上添加collocation

    发现问题 这两天优化app类似朋友圈页面的时候,添加了仿“微信朋友圈点击放大的效果”。原本的效果是分享的图片直接进...

网友评论

      本文标题:仿FlipBoard app效果2 setting页面

      本文链接:https://www.haomeiwen.com/subject/tfqdjftx.html