经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android利用ViewPager实现带小圆球的图片滑动
来源:jb51  时间:2018/11/25 19:39:00  对本文有异议

在上文实现的带小圆球的图片滑动的通用性较好,但是较复杂。

现在也是利用 ViewPager ,但是却没有利用 ShapeDrawable 来实现带小圆球的图片滑动。如有些播放器一样,在开始安装 app 时,都会出现引导界面,然后才进入主界面,但是在重新启动 app 时却不会再出现该引导界面。

下面实现的就是该类似的功能,只是把引导界面都做成了图片显示,这样更能够体现不同的做法(和上一篇博客)。

本例主要主要:在小圆点的绘制和 viewpager 相关联起来。

如下效果:

MyPagerAdapter主要用于创建适配器;

MyPagerAdapter.java  :

  1. package com.android.circleforimage;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.app.FragmentManager;
  7. import android.support.v4.app.FragmentPagerAdapter;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.view.ViewGroup;
  12. import android.widget.Button;
  13. import android.widget.ImageView;
  14. public class MyPagerAdapter extends FragmentPagerAdapter {
  15. private static Activity activity;
  16. private static final int[] IMAGES = { R.drawable.x01, R.drawable.x02,
  17. R.drawable.x03, R.drawable.x04, R.drawable.x05 };
  18. public static int sum = IMAGES.length;
  19. public MyPagerAdapter(FragmentManager fm) {
  20. super(fm);
  21. }
  22. /**
  23. * 为了获得 MainActivity 中的 activity
  24. */
  25. public void setForActivity(Activity activity) {
  26. this.activity = activity;
  27. }
  28. public Activity getForActivity() {
  29. return activity;
  30. }
  31. @Override
  32. public int getCount() {
  33. return IMAGES.length;
  34. }
  35. @Override
  36. public Fragment getItem(final int position) {
  37. return MyFragment.newInstance(position);
  38. }
  39. public static class MyFragment extends Fragment {
  40. private int mBaseIndex;
  41. // 使用工厂模式创建 Fragment
  42. static MyFragment newInstance(int baseIndex) {
  43. MyFragment fragment = new MyFragment();
  44. fragment.setBaseIndex(baseIndex);
  45. return fragment;
  46. }
  47. public MyFragment() {
  48. super();
  49. }
  50. @Override
  51. public void onCreate(Bundle savedInstanceState) {
  52. super.onCreate(savedInstanceState);
  53. }
  54. @Override
  55. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  56. Bundle savedInstanceState) {
  57. // 最后一张图片上有 button 按钮
  58. if (getBaseIndex() == IMAGES.length - 1) {
  59. return initForButton(inflater);
  60. } else {
  61. return showImages(inflater);
  62. }
  63. }
  64. /**
  65. * 在全局列表中保存一个索引,记录页面开始的地方
  66. */
  67. public void setBaseIndex(int index) {
  68. mBaseIndex = index;
  69. }
  70. /**
  71. * 在全局列表中检索索引,可以找到页面开始的地方
  72. */
  73. public int getBaseIndex() {
  74. return mBaseIndex;
  75. }
  76. public View initForButton(LayoutInflater inflater){
  77. View view = inflater.inflate(R.layout.item_two, null);
  78. Button button = (Button) view.findViewById(R.id.button);
  79. button.setOnClickListener(new OnClickListener() {
  80. @Override
  81. public void onClick(View v) {
  82. Intent intent = new Intent(activity,
  83. SecondActivity.class);
  84. startActivity(intent);
  85. activity.finish();
  86. }
  87. });
  88. return view;
  89. }
  90. public View showImages(LayoutInflater inflater){
  91. View view = inflater.inflate(R.layout.item_one, null);
  92. ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
  93. imageView.setImageResource(IMAGES[getBaseIndex()]);
  94. imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  95. return view;
  96. }
  97. }
  98. }

Circle 类主要用于绘制小圆球:

Circle.java :

  1. package com.android.circleforimage;
  2. import android.content.Context;
  3. import android.graphics.Canvas;
  4. import android.graphics.Color;
  5. import android.graphics.Paint;
  6. import android.util.AttributeSet;
  7. import android.view.View;
  8. public class Circle extends View {
  9. private Paint paint;
  10. private int radius = 16;
  11. // 页数和小圆球的数量相等
  12. private int count = MyPagerAdapter.sum;
  13. // 被选中的位置
  14. private int choosePosition = 0;
  15. // 两个小圆之间的中心距
  16. private int gap = 70;
  17. /**
  18. * 共外部的类调用
  19. */
  20. public void choose(int pos) {
  21. choosePosition = pos;
  22. // 通知重绘
  23. this.invalidate();
  24. }
  25. public Circle(Context context) {
  26. this(context, null);
  27. }
  28. public Circle(Context context, AttributeSet attrs) {
  29. this(context, attrs, 0);
  30. }
  31. public Circle(Context context, AttributeSet attrs, int defStyleAttr) {
  32. super(context, attrs, defStyleAttr);
  33. paint = new Paint();
  34. paint.setAntiAlias(true);
  35. }
  36. @Override
  37. protected void onDraw(Canvas canvas) {
  38. super.onDraw(canvas);
  39. int width = getWidth();
  40. int height = getHeight();
  41. // 居中显示时,小圆球的起始位置
  42. int startPx = (width - (count - 1) * gap) / 2;
  43. for (int i = 0; i < count; i++) {
  44. if (choosePosition == i) {
  45. paint.setColor(Color.RED);
  46. canvas.drawCircle(startPx + i * gap, height - 50, radius + 4,
  47. paint);
  48. } else {
  49. paint.setColor(Color.WHITE);
  50. canvas.drawCircle(startPx + i * gap, height - 50, radius, paint);
  51. }
  52. }
  53. }
  54. }

MainActivity.java :

  1. package com.android.circleforimage;
  2. import com.android.circleforimageutils.Words;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.os.Bundle;
  7. import android.preference.PreferenceManager;
  8. import android.support.v4.app.FragmentActivity;
  9. import android.support.v4.view.ViewPager;
  10. import android.view.Window;
  11. import android.view.WindowManager;
  12. public class MainActivity extends FragmentActivity {
  13. private ViewPager viewPager;
  14. private MyPagerAdapter mAdapter;
  15. private Circle circle;
  16. private Activity activity = null;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. initActivity();
  21. setContentView(R.layout.activity_main);
  22. activity = this;
  23. showForSecondActivity();
  24. viewPager = (ViewPager) findViewById(R.id.viewPager);
  25. circle = (Circle) findViewById(R.id.circle);
  26. scrollPager();
  27. mAdapter = new MyPagerAdapter(getSupportFragmentManager());
  28. /* 调用 MyPagerAdapter 的方法*/
  29. mAdapter.setForActivity(activity);
  30. viewPager.setAdapter(mAdapter);
  31. }
  32. /**
  33. * 对界面的处理
  34. */
  35. private void initActivity() {
  36. // 去标题
  37. requestWindowFeature(Window.FEATURE_NO_TITLE);
  38. // 全屏
  39. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  40. WindowManager.LayoutParams.FLAG_FULLSCREEN);
  41. }
  42. /**
  43. * 第一次安装启动时,会加载开始的页面,第二次启动时,会跳过加载页面
  44. */
  45. private void showForSecondActivity() {
  46. // PreferenceManager:Used to help create Preference hierarchies from activities or XML.
  47. SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
  48. SharedPreferences.Editor editor = mSharedPreferences.edit();
  49. boolean b = mSharedPreferences.getBoolean(Words.KEY_ONE, true);
  50. if (b) {
  51. editor.putBoolean(Words.KEY_ONE, false);
  52. editor.commit();
  53. } else {
  54. Intent intent = new Intent(this, SecondActivity.class);
  55. startActivity(intent);
  56. finish();
  57. }
  58. }
  59. /**
  60. * viewPager 滚动时,提示 Circle 类重绘
  61. */
  62. private void scrollPager() {
  63. viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
  64. @Override
  65. public void onPageSelected(int position) {
  66. super.onPageSelected(position);
  67. circle.choose(position);
  68. }
  69. });
  70. }
  71. }

另外新建一个常量类 Words,用于存放存量,不在一个包中;

Words.java :

  1. package com.android.circleforimageutils;
  2. public class Words {
  3. public static String KEY_ONE = "key_for_main";
  4. }

SecondActivity.java :

  1. package com.android.circleforimage;
  2. import android.app.Activity;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.view.Gravity;
  6. import android.widget.TextView;
  7. public class SecondActivity extends Activity{
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. TextView textView = new TextView(this);
  12. textView.setText("欢迎来到我的博客:\n http://blog.csdn.net/antimage08");
  13. textView.setTextSize(25);
  14. textView.setTextColor(Color.BLUE);
  15. textView.setGravity(Gravity.CENTER);
  16. setContentView(textView);
  17. }
  18. }

activity_main.xml (一般情况下,有 viewpager 和其他占界面较少的组件一起时,效果和本例相似时,可以选用 FrameLayout):

  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="com.android.circleforimage.MainActivity" >
  7. <android.support.v4.view.ViewPager
  8. android:id="@+id/viewPager"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent" />
  11. <com.android.circleforimage.Circle
  12. android:id="@+id/circle"
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent"/>
  15. </FrameLayout>

item_one.xml :

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <ImageView
  7. android:id="@+id/imageView"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. />
  11. </LinearLayout>

item_two.xml (ImageView 中 src 指定的是用于在有 button 按钮时有图片显示才加载的,在代码中没有添加有 button 按钮界面时的图片) :

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <ImageView
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:src="@drawable/x05"/>
  10. <Button
  11. android:id="@+id/button"
  12. android:layout_alignParentBottom="true"
  13. android:layout_alignParentRight="true"
  14. android:text="点击进入"
  15. android:textSize="20sp"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"/>
  18. </RelativeLayout>

最后不能忘了在 AndroidManifest.xml 中为 SecondActivity 注册,最好在刚刚建好该类时就注册,这样不易遗忘:

  1. <activity android:name=".SecondActivity" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号