自定义控件

RxTools中银行卡堆叠效果组件的使用

2020-04-02  本文已影响0人  番茄tomato

效果图:


效果图

首先关于RxTools的导入和使用:
https://www.jianshu.com/p/bba6fe666d35

我们要使用RxTool中银行卡堆叠效果组件RxCardStackView来完成以上效果

!!!!!!!!!
注意:以下内容只是本人拙劣的复制和模仿,更多精彩的用法请参考GitHub上的源码https://github.com/Tamsiree/RxTool
拉下代码来一行行理解就可以了
!!!!!!!

一.布局 xml文件

首先Activity布局文件,只需要关注RxCardStackView就可以 ,其他的button什么的 根据业务来调整:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:animateLayoutChanges="true"
    android:orientation="vertical"
    android:background="@color/lightcyan"
    tools:context="swust.yuqiaodan.tomatoapp.mvp.ui.activity.JokeActivity">

    <com.vondear.rxui.view.cardstack.RxCardStackView
        android:id="@+id/stackview_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:clipToPadding="false"
        android:paddingLeft="12dp"
        android:paddingTop="12dp"
        android:paddingRight="12dp" />

.......(其他的省略)......

</LinearLayout>

补充一下在Layout中加入一条属性:
android:animateLayoutChanges="true"
可以使控件在GONE等状态改变的时候有个过渡动画 更流畅。
然后我们为每张卡片的item设计布局,这里支持完全自定义,你可以随心所欲:
所以我就贴一张我这边的item效果图就行了

image.png

二.Adapter 适配器的创建

和RecycleView的适配器很相似
AdapterStackTest继承于RxAdapterStack<T> T是每个item显示的数据实体范形
以下是我的源码,可以直接拿来用,只需要修改范形数据JokeShowBeanColorItemViewHolder中的数据展示方式

//继承于RxAdapterStack<T> T是每个item显示的数据实体范形
public class AdapterStackTest extends RxAdapterStack<JokeShowBean> {


    public AdapterStackTest(Context context) {
        super(context);
    }


    /**绑定每个位置的Card的View
     * @param data   每个View内的数据内容
     * @param position 位置
     * @param holder  每个Card内的数据显示方式 holder (参考recycleview)
     */
    @Override
    public void bindView(JokeShowBean data, int position, RxCardStackView.ViewHolder holder) {
            ColorItemViewHolder h = (ColorItemViewHolder) holder;
            h.onBind(data, position);
    }



    @Override
    protected RxCardStackView.ViewHolder onCreateView(ViewGroup parent, int viewType) {
        
        View view = getLayoutInflater().inflate(R.layout.list_card_item, parent, false);
        return new ColorItemViewHolder(view);

    }
    /**
     * 为每个位置的card指定具体的布局文件
     */
    @Override
    public int getItemViewType(int position) {
        return R.layout.list_card_item;
    }


    /**
     * 数据的显示 holder
     */
    static class ColorItemViewHolder extends RxCardStackView.ViewHolder {
        View mLayout;
        LinearLayout mContainerContent;
        TextView mTextTitle;
        TextView jokeContent;
        ImageView jokeImage;

        public ColorItemViewHolder(View view) {
            super(view);
            mLayout = view.findViewById(R.id.frame_list_card_item);
            mContainerContent = view.findViewById(R.id.container_list_content);
            mTextTitle = (TextView) view.findViewById(R.id.text_list_card_title);

            jokeContent=view.findViewById(R.id.tv_text_content);

            jokeImage=view.findViewById(R.id.img_show_pic);

        }

        /**
         * @param b 每张卡片展开时要做什么事情 这里是显示一个button
         */
        @Override
        public void onItemExpand(boolean b) {

            mContainerContent.setVisibility(b ? View.VISIBLE : View.GONE);

        }


        /**
         * 填入卡片内容和颜色 图片等等
         * @param data 
         * @param position
         */
        public void onBind(JokeShowBean data, int position) {
            mLayout.getBackground().setColorFilter(ContextCompat.getColor(getContext(), CARD_COLOR.get(position)), PorterDuff.Mode.SRC_IN);
            mTextTitle.setText(String.valueOf(position+1));
            jokeContent.setText(data.getContent());

            if(data.isPic()){
                Glide.with(getContext())
                        .asDrawable()//asDrawable()比默认的bitmap占用内存小
                        .load(data.getPic())//图片url
                        .thumbnail(Glide.with(itemView.getContext())
                                .load(R.drawable.loding))//加载中的占位图
                        .into(jokeImage);

            }else{
                jokeImage.setVisibility(View.GONE);
            }


        }

    }
}

三.Activity中的使用方法,抛开业务,核心代码可能只有30行,认真看吧,还是那句话,这里并没有完整的发挥出RxCardStackView的所有功能,详细用法请参考GitHub上的源代码

//实现接口RxCardStackView.ItemExpendListener
public class JokeActivity extends BaseActivity<PicPresenter> implements PicContract.View,RxCardStackView.ItemExpendListener{
    @BindView(R.id.stackview_main)
    RxCardStackView mStackView;
    @BindView(R.id.button_turn_the_page)
    LinearLayout mButtonContainer;
    private AdapterStackTest mTestStackAdapter;
    
    @Override
    public void setupActivityComponent(@NonNull AppComponent appComponent) {
        DaggerPicComponent //如找不到该类,请编译一下项目
                .builder()
                .appComponent(appComponent)
                .view(this)
                .build()
                .inject(this);
    }

    @Override
    public int initView(@Nullable Bundle savedInstanceState) {
        return R.layout.activity_joke;
    }

    @Override
    public void initData(@Nullable Bundle savedInstanceState) {
        
        RxTool.init(this);
        //实现接口RxCardStackView.ItemExpendListener
        mStackView.setItemExpendListener(this);//可以监听到每张卡片的展开
        mTestStackAdapter = new AdapterStackTest(this);//实例化adapter
        mStackView.setAdapter(mTestStackAdapter);//设置adapter
        mPresenter.getPicJoke();//请求数据
    }


    public void onPreClick(View view) {
        //上一张Card
        mStackView.pre();
    }

    public void onNextClick(View view) {
        //下一站Card
        mStackView.next();
    }

    @Override
    public void onItemExpend(boolean expend) {
        //item展开的时候需要做什么
        mButtonContainer.setVisibility(expend ? View.VISIBLE : View.GONE);
    }

    //请求成功之后展示数据
    @Override
    public void showJoke(List<JokeShowBean> data) {
//延迟0.2秒显示
               RxTool.delayToDo(200, new OnSimpleListener() {
            @Override
            public void doSomething() {
                mTestStackAdapter.updateData(data);
            }
        });
    }

}

上一篇 下一篇

猜你喜欢

热点阅读