应用指示器横滑效果

This commit is contained in:
zhangyuanzhen
2020-03-09 17:24:40 +08:00
parent 9175af2cfc
commit f72921497e
6 changed files with 419 additions and 72 deletions

View File

@@ -3,12 +3,17 @@ 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.LaunchUtils;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.service.MogoServicePaths;
@@ -18,6 +23,7 @@ import com.mogo.service.fragmentmanager.IMogoFragmentManager;
import com.mogo.service.module.IMogoModuleProvider;
import com.mogo.utils.TipToast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@@ -27,11 +33,9 @@ import java.util.Map;
* <p>
* 描述
*/
public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavigatorPresenter > implements AppNavigatorView {
public class AppNavigatorFragment extends MvpFragment<AppNavigatorView, AppNavigatorPresenter>
implements AppNavigatorView {
private View mNavigation;
private View mMediaCenter;
private View mCarSettings;
private View mApps;
private IMogoFragmentManager mMogoFragmentManager;
@@ -42,6 +46,7 @@ public class AppNavigatorFragment extends MvpFragment< AppNavigatorView, AppNavi
private IMogoModuleProvider mSearchProvider;
private IMogoAnalytics mMogoAnalytics;
private RecyclerView scroller;
@Override
protected int getLayoutId() {
@@ -51,66 +56,100 @@ 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);
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_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);
//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 +159,8 @@ 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());
}
}
}

View File

@@ -0,0 +1,32 @@
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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}