Merge branch 'feature/v1.0.2' of gitlab.zhidaoauto.com:ecos/yycp-service/Launcher into feature/v1.0.2
@@ -43,10 +43,10 @@ dependencies {
|
||||
implementation rootProject.ext.dependencies.material
|
||||
annotationProcessor rootProject.ext.dependencies.aroutercompiler
|
||||
implementation rootProject.ext.dependencies.androidxrecyclerview
|
||||
|
||||
if (Boolean.valueOf(RELEASE)) {
|
||||
implementation rootProject.ext.dependencies.mogomap
|
||||
implementation rootProject.ext.dependencies.mogomapapi
|
||||
implementation rootProject.ext.dependencies.mogomapapi
|
||||
implementation rootProject.ext.dependencies.mogoutils
|
||||
api rootProject.ext.dependencies.mogocommons
|
||||
api rootProject.ext.dependencies.mogoserviceapi
|
||||
@@ -58,6 +58,8 @@ dependencies {
|
||||
api project(":foudations:mogo-commons")
|
||||
api project(':services:mogo-service-api')
|
||||
implementation project(':modules:mogo-module-common')
|
||||
implementation project(":libraries:card-library")
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,12 +3,18 @@ package com.mogo.module.apps;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import android.widget.HorizontalScrollView;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearSnapHelper;
|
||||
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;
|
||||
@@ -18,6 +24,9 @@ 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;
|
||||
|
||||
@@ -27,11 +36,10 @@ import java.util.Map;
|
||||
* <p>
|
||||
* 描述
|
||||
*/
|
||||
public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavigatorPresenter > implements AppNavigatorView {
|
||||
public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavigatorPresenter>
|
||||
implements AppNavigatorView, DiscreteScrollView.OnItemChangedListener<RecyclerView.ViewHolder>,
|
||||
DiscreteScrollView.ScrollStateChangeListener<RecyclerView.ViewHolder> {
|
||||
|
||||
private View mNavigation;
|
||||
private View mMediaCenter;
|
||||
private View mCarSettings;
|
||||
private View mApps;
|
||||
|
||||
private IMogoFragmentManager mMogoFragmentManager;
|
||||
@@ -42,6 +50,7 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
|
||||
private IMogoModuleProvider mSearchProvider;
|
||||
|
||||
private IMogoAnalytics mMogoAnalytics;
|
||||
private DiscreteScrollView scroller;
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
@@ -51,66 +60,105 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
|
||||
@Override
|
||||
protected void initViews() {
|
||||
|
||||
mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation();
|
||||
mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance()
|
||||
.build(MogoServicePaths.PATH_FRAGMENT_MANAGER)
|
||||
.navigation();
|
||||
|
||||
mNavigation = findViewById( R.id.module_apps_id_navigation );
|
||||
mMediaCenter = findViewById( R.id.module_apps_ic_media_center );
|
||||
mCarSettings = findViewById( R.id.module_apps_ic_car_settings );
|
||||
mApps = findViewById( R.id.module_apps_id_apps );
|
||||
mNavigation.setOnClickListener( view -> {
|
||||
openSearchPanel();
|
||||
trackNavigatorClickEvent( 1 );
|
||||
} );
|
||||
mMediaCenter.setOnClickListener( view -> {
|
||||
try {
|
||||
LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC );
|
||||
trackNavigatorClickEvent( 2 );
|
||||
} catch ( Exception e ) {
|
||||
TipToast.shortTip( R.string.module_apps_str_no_app );
|
||||
}
|
||||
} );
|
||||
mCarSettings.setOnClickListener( view -> {
|
||||
try {
|
||||
LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS );
|
||||
trackNavigatorClickEvent( 3 );
|
||||
} catch ( Exception e ) {
|
||||
TipToast.shortTip( R.string.module_apps_str_no_app );
|
||||
}
|
||||
} );
|
||||
mApps.setOnClickListener( view -> {
|
||||
mApps = findViewById(R.id.module_apps_id_apps);
|
||||
|
||||
scroller = findViewById(R.id.module_apps_id_scroller);
|
||||
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_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);
|
||||
|
||||
AppIndicatorAdapter appIndicatorAdapter = new AppIndicatorAdapter(getContext(), integers);
|
||||
scroller.setAdapter(appIndicatorAdapter);
|
||||
scroller.scrollToPosition(Integer.MAX_VALUE / 2-1);
|
||||
//mNavigation.setOnClickListener( view -> {
|
||||
// openSearchPanel();
|
||||
// trackNavigatorClickEvent( 1 );
|
||||
//} );
|
||||
//mMediaCenter.setOnClickListener( view -> {
|
||||
// try {
|
||||
// LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_MUSIC );
|
||||
// trackNavigatorClickEvent( 2 );
|
||||
// } catch ( Exception e ) {
|
||||
// TipToast.shortTip( R.string.module_apps_str_no_app );
|
||||
// }
|
||||
//} );
|
||||
//mCarSettings.setOnClickListener( view -> {
|
||||
// try {
|
||||
// LaunchUtils.launchByPkg( getContext(), AppsConst.APP_PKG_CAR_SETTINGS );
|
||||
// trackNavigatorClickEvent( 3 );
|
||||
// } catch ( Exception e ) {
|
||||
// TipToast.shortTip( R.string.module_apps_str_no_app );
|
||||
// }
|
||||
//} );
|
||||
mApps.setOnClickListener(view -> {
|
||||
openAppsPanel();
|
||||
trackNavigatorClickEvent( 4 );
|
||||
} );
|
||||
trackNavigatorClickEvent(4);
|
||||
});
|
||||
}
|
||||
|
||||
private void scrollToCenter(int index) {
|
||||
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected AppNavigatorPresenter createPresenter() {
|
||||
return new AppNavigatorPresenter( this );
|
||||
return new AppNavigatorPresenter(this);
|
||||
}
|
||||
|
||||
private void openSearchPanel() {
|
||||
mSearchProvider = ( IMogoModuleProvider ) ARouter.getInstance().build( MogoModulePaths.PATH_MODULE_SEARCH ).navigation();
|
||||
final Fragment fragment = mSearchProvider.createFragment( getContext(), null );
|
||||
mMogoFragmentManager.push( new FragmentDescriptor.Builder().fragment( fragment ).tag( MogoModulePaths.PATH_FRAGMENT_SEARCH ).notifyMainModule( true ).build() );
|
||||
mSearchProvider = (IMogoModuleProvider) ARouter.getInstance()
|
||||
.build(MogoModulePaths.PATH_MODULE_SEARCH)
|
||||
.navigation();
|
||||
final Fragment fragment = mSearchProvider.createFragment(getContext(), null);
|
||||
mMogoFragmentManager.push(new FragmentDescriptor.Builder().fragment(fragment)
|
||||
.tag(MogoModulePaths.PATH_FRAGMENT_SEARCH)
|
||||
.notifyMainModule(true)
|
||||
.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated( @Nullable Bundle savedInstanceState ) {
|
||||
super.onActivityCreated( savedInstanceState );
|
||||
mMogoFragmentManager = ( IMogoFragmentManager ) ARouter.getInstance().build( MogoServicePaths.PATH_FRAGMENT_MANAGER ).navigation( getContext() );
|
||||
mMogoAnalytics = ( IMogoAnalytics ) ARouter.getInstance().build( MogoServicePaths.PATH_UTILS_ANALYTICS ).navigation( getContext() );
|
||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
mMogoFragmentManager = (IMogoFragmentManager) ARouter.getInstance()
|
||||
.build(MogoServicePaths.PATH_FRAGMENT_MANAGER)
|
||||
.navigation(getContext());
|
||||
mMogoAnalytics = (IMogoAnalytics) ARouter.getInstance()
|
||||
.build(MogoServicePaths.PATH_UTILS_ANALYTICS)
|
||||
.navigation(getContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openAppsPanel() {
|
||||
AppsListActivity.start( getActivity() );
|
||||
AppsListActivity.start(getActivity());
|
||||
}
|
||||
|
||||
private void trackNavigatorClickEvent( int type ) {
|
||||
final Map< String, Object > properties = new HashMap<>();
|
||||
properties.put( "type", type );
|
||||
mMogoAnalytics.track( "Launcher_APP_Icon", properties );
|
||||
private void trackNavigatorClickEvent(int type) {
|
||||
final Map<String, Object> properties = new HashMap<>();
|
||||
properties.put("type", type);
|
||||
mMogoAnalytics.track("Launcher_APP_Icon", properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -120,8 +168,27 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
if ( mPresenter != null ) {
|
||||
mPresenter.onDestroy( getViewLifecycleOwner() );
|
||||
if (mPresenter != null) {
|
||||
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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.mogo.module.apps.adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import com.mogo.module.apps.R;
|
||||
import com.mogo.module.apps.adapter.base.RecycleBaseAdapter;
|
||||
import com.mogo.module.apps.adapter.base.RecycleViewHolder;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author zyz
|
||||
* 2020-03-09.
|
||||
*/
|
||||
public class AppIndicatorAdapter extends RecycleBaseAdapter<Integer> {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public AppIndicatorAdapter(Context context, List<Integer> list
|
||||
) {
|
||||
super(context, list, R.layout.module_apps_item_app_indicator);
|
||||
}
|
||||
|
||||
@Override public int getItemCount() {
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
@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,122 @@
|
||||
package com.mogo.module.apps.adapter.base;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Title: adapter
|
||||
* </p>
|
||||
* <p>
|
||||
* Description:
|
||||
* </p>
|
||||
* <p>
|
||||
* Copyright: Copyright (c) 2015
|
||||
* </p>
|
||||
* <p>
|
||||
* </p>
|
||||
*/
|
||||
public abstract class RecycleBaseAdapter<T> extends
|
||||
RecyclerView.Adapter<RecycleViewHolder>
|
||||
{
|
||||
|
||||
protected Context context;
|
||||
protected List<T> list;
|
||||
private int resourceID;
|
||||
private Toast toast;
|
||||
|
||||
/**
|
||||
* @param context
|
||||
*/
|
||||
public RecycleBaseAdapter(Context context, List<T> list, int resourceID)
|
||||
{
|
||||
super();
|
||||
this.context = context;
|
||||
this.list = list;
|
||||
this.resourceID = resourceID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecycleViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
|
||||
{
|
||||
View v = LayoutInflater.from(context).inflate(resourceID, viewGroup,
|
||||
false);
|
||||
|
||||
RecycleViewHolder holder = RecycleViewHolder
|
||||
.get(v);
|
||||
|
||||
initHolder(holder);
|
||||
|
||||
return holder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(
|
||||
RecycleViewHolder viewHolder, int position)
|
||||
{
|
||||
onBindViewHolder(viewHolder, list.get(position % list.size()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount()
|
||||
{
|
||||
return list == null ? 0 : list.size();
|
||||
}
|
||||
|
||||
public abstract void onBindViewHolder(
|
||||
RecycleViewHolder holder, T t);
|
||||
|
||||
public void initHolder(RecycleViewHolder holder)
|
||||
{
|
||||
|
||||
}
|
||||
public void setDatas(List<T> list)
|
||||
{
|
||||
setDatas(list, false);
|
||||
}
|
||||
|
||||
public void setDatas(List<T> list, boolean add)
|
||||
{
|
||||
if (add)
|
||||
{
|
||||
this.list.addAll(list);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.list = list;
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
public void clear(){
|
||||
if (list != null) {
|
||||
list.clear();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
}
|
||||
public void messageShow(String mes)
|
||||
{
|
||||
if (toast==null){
|
||||
toast= Toast.makeText(context,mes, Toast.LENGTH_LONG);
|
||||
}
|
||||
else{
|
||||
toast.setText(mes);
|
||||
}
|
||||
toast.show();
|
||||
}
|
||||
|
||||
public T getItem(int position){
|
||||
if (list==null||list.size()==0){
|
||||
return null;
|
||||
}
|
||||
return list.get(position);
|
||||
}
|
||||
|
||||
public List<T> getList() {
|
||||
return list;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
package com.mogo.module.apps.adapter.base;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.text.SpannableString;
|
||||
import android.util.SparseArray;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
public class RecycleViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private SparseArray<View> mViews;
|
||||
|
||||
private View mConvertView;
|
||||
|
||||
public RecycleViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
this.mConvertView = itemView;
|
||||
mViews = new SparseArray<View>();
|
||||
// TODO Auto-generated constructor stub
|
||||
}
|
||||
|
||||
public static RecycleViewHolder get(View itemView) {
|
||||
return new RecycleViewHolder(itemView);
|
||||
}
|
||||
|
||||
public View getConvertView() {
|
||||
return mConvertView;
|
||||
}
|
||||
|
||||
public <T extends View> T getView(int viewId) {
|
||||
View view = mViews.get(viewId);
|
||||
if (view == null) {
|
||||
view = mConvertView.findViewById(viewId);
|
||||
mViews.put(viewId, view);
|
||||
}
|
||||
return (T) view;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @param text
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setText(int viewId, String text) {
|
||||
TextView tv = getView(viewId);
|
||||
if (tv==null)return this;
|
||||
tv.setText(text);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @param text
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setText(int viewId, SpannableString text) {
|
||||
TextView tv = getView(viewId);
|
||||
tv.setText(text);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @param resId
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setImageResource(int viewId, int resId) {
|
||||
ImageView view = getView(viewId);
|
||||
view.setImageResource(resId);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
|
||||
ImageView view = getView(viewId);
|
||||
view.setImageBitmap(bitmap);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @param resId
|
||||
* @return
|
||||
*/
|
||||
// public ViewHolder setImageURI(int viewId, String url) {
|
||||
// ImageView view = getView(viewId);
|
||||
// // ImageLoader.getInstance.loadImg(view,url);
|
||||
// return this;
|
||||
// }
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @param resId
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setBackgroundImage(int viewId, int resId) {
|
||||
View view = getView(viewId);
|
||||
view.setBackgroundResource(resId);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @param resId
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setTextColor(int viewId, int resId) {
|
||||
TextView view = getView(viewId);
|
||||
view.setTextColor(resId);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param viewId
|
||||
* @return
|
||||
*/
|
||||
public RecycleViewHolder setOnClickListener(int viewId,
|
||||
OnClickListener listener) {
|
||||
getView(viewId).setOnClickListener(listener);
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
BIN
modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_interest.png
Executable file
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
BIN
modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_media_center.png
Normal file → Executable file
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
BIN
modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_news.png
Executable file
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
BIN
modules/mogo-module-apps/src/main/res/drawable-xhdpi/module_apps_ic_tanlu.png
Executable file
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 4.6 KiB |
@@ -1,35 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<androidx.constraintlayout.widget.ConstraintLayout 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:gravity="bottom"
|
||||
android:paddingBottom="@dimen/module_apps_navigation_icon_paddingBottom">
|
||||
android:paddingBottom="@dimen/module_apps_navigation_icon_paddingBottom"
|
||||
>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/module_apps_id_navigation"
|
||||
android:layout_width="@dimen/module_apps_navigation_icon_width"
|
||||
android:layout_height="@dimen/module_apps_navigation_icon_height"
|
||||
android:src="@drawable/module_apps_ic_navigation" />
|
||||
<com.yarolegovich.discretescrollview.DiscreteScrollView
|
||||
android:id="@+id/module_apps_id_scroller"
|
||||
android:layout_width="@dimen/dp_523"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
android:layout_height="@dimen/module_apps_navigation_icon_container_height"
|
||||
>
|
||||
</com.yarolegovich.discretescrollview.DiscreteScrollView>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/module_apps_ic_media_center"
|
||||
android:layout_width="@dimen/module_apps_navigation_icon_width"
|
||||
android:layout_height="@dimen/module_apps_navigation_icon_height"
|
||||
android:layout_marginLeft="@dimen/module_apps_navigation_icon_marginLeft"
|
||||
android:src="@drawable/module_apps_ic_media_center" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/module_apps_ic_car_settings"
|
||||
android:layout_width="@dimen/module_apps_navigation_icon_width"
|
||||
android:layout_height="@dimen/module_apps_navigation_icon_height"
|
||||
android:layout_marginLeft="@dimen/module_apps_navigation_icon_marginLeft"
|
||||
android:src="@drawable/module_apps_ic_car_settings" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/module_apps_id_apps"
|
||||
android:layout_width="@dimen/module_apps_navigation_icon_width"
|
||||
android:layout_height="@dimen/module_apps_navigation_icon_height"
|
||||
android:layout_marginLeft="@dimen/module_apps_navigation_icon_marginLeft"
|
||||
android:src="@drawable/module_apps_ic_apps" />
|
||||
</LinearLayout>
|
||||
<ImageView
|
||||
android:id="@+id/module_apps_id_apps"
|
||||
android:layout_width="@dimen/module_apps_navigation_icon_width"
|
||||
android:layout_marginTop="@dimen/dp_18"
|
||||
android:layout_height="@dimen/module_apps_navigation_icon_height"
|
||||
app:layout_constraintLeft_toRightOf="@id/module_apps_id_scroller"
|
||||
app:layout_constraintTop_toTopOf="@id/module_apps_id_scroller"
|
||||
android:layout_marginLeft="@dimen/module_apps_navigation_icon_marginLeft"
|
||||
android:src="@drawable/module_apps_ic_apps"
|
||||
/>
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_marginLeft="@dimen/dp_37"
|
||||
app:layout_constraintLeft_toRightOf="@id/module_apps_id_scroller"
|
||||
app:layout_constraintTop_toBottomOf="@id/module_apps_id_apps"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="全部应用"
|
||||
android:maxLines="1"
|
||||
android:layout_marginTop="24px"
|
||||
android:textColor="#FFFFFFFF"
|
||||
android:textSize="26.25px"
|
||||
/>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="@dimen/dp_137"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center|bottom"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/module_apps_id_app_icon"
|
||||
android:layout_width="@dimen/dp_112"
|
||||
android:scaleType="fitXY"
|
||||
android:layout_height="@dimen/dp_112" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/module_apps_id_app_name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/dp_24"
|
||||
android:gravity="center"
|
||||
android:maxLines="1"
|
||||
android:textColor="#FFFFFF"
|
||||
android:textSize="@dimen/dp_26" />
|
||||
</LinearLayout>
|
||||
@@ -5,9 +5,9 @@
|
||||
<dimen name="module_apps_indicator_width">30px</dimen>
|
||||
<dimen name="module_apps_indicator_interval">4px</dimen>
|
||||
<dimen name="module_apps_indicator_marginBottom">103px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_width">120px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_height">120px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_marginLeft">60px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_width">94px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_height">94px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_marginLeft">43px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_paddingBottom">60px</dimen>
|
||||
<dimen name="module_apps_app_name_marginTop">32px</dimen>
|
||||
<dimen name="module_apps_app_name_textSize">32px</dimen>
|
||||
|
||||
@@ -14,4 +14,5 @@
|
||||
<dimen name="module_apps_page_paddingLeft">220px</dimen>
|
||||
<dimen name="module_apps_page_paddingRight">220px</dimen>
|
||||
<dimen name="module_apps_page_item_verticalSpacing">154px</dimen>
|
||||
<dimen name="module_apps_navigation_icon_container_height">174px</dimen>
|
||||
</resources>
|
||||
@@ -26,4 +26,10 @@ public interface MarkerPoiTypeEnum {
|
||||
public String FOURS_PONDING = "10008";
|
||||
//超市打折
|
||||
public String FOURS_SHOP_FREE = "10009";
|
||||
//浓雾
|
||||
public String FOURS_FOG = "10010";
|
||||
//结冰
|
||||
public String FOURS_ICE = "10011";
|
||||
//停车场
|
||||
public String FOURS_PARKING = "10012";
|
||||
}
|
||||
@@ -17,7 +17,9 @@ public class MarkerUserInfo implements Serializable {
|
||||
private Integer age;// 年龄段,可以为空,与车聊聊一致
|
||||
|
||||
// TODO V2X临时字段,接口出好后进行修改
|
||||
private String userDrivingLevel;//用户驾驶级别,老司机、安全驾驶、危险驾驶
|
||||
private String lastActiveweekAvgscore;//末次活跃周驾驶行为平均得分
|
||||
private String safeLabel;//车辆安全标签
|
||||
private int safeLabelType;//1老司机 2安全驾驶 3危险驾驶
|
||||
|
||||
public void setAge(Integer age) {
|
||||
this.age = age;
|
||||
@@ -153,12 +155,32 @@ public class MarkerUserInfo implements Serializable {
|
||||
this.userName = userName;
|
||||
}
|
||||
|
||||
public String getUserDrivingLevel() {
|
||||
return userDrivingLevel;
|
||||
public void setUserId(long userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public void setUserDrivingLevel(String userDrivingLevel) {
|
||||
this.userDrivingLevel = userDrivingLevel;
|
||||
public String getLastActiveweekAvgscore() {
|
||||
return lastActiveweekAvgscore;
|
||||
}
|
||||
|
||||
public void setLastActiveweekAvgscore(String lastActiveweekAvgscore) {
|
||||
this.lastActiveweekAvgscore = lastActiveweekAvgscore;
|
||||
}
|
||||
|
||||
public String getSafeLabel() {
|
||||
return safeLabel;
|
||||
}
|
||||
|
||||
public void setSafeLabel(String safeLabel) {
|
||||
this.safeLabel = safeLabel;
|
||||
}
|
||||
|
||||
public int getSafeLabelType() {
|
||||
return safeLabelType;
|
||||
}
|
||||
|
||||
public void setSafeLabelType(int safeLabelType) {
|
||||
this.safeLabelType = safeLabelType;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -170,7 +192,9 @@ public class MarkerUserInfo implements Serializable {
|
||||
", userHead='" + userHead + '\'' +
|
||||
", gender='" + gender + '\'' +
|
||||
", age=" + age +
|
||||
", userDrivingLevel='" + userDrivingLevel + '\'' +
|
||||
", lastActiveweekAvgscore='" + lastActiveweekAvgscore + '\'' +
|
||||
", safeLabel='" + safeLabel + '\'' +
|
||||
", safeLabelType=" + safeLabelType +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
|
||||
private IMogoStatusManager mMogoStatusManager;
|
||||
|
||||
private OrientedViewPager mCardsContainer;
|
||||
private VerticalStackTransformer mTransformer;
|
||||
//private VerticalStackTransformer mTransformer;
|
||||
private CardModulesAdapter mCardModulesAdapter;
|
||||
|
||||
private View mHeader;
|
||||
@@ -100,8 +100,8 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
|
||||
@Override
|
||||
protected void initViews() {
|
||||
mCardsContainer = findViewById( R.id.module_main_id_cards_container );
|
||||
mCardsContainer.setOrientation( OrientedViewPager.Orientation.VERTICAL );
|
||||
mTransformer = new VerticalStackTransformer( this );
|
||||
mCardsContainer.setOrientation( OrientedViewPager.Orientation.HORIZONTAL );
|
||||
//mTransformer = new VerticalStackTransformer( this );
|
||||
mCardsContainer.setOnPageChangeListener( mOnPageChangeListener = new OnPageChangeListenerAdapter() {
|
||||
private boolean mIsLast = true;
|
||||
private boolean mCardFlipStatus = false;
|
||||
@@ -134,7 +134,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
|
||||
}
|
||||
} else if ( state == ViewPager.SCROLL_STATE_IDLE ) {
|
||||
mCardFlipStatus = false;
|
||||
mTransformer.resetOffsetScroll();
|
||||
//mTransformer.resetOffsetScroll();
|
||||
}
|
||||
|
||||
int cardSize = mCardModulesAdapter.getCount();
|
||||
@@ -159,7 +159,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
|
||||
int positionOffsetPixels ) {
|
||||
super.onPageScrolled( position, positionOffset, positionOffsetPixels );
|
||||
Logger.d( TAG, "pageScrolled : offset --- " + positionOffset );
|
||||
mTransformer.offsetScrollChanged( positionOffset );
|
||||
//mTransformer.offsetScrollChanged( positionOffset );
|
||||
}
|
||||
} );
|
||||
|
||||
@@ -299,7 +299,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
|
||||
List< IMogoModuleProvider > providers = mMogoModuleHandler.loadCardsModule();
|
||||
mCardModulesAdapter = new CardModulesAdapter( this, providers );
|
||||
mCardsContainer.setOffscreenPageLimit( providers.size() );
|
||||
mCardsContainer.setPageTransformer( true, mTransformer );
|
||||
//mCardsContainer.setPageTransformer( true, mTransformer );
|
||||
mCardsContainer.setAdapter( mCardModulesAdapter );
|
||||
|
||||
mCardCoverUpBottomLayout.setVisibility( View.VISIBLE );
|
||||
|
||||
BIN
modules/mogo-module-main/src/main/res/drawable-xhdpi/module_apps_bg_card.png
Executable file
|
After Width: | Height: | Size: 60 KiB |
@@ -37,14 +37,18 @@
|
||||
android:layout_marginLeft="@dimen/module_main_card_container_marginLeft"
|
||||
android:layout_marginTop="@dimen/module_main_card_container_marginTop">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:src="@drawable/module_apps_bg_card"
|
||||
android:layout_height="@dimen/dp_797"/>
|
||||
<com.mogo.module.main.cards.OrientedViewPager
|
||||
android:id="@+id/module_main_id_cards_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/module_main_card_container_height"
|
||||
android:layout_marginBottom="@dimen/module_main_card_container_marginBottom"
|
||||
android:layout_marginLeft="@dimen/dp_30"
|
||||
android:layout_marginRight="@dimen/dp_30"
|
||||
android:layout_height="@dimen/dp_600"
|
||||
android:clipToPadding="false"
|
||||
android:overScrollMode="never"
|
||||
android:paddingBottom="@dimen/module_main_card_container_paddingBottom" />
|
||||
android:overScrollMode="never" />
|
||||
|
||||
<!-- 应用入口-->
|
||||
<FrameLayout
|
||||
@@ -57,12 +61,12 @@
|
||||
<FrameLayout
|
||||
android:id="@+id/module_main_id_card_cover_up_bottom"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="20px"
|
||||
android:layout_marginLeft="15px"
|
||||
android:layout_marginTop="@dimen/module_main_card_cover_up_margin"
|
||||
android:layout_marginRight="15px"
|
||||
android:layout_height="@dimen/dp_26"
|
||||
android:layout_marginTop="@dimen/dp_600"
|
||||
android:layout_marginLeft="@dimen/dp_64"
|
||||
android:layout_marginRight="@dimen/dp_64"
|
||||
android:background="@drawable/module_main_card_cover_up_bottom"
|
||||
android:visibility="gone" />
|
||||
/>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
||||