带你过一遍Android 多主题框架——MagicaSakura

MagicaSakura 是 Android 多主题框架。
具有以下优点:

  • 列表内容
  • 列表内容
  • 支持白天彩色主题和夜间主题。
  • 切换主题不需要重建activity
  • 提供TintXXX控件适配不同的主题,更方便更快捷。
  • 只需写一个drawable.xml 或者 layout.xml 就能自动适配到不同主题样式。
  • 兼容4.0.3以上
  • 易于集成到你的app。

Github官网
首先进入Main的布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <com.bilibili.magicasakura.widgets.TintToolbar
        android:id="@+id/toolbar"
        style="@style/Widget.App.Toolbar"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/theme_color_primary"
        app:elevation="4dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center_vertical"
            android:paddingLeft="@dimen/padding"
            android:text="@string/app_name"
            android:textColor="@color/white"
            android:textSize="22sp" />

    </com.bilibili.magicasakura.widgets.TintToolbar>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="56dp" />

    <!--底部进行提示-->
    <include layout="@layout/fragment_layout_snack" />
</FrameLayout>

对应Main怎么进入入口

//设置title
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(null);

//设置中间竖直可滑动部分
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setSmoothScrollbarEnabled(true);


//进行分割线的操作
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        //8dp
        final int padding = getResources().getDimensionPixelOffset(R.dimen.padding_half);
        //返回适配器条目的位置
        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
        final int position = layoutParams.getViewLayoutPosition();
        if (position == 0) {
            outRect.left = outRect.top = outRect.right = padding;
            outRect.bottom = padding >> 1;
        } else if (position == state.getItemCount() - 1) {
            outRect.left = outRect.bottom = outRect.right = padding;
            outRect.top = padding >> 1;
        } else {
            outRect.left = outRect.right = padding;
            outRect.top = outRect.bottom = padding >> 1;
        }
    }
});

//设置进行水平还是垂直
recyclerView.setLayoutManager(layoutManager);

//设置适配器
Adapter adapter = new Adapter();
recyclerView.setAdapter(adapter);

//适配器添加HolderType
adapter.addViewHolderType(
        ViewHolder.VIEW_HOLDER_HEADER,
        ViewHolder.VIEW_HOLDER_LABEL,
        ViewHolder.VIEW_HOLDER_HEADER,
        ViewHolder.VIEW_HOLDER_LOGIN,
        ViewHolder.VIEW_HOLDER_HEADER,
        ViewHolder.VIEW_HOLDER_DOWNLOAD
);
这里明白一个知识点
  1. 关于Rect outRect这个参数
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            }
}

在这个参数中Rect outRect这个矩形控制条目的显示
- outRect.left : 控制条目距离左边的距离
- outRect.right:条目距离右边的距离
- outRect.top : 条目距离上边的距离
- outRect.bottom : 条目距离下边的距离

  1. 关于padding >> 1

相当于 padding/2的值

接下来我们就看看适配器
public static class Adapter extends RecyclerView.Adapter<ViewHolder> {
   
    List<Integer> viewHolderTypes = new ArrayList<>();//视图类型
    SparseArrayCompat<Integer> titleIndexs = new SparseArrayCompat<>();//标题集合

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return ViewHolder.create(parent, viewType);根据类型创建每一个条目
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //将数据绑定到item视图上
        if (holder instanceof ViewHolderHeader) {
            ((ViewHolderHeader) holder).setTitle(titleIndexs.get(position));
        }
    }

    //条目集合数
    @Override
    public int getItemCount() {
        return viewHolderTypes.size();
    }

    //根据位置得到type信息
    @Override
    public int getItemViewType(int position) {
        return viewHolderTypes.get(position);
    }

    //
    public void addViewHolderType(int... type) {
        for (int i = 0; i < type.length; i++) {
            if (type[i] == ViewHolder.VIEW_HOLDER_HEADER) {
                titleIndexs.put(i, titleIndexs.size() + 1);
            }
            viewHolderTypes.add(type[i]);
        }
        notifyDataSetChanged();
    }
}

对于适配器,最次也要实现以下几个方法

//onCreateViewHolder()负责为Item创建视图
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return null;
}
//onBindViewHolder()负责将数据绑定到Item的视图上
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
//条目个数
@Override
public int getItemCount() {
    return 0;
}

根据type创建对应的ViewHolder

public static abstract class ViewHolder extends RecyclerView.ViewHolder {
   
    public static final int VIEW_HOLDER_HEADER = 0;
    public static final int VIEW_HOLDER_LABEL = VIEW_HOLDER_HEADER + 1;
    public static final int VIEW_HOLDER_LOGIN = VIEW_HOLDER_LABEL + 1;
    public static final int VIEW_HOLDER_DOWNLOAD = VIEW_HOLDER_LOGIN + 1;

    public ViewHolder(View itemView) {
        super(itemView);
    }

    public static ViewHolder create(ViewGroup viewHolder, int type) {
        switch (type) {
            case VIEW_HOLDER_HEADER:
                return ViewHolderHeader.create(viewHolder);//[1.1]
            case VIEW_HOLDER_LABEL:
                return ViewHolderLabel.create(viewHolder);
            case VIEW_HOLDER_LOGIN:
                return ViewHolderLogin.create(viewHolder);
     
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值