卡片交互效果
This commit is contained in:
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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[]{"新鲜事","在线车辆","首页","探路","车聊聊"};
|
||||
}
|
||||
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user