在fragment里面的splash界面
来源:互联网 发布:服装数据分析文字 编辑:程序博客网 时间:2024/06/06 20:18
1、写这个文章的原因是我在写一个自己的自定义的轮播图的时候呢和通用的那个容器activity的shihou,想到了将主界面的MainActivity里面放两个fragment,一个是splashFragment,一个是正常使用的界面,但是使用界面里面又嵌套了fragment。
2、splashFragment里面放的是一个我自定义的viewPager,然后监听,当前是最后一个viewPager的页面的时候,通过手势识别来判断如果是从右往左滑动的时候就进入到使用界面。我这个不是通过手势识别器来做的,因为手势识别器 我TM没有做出来,然后我做的原理是:当当前显示的界面是最后一个界面,我就对整个、viewpager做监听,如果手指松开的位置比按下的位置小(按下的位置在松开位置的右边,也就是从右往左滑动)与一定的距离,那么我就让整个fragment替换掉并存一个布尔值到sp里面。但是这样会出现一个问题,因为这个时候我已经对viewpager进行了监听,那么用户如果从左往右滑动,也就是用户想回到前面一个界面,这个时候由于我进行了监听,所以就不可以往回走了。于是我机制的又做了一个判断,那就是当用户的松开的位置比按下的位置小于一定的位置的时候,我就认为用户想看上一个界面,但是系统又灭有提供移除onTouchEventListener的方法,所以我就再次添加一个监听,不过传进去的是null,那么就相当于是移除监听了,并且还让viewpager显示当前界面的前面一个界面position -1 。这样就基本实现了我的需求了,但是有一个小小的不足,我懒得去完成了,希望大家来补充:那就是我在最后一个面移除监听的时候并且显示上一个界面,是viewpager.setCurrentItem(position),这样是可以回到上一个界面,但是没有动画,会明显感觉到时跳回去的,希望大家提供意见,补充动画完整。。。。。
3、我后来想了想,这个splash界面的viewpager跟普通的轮播图还不能用同一个自定义控件,因为splash的轮播图里面的监听与普通的轮播的监听有重合的地方,如果判断来源的话,就不能很好的解耦了。除非用户抽取成一个通用的,但是我觉得没有必要。还不如直接就用两个算了,一个是splash界面的轮播图,一个其他的通用的轮播图。这两个我都有写,那一篇博客名字叫《万能的轮播图》http://blog.csdn.net/qq_34723470/article/details/53159046。
贴代码啦:
自定义的轮播图代码:
public class CustomViewPager extends FrameLayout { @BindView(R.id.custom_viewpager) ViewPager viewPager; @BindView(R.id.custom_points) LinearLayout customPoints; private List<String> picUrls; private int x1; private int x2; public CustomViewPager(Context context) { this(context, null); } public CustomViewPager(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomViewPager(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { View.inflate(getContext(), R.layout.custom_viewpager, this); ButterKnife.bind(this); } /** * 传递数据的接口 * * @param picUrls */ public void setData(List<String> picUrls, FinishSplashListener listener) { this.listener = listener; this.picUrls = picUrls; viewPager.setAdapter(mPageAdapter); addPoints(); if (picUrls == null) { return; } viewPager.addOnPageChangeListener(mOnPageChangeListener); mOnPageChangeListener.onPageSelected(0); } private void addPoints() { customPoints.removeAllViews(); if (picUrls == null) return; for (String picUrl : picUrls) { ImageView point = new ImageView(getContext()); point.setBackgroundResource(R.drawable.points_bg_normal); customPoints.addView(point); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) point.getLayoutParams(); params.leftMargin = 10; params.width = 10; params.height = 10; } } private ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(final int position) { if (picUrls == null) { return; } else { for (int i = 0; i < picUrls.size(); i++) { if (i == position % picUrls.size()) { customPoints.getChildAt(i).setBackgroundResource(R.drawable.points_bg_select); } else { customPoints.getChildAt(i).setBackgroundResource(R.drawable.points_bg_normal); } } if (position == picUrls.size() - 1) { viewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { x1 = (int) event.getX(); } if (event.getAction() == MotionEvent.ACTION_UP) { x2 = (int) event.getX(); if (x1 - x2 > 150) { //从右往左划 Toast.makeText(getContext(), "55", Toast.LENGTH_SHORT).show(); viewPager.setOnTouchListener(null); if (listener != null) { Toast.makeText(getContext(), "2", Toast.LENGTH_SHORT).show(); listener.go2MainUseFragment(); } } if (x2 - x1 > 150) { //从左往右划 viewPager.setOnTouchListener(null); viewPager.setCurrentItem(position - 1); } } return true; } }); } } } }; private PagerAdapter mPageAdapter = new PagerAdapter() { List<ImageView> imageViews = new ArrayList<>(); @Override public int getCount() { return picUrls == null ? 0 : picUrls.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { if (imageViews.isEmpty()) { ImageView imageView = new ImageView(container.getContext()); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageViews.add(imageView); } ImageView imageView = imageViews.remove(0); Glide .with(container.getContext()) .load(picUrls.get(position % picUrls.size())) .error(R.mipmap.ic_launcher) .placeholder(R.mipmap.ic_launcher) .into(imageView); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { imageViews.add((ImageView) object); container.removeView((View) object); } }; @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } private FinishSplashListener listener; public interface FinishSplashListener { void go2MainUseFragment(); }}
自定义轮播图的xml ===>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/custom_viewpager" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/custom_points" android:layout_width="match_parent" android:layout_height="10dp" android:layout_alignParentBottom="true" android:gravity="center_horizontal" android:orientation="horizontal" android:layout_marginBottom="10dp"> </LinearLayout></RelativeLayout>
圆点背景xml==》
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#e60a11"/></shape>
MainActivity代码===》
public class MainActivity extends AppCompatActivity { @BindView(R.id.activity_replace) FrameLayout replaceLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); FragmentTransaction transaction = getFragmentManager().beginTransaction(); if (getSharedPreferences("config", MODE_PRIVATE).getBoolean("isFirstUse", false)) { transaction.replace(R.id.activity_replace, new MainUseFragment()).commit(); } else { transaction.replace(R.id.activity_replace, new SplashFragment()).commit(); } }}
mainActivity的xml==>
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_replace" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"></FrameLayout>
splashFragment的代码 ===》
public class SplashFragment extends Fragment { private Unbinder unbinder; private List<String> picUrls = new ArrayList<>(); private GestureDetector detector; @BindView(R.id.splash_vp) CustomViewPager viewPager; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_splash, null); unbinder = ButterKnife.bind(this, view); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); picUrls.add("132"); picUrls.add("132"); picUrls.add("132"); picUrls.add("132"); picUrls.add("132"); viewPager.setData(picUrls, new CustomViewPager.FinishSplashListener() { @Override public void go2MainUseFragment() {FragmentTransaction transaction = getFragmentManager(). beginTransaction();transaction.setCustomAnimations(R.animator.slide_in, R.animator.slide_out);//前面那个指的是欢迎界面,后面的是使用界面transaction.replace(R.id.activity_replace, new MainUseFragment()) .commit();getActivity(). getSharedPreferences("config", Context.MODE_PRIVATE). edit(). putBoolean("isFirstUse", true). commit();getActivity().getSharedPreferences("config", Context.MODE_PRIVATE).edit().putBoolean("isFirstUse", true).commit(); } }); } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); }}
动画的xml=========>slide in:在res/animator
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="@android:integer/config_mediumAnimTime" android:interpolator="@android:interpolator/decelerate_quint" android:propertyName="translationX" android:valueFrom="100" android:valueTo="0" android:valueType="floatType" /> <objectAnimator android:duration="@android:integer/config_mediumAnimTime" android:interpolator="@android:interpolator/decelerate_quint" android:propertyName="alpha" android:valueFrom="0.0" android:valueTo="1.0" android:valueType="floatType" /></set>
slide out===>
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="@android:integer/config_mediumAnimTime" android:interpolator="@android:interpolator/decelerate_quint" android:propertyName="translationX" android:valueFrom="0" android:valueTo="-100" android:valueType="floatType" /> <objectAnimator android:duration="@android:integer/config_mediumAnimTime" android:interpolator="@android:interpolator/decelerate_quint" android:propertyName="alpha" android:valueFrom="1.0" android:valueTo="0.0" android:valueType="floatType" /></set>
splashFragment的xml == >
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <shen.da.ye.commonsplashactivity.CustomViewPager android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/splash_vp"></shen.da.ye.commonsplashactivity.CustomViewPager></RelativeLayout>
这里值得一说的是,我讲欢迎界面和使用界面放在了同一个activity里面,只不过程序运行的时候回去读sp的值,判断是不是第一次运行,如果是第一次运行的话就显示splashFragment,如果不是第一次的话就直接进入使用界面。这样我整个程序就只有两个activity,MainActivity里面存放的是主界面和欢迎界面,然后还有一个容器activity里面存放的是从主界面跳转出去的所有其他界面。
使用的主界面代码:
public class MainUseFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, null); return view; }}
使用的主界面的xml===>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"><TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="这是使用界面" android:textSize="50dp" android:gravity="center"/></LinearLayout>
- 在fragment里面的splash界面
- Splash界面的实现
- 应用程序的splash界面
- 在fragment里面嵌套fragment
- 如何制作带有SPLASH界面的程序
- 手机卫士2---splash界面的作用
- 冷启动!Splash界面的秒开
- Android的Splash界面支持用户点击
- 在 fragment 里面调用 findViewById
- 在 fragment 里面调用 findViewById
- 在 fragment 里面调用 findViewById
- 怎么在viewpager中获取子fragment里面的控件
- 计算在每个Fragment里面的耗时时长
- 在viewpager的fragment里面填一个fragment里的RecyleView的点击事件
- Android在Adapter里面调用Activity或者fragment里面的的方法/变量代码
- 加载和刷新的在主界面里面
- Splash界面简单实现
- splash 启动界面
- spring学习历程---spring基础总结
- Mysql主从复制、读写分离+MyCat数据库中间件
- sql分析
- [Android 之美] 那些你不知道的APK 瘦身,让你的APK更小
- 开启 ssh 的 root 登录
- 在fragment里面的splash界面
- lua环境安装
- iOS侧滑效果Demo
- python技巧(一)
- ruby语言学习
- 类的加载顺序,初始化块
- Sublime使用MarkDown
- 1093. Count PAT's (25)
- NOIP11.14 score DP