Android利用ViewPager实现带小圆球的图片滑动

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

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

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

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

如下效果:

MyPagerAdapter主要用于创建适配器;

MyPagerAdapter.java  :

package com.android.circleforimage;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;

public class MyPagerAdapter extends FragmentPagerAdapter {

 private static Activity activity;

 private static final int[] IMAGES = { R.drawable.x01, R.drawable.x02,
 R.drawable.x03, R.drawable.x04, R.drawable.x05 };
 public static int sum = IMAGES.length;

 public MyPagerAdapter(FragmentManager fm) {
 super(fm);
 }

 /**
 * 为了获得 MainActivity 中的 activity
 */
 public void setForActivity(Activity activity) {
 this.activity = activity;
 }

 public Activity getForActivity() {
 return activity;
 }

 @Override
 public int getCount() {
 return IMAGES.length;
 }

 @Override
 public Fragment getItem(final int position) {
 return MyFragment.newInstance(position);
 }

 public static class MyFragment extends Fragment {

 private int mBaseIndex;

 // 使用工厂模式创建 Fragment
 static MyFragment newInstance(int baseIndex) {
 MyFragment fragment = new MyFragment();
 fragment.setBaseIndex(baseIndex);
 return fragment;
 }

 public MyFragment() {
 super();
 }

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 }

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
 Bundle savedInstanceState) {
 // 最后一张图片上有 button 按钮
 if (getBaseIndex() == IMAGES.length - 1) {
 return initForButton(inflater);
 } else {
 return showImages(inflater);
 }
 }

 /**
 * 在全局列表中保存一个索引,记录页面开始的地方
 */
 public void setBaseIndex(int index) {
 mBaseIndex = index;
 }

 /**
 * 在全局列表中检索索引,可以找到页面开始的地方
 */
 public int getBaseIndex() {
 return mBaseIndex;
 }

 public View initForButton(LayoutInflater inflater){

 View view = inflater.inflate(R.layout.item_two, null);

 Button button = (Button) view.findViewById(R.id.button);
 button.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View v) {
  Intent intent = new Intent(activity,
  SecondActivity.class);
  startActivity(intent);
  activity.finish();
 }
 });
 return view;
 }

 public View showImages(LayoutInflater inflater){
 View view = inflater.inflate(R.layout.item_one, null);
 ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
 imageView.setImageResource(IMAGES[getBaseIndex()]);
 imageView.setScaleType(ImageView.ScaleType.FIT_XY);

 return view;
 }
 }

}

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

Circle.java :

package com.android.circleforimage;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class Circle extends View {

 private Paint paint;

 private int radius = 16;
 // 页数和小圆球的数量相等
 private int count = MyPagerAdapter.sum;
 // 被选中的位置
 private int choosePosition = 0;
 // 两个小圆之间的中心距
 private int gap = 70;

 /**
 * 共外部的类调用
 */
 public void choose(int pos) {
 choosePosition = pos;
 // 通知重绘
 this.invalidate();
 }

 public Circle(Context context) {
 this(context, null);
 }

 public Circle(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }

 public Circle(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);

 paint = new Paint();
 paint.setAntiAlias(true);
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);

 int width = getWidth();
 int height = getHeight();
 // 居中显示时,小圆球的起始位置
 int startPx = (width - (count - 1) * gap) / 2;

 for (int i = 0; i < count; i++) {
 if (choosePosition == i) {
 paint.setColor(Color.RED);
 canvas.drawCircle(startPx + i * gap, height - 50, radius + 4,
  paint);
 } else {
 paint.setColor(Color.WHITE);
 canvas.drawCircle(startPx + i * gap, height - 50, radius, paint);
 }
 }
 }
}

MainActivity.java :

package com.android.circleforimage;

import com.android.circleforimageutils.Words;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends FragmentActivity {

 private ViewPager viewPager;
 private MyPagerAdapter mAdapter;
 private Circle circle;

 private Activity activity = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 initActivity();
 setContentView(R.layout.activity_main);

 activity = this;
 showForSecondActivity();

 viewPager = (ViewPager) findViewById(R.id.viewPager);
 circle = (Circle) findViewById(R.id.circle);

 scrollPager();

 mAdapter = new MyPagerAdapter(getSupportFragmentManager());
 /* 调用 MyPagerAdapter 的方法*/
 mAdapter.setForActivity(activity);

 viewPager.setAdapter(mAdapter);
 }

 /**
 * 对界面的处理
 */
 private void initActivity() {
 // 去标题
 requestWindowFeature(Window.FEATURE_NO_TITLE);
 // 全屏
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 WindowManager.LayoutParams.FLAG_FULLSCREEN);
 }

 /**
 * 第一次安装启动时,会加载开始的页面,第二次启动时,会跳过加载页面
 */
 private void showForSecondActivity() {
 // PreferenceManager:Used to help create Preference hierarchies from activities or XML.
 SharedPreferences mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
 SharedPreferences.Editor editor = mSharedPreferences.edit();

 boolean b = mSharedPreferences.getBoolean(Words.KEY_ONE, true);
 if (b) {
 editor.putBoolean(Words.KEY_ONE, false);
 editor.commit();
 } else {
 Intent intent = new Intent(this, SecondActivity.class);
 startActivity(intent);
 finish();
 }
 }

 /**
 * viewPager 滚动时,提示 Circle 类重绘
 */
 private void scrollPager() {
 viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
 @Override
 public void onPageSelected(int position) {
 super.onPageSelected(position);

 circle.choose(position);
 }
 });
 }

}

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

Words.java :

package com.android.circleforimageutils;

public class Words {
 public static String KEY_ONE = "key_for_main";
}

SecondActivity.java :

package com.android.circleforimage;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;

public class SecondActivity extends Activity{

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);

 TextView textView = new TextView(this);
 textView.setText("欢迎来到我的博客:\n http://blog.csdn.net/antimage08");
 textView.setTextSize(25);
 textView.setTextColor(Color.BLUE);
 textView.setGravity(Gravity.CENTER);

 setContentView(textView);
 }
}

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.android.circleforimage.MainActivity" >

 <android.support.v4.view.ViewPager
  android:id="@+id/viewPager"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />

 <com.android.circleforimage.Circle
  android:id="@+id/circle"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>
</FrameLayout>

item_one.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

 <ImageView
  android:id="@+id/imageView"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  /> 

</LinearLayout>

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

<?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" >

 <ImageView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:src="@drawable/x05"/>

 <Button
  android:id="@+id/button"
  android:layout_alignParentBottom="true"
  android:layout_alignParentRight="true"
  android:text="点击进入"
  android:textSize="20sp"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>

</RelativeLayout>

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

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

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

(0)

相关推荐

  • Android实现Banner界面广告图片循环轮播(包括实现手动滑动循环)

    前言:经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环.本以为单纯的ViewPager就可以实现这些功能.但是蛋疼的事情来了,ViewPager并不支持循环翻页.所以要实现循环还得需要自己去动手.自己在网上也找了些例子,本博文的Demo是结合自己找到的一些相关例子的基础上去改造,也希望对读者有用. Demo实现的效果图如下: Demo代码: 工程目录如下图: 废话不多说,上代码. 1.主Activity代码如下: package com.stevenhu.and

  • Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

    最近参与了开发一款旅行APP,其中包含实时聊天和动态评论功能,终于耗时几个月几个伙伴完成了,今天就小结一下至于实时聊天功能如果用户不多的情况可以scoket实现,如果用户万级就可以采用开源的smack + opnefile实现,也可以用mina开源+XMMP,至于怎么搭建和实现,估计目前github上一搜一大把,至于即时通讯怕误人子弟,暂且不做介绍,现就把实现的一个微信朋友圈的小功能介绍一下. 先上效果图: 一拿到主流的UI需求,大致分析下,需要我ListView嵌套Gridview,而grid

  • Android开发之使用ViewPager实现图片左右滑动切换效果

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android 利用ViewPager实现图片可以左右循环滑动效果附代码下载

    首先给大家展示靓照,对效果图感兴趣的朋友可以继续往下阅读哦. ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,上面是效果图,用美女图片是我一贯的作风,呵呵  1.    首先看一些layout下的xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width=&qu

  • Android 使用ViewPager实现图片左右循环滑动自动播放

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1. 首先看一些layout下的xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_

  • Android实现图片自动轮播并且支持手势左右无限滑动

    废话不多说了,先给大家上左右无限滑动的代码了. 1.左右无限滑动 public class MainActivity extends AppCompatActivity { private static ViewPager viewPager; private RadioGroup group; //图片资源,实际项目需要从网络获取 private int[] imageIds = {R.drawable.ym1, R.drawable.ym2, R.drawable.ym3, R.drawab

  • Android中RecyclerView 滑动时图片加载的优化

    RecyclerView 滑动时的优化处理,在滑动时停止加载图片,在滑动停止时开始加载图片,这里用了Glide.pause 和Glide.resume.这里为了避免重复设置增加开销,设置了一个标志变量来做判断. mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, in

  • 解决Android快速滑动时图片一闪一闪问题

    快速滑动图片一闪一闪的问题,图片加载等处理在这里不介绍,主要就是介绍下在Adapter中维护一个LinkedHashMap解决上述问题 package com.longraise.seller.adapter; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.view.LayoutInfla

  • Android手势滑动实现ImageView缩放图片大小

    本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下 方法一: 将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener. 例如:imageView.setOnTouchListener(new MulitPointTouchListener ()); 在xml中要将ImageView的缩放格式改成Matrix 例如:android:scaleType="matrix&q

  • Android实现手势滑动多点触摸放大缩小图片效果

    网上文章虽多,但是这种效果少之又少,我真诚的献上以供大家参考 实现原理:自定义ImageView对此控件进行相应的layout(动态布局). 这里你要明白几个方法执行的流程: 首先ImageView是继承自View的子类. onLayout方法:是一个回调方法.该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新

随机推荐