卡片交互效果

This commit is contained in:
zhangyuanzhen
2020-03-11 20:33:24 +08:00
parent 0e63b8f2b4
commit 1827af85c6
47 changed files with 2155 additions and 55 deletions

View File

@@ -14,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.mvp.MvpFragment;
import com.mogo.module.apps.adapter.AppIndicatorAdapter;
import com.mogo.module.apps.utils.CardScaleTransformer;
import com.mogo.module.apps.utils.LaunchUtils;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.service.MogoServicePaths;
@@ -23,6 +24,8 @@ import com.mogo.service.fragmentmanager.IMogoFragmentManager;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.utils.TipToast;
import com.yarolegovich.discretescrollview.DiscreteScrollView;
import com.yarolegovich.discretescrollview.transform.ScaleTransformer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -34,7 +37,8 @@ import java.util.Map;
* 描述
*/
public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavigatorPresenter>
implements AppNavigatorView {
implements AppNavigatorView, DiscreteScrollView.OnItemChangedListener<RecyclerView.ViewHolder>,
DiscreteScrollView.ScrollStateChangeListener<RecyclerView.ViewHolder> {
private View mApps;
@@ -46,7 +50,7 @@ public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavig
private IMogoModuleProvider mSearchProvider;
private IMogoAnalytics mMogoAnalytics;
private RecyclerView scroller;
private DiscreteScrollView scroller;
@Override
protected int getLayoutId() {
@@ -63,26 +67,31 @@ public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavig
mApps = findViewById(R.id.module_apps_id_apps);
scroller = findViewById(R.id.module_apps_id_scroller);
LinearLayoutManager linearLayoutManager =
new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
scroller.setLayoutManager(linearLayoutManager);
scroller.setSlideOnFling(true);
scroller.addOnItemChangedListener(this);
scroller.addScrollStateChangeListener(this);
//scroller.setItemTransitionTimeMillis(DiscreteScrollViewOptions.getTransitionTime());
scroller.setItemTransformer(new CardScaleTransformer.Builder()
.setMinScale(0.84f)
.build());
//
//
//LinearLayoutManager linearLayoutManager =
// new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
//
//scroller.setLayoutManager(linearLayoutManager);
ArrayList<Integer> integers = new ArrayList<>(10);
integers.add(R.drawable.module_apps_ic_navigation);
integers.add(R.drawable.module_apps_ic_interest);
integers.add(R.drawable.module_apps_ic_online_car);
integers.add(R.drawable.module_apps_ic_news);
integers.add(R.drawable.module_apps_ic_tanlu);
integers.add(R.drawable.module_apps_ic_media_center);
integers.add(R.drawable.module_apps_ic_car_settings);
integers.add(R.drawable.module_apps_ic_car_settings);
integers.add(R.drawable.module_apps_ic_car_settings);
AppIndicatorAdapter appIndicatorAdapter = new AppIndicatorAdapter(getContext(), integers);
scroller.setAdapter(appIndicatorAdapter);
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(scroller);
scroller.scrollToPosition(Integer.MAX_VALUE / 2);
scroller.scrollToPosition(Integer.MAX_VALUE / 2-1);
//mNavigation.setOnClickListener( view -> {
// openSearchPanel();
// trackNavigatorClickEvent( 1 );
@@ -163,4 +172,23 @@ public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavig
mPresenter.onDestroy(getViewLifecycleOwner());
}
}
@Override
public void onCurrentItemChanged(@Nullable RecyclerView.ViewHolder viewHolder, int i) {
}
@Override public void onScrollStart(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
}
@Override public void onScrollEnd(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
}
@Override
public void onScroll(float v, int i, int i1, @Nullable RecyclerView.ViewHolder viewHolder,
@Nullable RecyclerView.ViewHolder t1) {
}
}

View File

@@ -28,5 +28,7 @@ public class AppIndicatorAdapter extends RecycleBaseAdapter<Integer> {
@Override public void onBindViewHolder(RecycleViewHolder holder, Integer integer) {
ImageView ivIndicator = holder.getView(R.id.module_apps_id_app_icon);
ivIndicator.setImageResource(integer);
holder.setText(R.id.module_apps_id_app_name,names[holder.getLayoutPosition()%5] );
}
private String[] names=new String[]{"新鲜事","在线车辆","首页","探路","车聊聊"};
}

View File

@@ -0,0 +1,91 @@
package com.mogo.module.apps.utils;
import android.view.View;
import androidx.annotation.FloatRange;
import com.mogo.module.apps.R;
import com.yarolegovich.discretescrollview.transform.DiscreteScrollItemTransformer;
import com.yarolegovich.discretescrollview.transform.Pivot;
import com.yarolegovich.discretescrollview.transform.ScaleTransformer;
/**
* @author zyz
* 2020-03-11.
*/
public class CardScaleTransformer implements DiscreteScrollItemTransformer {
private Pivot pivotX;
private Pivot pivotY;
private float minScale;
private float maxMinDiff;
public CardScaleTransformer() {
pivotX = Pivot.X.CENTER.create();
pivotY = Pivot.Y.BOTTOM.create();
minScale = 0.8f;
maxMinDiff = 0.2f;
}
@Override
public void transformItem(View item, float position) {
item= item.findViewById(R.id.module_apps_id_app_icon);
pivotX.setOn(item);
pivotY.setOn(item);
float closenessToCenter = 1f - Math.abs(position);
float scale = minScale + maxMinDiff * closenessToCenter;
item.setScaleX(scale);
item.setScaleY(scale);
}
public static class Builder {
private CardScaleTransformer transformer;
private float maxScale;
public Builder() {
transformer = new CardScaleTransformer();
maxScale = 1f;
}
public Builder setMinScale(@FloatRange(from = 0.01) float scale) {
transformer.minScale = scale;
return this;
}
public Builder setMaxScale(@FloatRange(from = 0.01) float scale) {
maxScale = scale;
return this;
}
public Builder setPivotX(Pivot.X pivotX) {
return setPivotX(pivotX.create());
}
public Builder setPivotX(Pivot pivot) {
assertAxis(pivot, Pivot.AXIS_X);
transformer.pivotX = pivot;
return this;
}
public Builder setPivotY(Pivot.Y pivotY) {
return setPivotY(pivotY.create());
}
public Builder setPivotY(Pivot pivot) {
assertAxis(pivot, Pivot.AXIS_Y);
transformer.pivotY = pivot;
return this;
}
public CardScaleTransformer build() {
transformer.maxMinDiff = maxScale - transformer.minScale;
return transformer;
}
private void assertAxis(Pivot pivot, @Pivot.Axis int axis) {
if (pivot.getAxis() != axis) {
throw new IllegalArgumentException("You passed a Pivot for wrong axis.");
}
}
}
}