Material-Animations-master源码解析

一、MainActivity

1、布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        style="@style/MaterialAnimations.TextAppearance.Title"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        android:background="@color/material_animations_primary"
        android:elevation="@dimen/4dp">   //设置该组建"浮起来"的高度,使该组件有着3D效果

        <TextView
            android:id="@+id/title"
            style="@style/MaterialAnimations.TextAppearance.Title.Inverse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|start"
            android:text="@string/app_name" />

    </android.support.v7.widget.Toolbar>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/sample_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" />

</LinearLayout>

(1)RecyclerView

1)根据官方介绍,该控件用于有限的窗口中展示大量数据集。

可以通过LayoutManager控制其显示方式

可以通过ItemDecoration控制Item的间隔

可以通过ItemAnimation控制Item的增删动画


2)主要方法

setLayoutManager()设置布局管理器

setAdapter()设置adapter

setItemAnimator()设置动画

addItemDecoration()添加分割线


3)Adapter

在onCreateViewHolder中new MyViewHolder().inflate并且return holder

在onBindViewHolder中执行操作

自定义一个内部内MyViewHolder()extend ViewHolder


4)LayoutManager

LinearLayoutManager线性管理器,支持横向、纵向

GridLayoutManager网络布局管理器

StaggeredGridLayoutManager瀑布流式布局管理器(只需要在onBindViewHolder中为每个Item设置随机的高度)


5)ItemAnimator

setItemAnimation()

注意:这里更新数据集使用notifyItemInserted(positon)和notifyItemRemoved(postion)


6)Click和onLongClick

可以在adapter中自己提供回调


2、

二、Sample类

public class Sample implements Serializable {

    final int color;
    private final String name;

    public Sample(@ColorRes int color, String name) {
        this.color = color;
        this.name = name;
    }

    @BindingAdapter("bind:colorTint")
    public static void setColorTint(ImageView view, @ColorRes int color) {
        DrawableCompat.setTint(view.getDrawable(), color); //改变图片的颜色 减少需要的图片
        //view.setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }

    public String getName() {
        return name;
    }

    public int getColor() {
        return color;
    }


}


3、TransitionHelper

class TransitionHelper {

    /**
     * Create the transition participants required during a activity transition while
     * avoiding glitches with the system UI.
     *
     * @param activity The activity used as start for the transition.
     * @param includeStatusBar If false, the status bar will not be added as the transition
     *        participant.
     * @return All transition participants.
     */
    public static Pair<View, String>[] createSafeTransitionParticipants(@NonNull Activity activity,
                                                          boolean includeStatusBar, @Nullable Pair... otherParticipants) {
        // Avoid system UI glitches as described here:
        // https://plus.google.com/+AlexLockwood/posts/RPtwZ5nNebb
        View decor = activity.getWindow().getDecorView();
        View statusBar = null;
        if (includeStatusBar) {

            statusBar = decor.findViewById(android.R.id.statusBarBackground); //获取状态栏
        }
        View navBar = decor.findViewById(android.R.id.navigationBarBackground); //获取底部工具栏(即虚拟键)

        // Create pair of transition participants.
        List<Pair> participants = new ArrayList<>(3);

        //把状态栏和底部工具栏添加到列表中 如果非空的话
        addNonNullViewToTransitionParticipants(statusBar, participants);
        addNonNullViewToTransitionParticipants(navBar, participants);
        // 添加到过渡中如果他至少有一个非空的话
        if (otherParticipants != null && !(otherParticipants.length == 1
                && otherParticipants[0] == null)) {
            participants.addAll(Arrays.asList(otherParticipants)); //添加
        }
        return participants.toArray(new Pair[participants.size()]); //返回包含所有元素的数组 类型是其中的参数 即返回Pair类型的数组
    }

    /**
     * 非空的话就把view添加进入
     * @param view
     * @param participants
     */
    private static void addNonNullViewToTransitionParticipants(View view, List<Pair> participants) {
        if (view == null) {
            return;
        }
        participants.add(new Pair<>(view, view.getTransitionName()));
    }

}


四、SampleRecyclerAdapter

public class SamplesRecyclerAdapter extends RecyclerView.Adapter<SamplesRecyclerAdapter.SamplesViewHolder> {
    private final Activity activity;
    private final List<Sample> samples;


    //构造方法
    public SamplesRecyclerAdapter(Activity activity, List<Sample> samples) {
        this.activity = activity;
        this.samples = samples; //传入需要的list
    }

    @Override
    public SamplesViewHolder onCreateViewHolder(ViewGroup parent, int position) {
        //RowSampleBinding为自动生成的继承自ViewDataBinding类  生成Binding
        RowSampleBinding binding = RowSampleBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new SamplesViewHolder(binding.getRoot()); //构造方法
    }

    @Override
    public void onBindViewHolder(final SamplesViewHolder viewHolder, final int position) {
        final Sample sample = samples.get(viewHolder.getAdapterPosition()); //获取当前的sample
        viewHolder.binding.setSample(sample); //设置给视图
        viewHolder.binding.sampleLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {//设置点击事件
                switch (viewHolder.getAdapterPosition()) { //跳转Activity 并携带对象
                    case 0:
                        transitionToActivity(TransitionActivity1.class, sample);
                        break;
                    case 1:
                        transitionToActivity(SharedElementActivity.class, viewHolder, sample);
                        break;
                    case 2:
                        transitionToActivity(AnimationsActivity1.class, sample);
                        break;
                    case 3:
                        transitionToActivity(RevealActivity.class, viewHolder, sample, R.string.transition_reveal1);
                        break;
                }
            }
        });
    }

    private void transitionToActivity(Class target, Sample sample) {
        final Pair<View, String>[] pairs = TransitionHelper.createSafeTransitionParticipants(activity, true); //传入需要变化的视图数组 true为包括状态栏
        startActivity(target, pairs, sample); //跳转Activvity

    }


    private void transitionToActivity(Class target, SamplesViewHolder viewHolder, Sample sample, int transitionName) {
        final Pair<View, String>[] pairs = TransitionHelper.createSafeTransitionParticipants(activity, false,
                new Pair<>(viewHolder.binding.sampleIcon, activity.getString(transitionName)));//需要变化的视图为不包括状态栏,包括图
        startActivity(target, pairs, sample);
    }

    private void transitionToActivity(Class target, SamplesViewHolder viewHolder, Sample sample) {
        //需要变化的视图不包括状态栏 但包括蓝字和蓝图
        final Pair<View, String>[] pairs = TransitionHelper.createSafeTransitionParticipants(activity, false,
                new Pair<>(viewHolder.binding.sampleIcon, activity.getString(R.string.square_blue_name)),
                new Pair<>(viewHolder.binding.sampleName, activity.getString(R.string.sample_blue_title)));
        startActivity(target, pairs, sample);
    }

    private void startActivity(Class target, Pair<View, String>[] pairs, Sample sample) {
        Intent i = new Intent(activity, target);
        ActivityOptionsCompat transitionActivityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs); //设置Activity跳转动画
        i.putExtra("sample", sample);
        activity.startActivity(i, transitionActivityOptions.toBundle());
    }

    @Override
    public int getItemC
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值