1. <RelativeLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <androidx.viewpager.widget.ViewPager
  6. android:id="@+id/vp_guide"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent">
  9. </androidx.viewpager.widget.ViewPager>
  10.  
  11.  
  12.  
  13. <RelativeLayout
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_alignParentBottom="true"
  17. android:layout_centerHorizontal="true"
  18. android:layout_marginBottom="30dip">
  19.  
  20. <LinearLayout
  21. android:id="@+id/ll_guide_points"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:orientation="horizontal">
  25. </LinearLayout>
  26.  
  27. <View
  28. android:id="@+id/v_guide_redpoint"
  29. android:layout_width="10px"
  30. android:layout_height="10px"
  31. android:background="@drawable/shap"/>
  32.  
  33. </RelativeLayout>
  34.  
  35. </RelativeLayout>
  1. public class MyAdapter extends PagerAdapter {
  2. private List<ImageView> mGuids;
  3. public MyAdapter(Context ctx, List<ImageView> guids) {
  4. this.mGuids = guids;
  5. }
  6. @Override
  7. public int getCount() {
  8. return mGuids.size();// 返回数据的个数
  9. }
  10. @Override
  11. public boolean isViewFromObject(View arg0, Object arg1) {
  12. return arg0 == arg1;// 过滤和缓存的作用
  13. }
  14. @Override
  15. public void destroyItem(ViewGroup container, int position, Object object) {
  16. container.removeView((View) object);//从viewpager中移除掉
  17. }
  18. @Override
  19. public Object instantiateItem(ViewGroup container, int position) {
  20. // container viewpaper
  21. //获取View
  22. View child = mGuids.get(position);
  23. // 添加View
  24. container.addView(child);
  25. return child;
  26. }
  27. }
  1. public class MainActivity extends AppCompatActivity {
  2. private ViewPager mVp_Guide;
  3. private View mGuideRedPoint;
  4. private LinearLayout mLlGuidePoints;
  5. private int[] mPics = new int[]{R.drawable.lunch1, R.drawable.lunch2, R.drawable.lunch3, R.drawable.lunch4};
  6. private View v_point;
  7. private int disPoints;
  8. private int currentItem;
  9. private MyAdapter adapter;
  10. private List<ImageView> guids;
  11. private int width;
  12. @Override
  13. protected void onCreate(@Nullable Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. // UIUtils.init(getApplicationContext());
  17. WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
  18. //获取屏幕的宽度
  19. Point size = new Point();
  20. windowManager.getDefaultDisplay().getSize(size);
  21. width = size.x;
  22. initView();
  23. initData();
  24. initEvent();
  25. }
  26. private void initView() {
  27. mVp_Guide = (ViewPager) findViewById(R.id.vp_guide);
  28. mGuideRedPoint = findViewById(R.id.v_guide_redpoint);
  29. mLlGuidePoints = (LinearLayout) findViewById(R.id.ll_guide_points);
  30. }
  31. private void initData() {
  32. // viewpaper adapter适配器
  33. guids = new ArrayList<ImageView>();
  34. //创建viewpager的适配器
  35. for (int i = 0; i < mPics.length; i++) {
  36. ImageView iv_temp = new ImageView(getApplicationContext());
  37. iv_temp.setBackgroundResource(mPics[i]);
  38. //添加界面的数据
  39. guids.add(iv_temp);
  40. //灰色的点在LinearLayout中绘制:
  41. //获取点
  42. v_point = new View(getApplicationContext());
  43. v_point.setBackgroundResource(R.drawable.shap2);//灰点背景色
  44. //设置灰色点的显示大小
  45. LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(10, 10);
  46. //设置点与点的距离,第一个点除外
  47. if (i != 0)
  48. params.leftMargin = 47;
  49. v_point.setLayoutParams(params);
  50. mLlGuidePoints.addView(v_point);
  51. }
  52. // 创建viewpager的适配器
  53. adapter = new MyAdapter(getApplicationContext(), guids);
  54. // 设置适配器
  55. mVp_Guide.setAdapter(adapter);
  56. }
  57. private void initEvent() {
  58. //监听界面绘制完成
  59. mGuideRedPoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  60. @Override
  61. public void onGlobalLayout() {
  62. //取消注册界面而产生的回调接口
  63. mGuideRedPoint.getViewTreeObserver().removeGlobalOnLayoutListener(this);
  64. //计算点于点之间的距离
  65. disPoints = (mLlGuidePoints.getChildAt(1).getLeft() - mLlGuidePoints.getChildAt(0).getLeft());
  66. }
  67. });
  68. //滑动事件监听滑动距离,点更随滑动。
  69. mVp_Guide.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  70. @Override
  71. public void onPageSelected(int position) {
  72. /* //当前viewpager显示的页码
  73. //如果viewpager滑动到第三页码(最后一页),显示进入的button
  74. if (position == guids.size() - 1) {
  75. bt_startExp.setVisibility(View.VISIBLE);//设置按钮的显示
  76. } else {
  77. //隐藏该按钮
  78. bt_startExp.setVisibility(View.GONE);
  79. }*/
  80. currentItem = position;
  81. }
  82. /**
  83. *页面滑动调用,拿到滑动距离设置视图的滑动状态
  84. * @param position 当前页面位置
  85. * @param positionOffset 移动的比例值
  86. * @param positionOffsetPixels 便宜的像素
  87. */
  88. @Override
  89. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  90. //计算红点的左边距
  91. float leftMargin = disPoints * (position + positionOffset);
  92. //设置红点的左边距
  93. RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mGuideRedPoint.getLayoutParams();
  94. //对folat类型进行四舍五入,
  95. layoutParams.leftMargin = Math.round(leftMargin);
  96. //设置位置
  97. mGuideRedPoint.setLayoutParams(layoutParams);
  98. }
  99. @Override
  100. public void onPageScrollStateChanged(int state) {
  101. }
  102. });
  103. //给页面设置触摸事件
  104. mVp_Guide.setOnTouchListener(new View.OnTouchListener() {
  105. float startX;
  106. float endX;
  107. @Override
  108. public boolean onTouch(View v, MotionEvent event) {
  109. switch (event.getAction()) {
  110. case MotionEvent.ACTION_DOWN:
  111. startX = event.getX();
  112. break;
  113. case MotionEvent.ACTION_UP:
  114. endX = event.getX();
  115. //首先要确定的是,是否到了最后一页,然后判断是否向左滑动,并且滑动距离是否符合,我这里的判断距离是屏幕宽度的4分之一(这里可以适当控制)
  116. if (currentItem == (guids.size() - 1) && startX - endX >= (width / 4)) {
  117. Toast.makeText( MainActivity.this, "跳转", Toast.LENGTH_SHORT ).show();
  118. //进入主页
  119. // Intent intent = new Intent(MainActivity.this, Main2Activity.class);
  120. // startActivity(intent);
  121. // //这部分代码是切换Activity时的动画,看起来就不会很生硬
  122. // overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
  123. // finish();
  124. }
  125. break;
  126. }
  127. return false;
  128. }
  129. });
  130. }
  131. @Override
  132. public boolean onKeyDown(int keyCode, KeyEvent event) {
  133. return true;
  134. }
  135. }
  1. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:shape="oval">
  3.  
  4.  
  5. <corners android:radius="10dp"/>
  6. <solid android:color="#e7e7e7"/>
  7. <size android:width="10px"
  8. android:height="10px"/>
  9.  
  10.  
  11.  
  12.  
  13. </shape>
  1. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:shape="oval">
  3. <corners android:radius="10dp"/>
  4. <solid android:color="#FF393939"/>
  5. <size android:width="10px"
  6. android:height="10px"/>
  7.  
  8.  
  9. </shape>

 

版权声明:本文为Ocean123123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Ocean123123/p/13894988.html