一、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()));
}
}
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