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

发布时间:2020-10-02 05:55:29

来源:脚本之家

阅读:69

作者:antimage08

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

现在也是利用 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):

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:id="@+id/viewPager"

android:layout_width="match_parent"

android:layout_height="match_parent" />

android:id="@+id/circle"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

item_one.xml :

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/imageView"

android:layout_width="match_parent"

android:layout_height="match_parent"

/>

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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="match_parent"

android:layout_height="match_parent"

android:src="@drawable/x05"/>

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

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

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

android圆球触摸怎么实现,Android利用ViewPager实现带小圆球的图片滑动相关推荐

  1. TF之CNN:利用sklearn(自带手写数字图片识别数据集)使用dropout解决学习中overfitting的问题+Tensorboard显示变化曲线

    TF之CNN:利用sklearn(自带手写数字图片识别数据集)使用dropout解决学习中overfitting的问题+Tensorboard显示变化曲线 目录 输出结果 设计代码 输出结果 设计代码 ...

  2. android关闭触摸提示音,Android取消和开启View或则ViewGroup点击带有提示音

    前言 如果系统设置[声音]选项中关闭了[触摸提示音],则所有的View都没有提示音. 开启系统设置[触摸提示音]基础上,View或ViewGroup设置setOnTouchListener()或者se ...

  3. python add picture显示过大_利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例...

    前言 最近的一个项目中需要在图片上添加文字,使用了OpenCV,结果发现利用opencv给图像添加文字有局限.可利用的字体类型比较少,需要安装Freetype扩展,比较复杂.而且不能用putText函 ...

  4. Android屏幕触摸监听,Android在Fragment中实现监听触摸事件

    本文给大家介绍的是监听Fragment的触摸事件实现.如果大家有更好的机制,可以留言交流,下面来看看详细的介绍: 大家都知道,我们的activity中有onTouchEvent方法,可以用来实现触摸事 ...

  5. android做题imageview缩放,巧用ViewPager实现驾考宝典做题翻页效果

    效果如下所示: 思路: a.利用ViewPager自带的动画效果,略作修改,实现滑动覆盖翻页效果. b.移动时加入阴影效果. 1.关键代码如下所示: public class ReaderViewPa ...

  6. Android 仿美团网,探索使用ViewPager+GridView实现左右滑动查看更多分类的功能

    不记得什么时候,我留意到到美团网首页有使用ViewPager+GridView实现左右滑动查看更多分类的一个功能,感觉它很有趣,于是想着自己动手也实现这样一个功能,和往常一样,主要是想总结一下我在学习 ...

  7. ViewPager动态添加、删除Fragment,且提供红色小圆球指示当前位置

    简单的说,代码要实现的是类似于现在通用新闻客户端头部的新闻图片展示.现在的新闻客户端顶部一般放有图片展示区,假设有5张图片,用户可以左右侧滑翻阅,同时提供一行5个红色小圆球(红色小圆球的个数等于图片数 ...

  8. Android利用ViewPager实现滑动广告板

    •android-support-v4.jar,这是谷歌官方给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其中 ...

  9. android触摸进度条,Android仿IOS ViewPager滑动进度条

    最近做项目,碰到如下的需求:ViewPager分页,如果是6页(包括6页)就用圆点,如果是6页以上就用进度条来切换.前面一种交互方法最常见,用小圆点来表示当前选中的页面,这些小圆点称为导航点,很多Ap ...

最新文章

  1. thinkphp_ajax分页实现_无需整理
  2. 怎么样才能更高效的学习区块链
  3. Redis中struct运用
  4. html5中的web storage的用法
  5. ThinkPHP如何URL如何去掉index.php(重写模式)
  6. TensorFlow by Google CNN分类真实图片 Machine Learning Foundations: Ep #5 - Classifying real-world images
  7. java1.6安装_JAVAjdk1.6安装方法
  8. 什么软件画er图方便_er图绘制工具|er图绘制工具(powerdesigner) v16.5 免费版 - 软件下载 - 绿茶软件园|33LC.com...
  9. 使用postman发送post请求,header设置问题
  10. java学习之Swing篇(一)——QQ登录界面
  11. 百度地图Web API Python模块
  12. 高考数学复习-立体几何知识点总结及复习资料
  13. linux软raid阅读笔记,linux_软RAID阅读笔记.pdf
  14. 激人奋进的七个经典故事
  15. 今天烧了3个菜之一,炖豆腐
  16. 别了,指纹打卡!今后考勤可以刷脸了
  17. MHz 和 Mbps的区别
  18. 别人的六一兴高彩烈,我的六一苦逼的敲代码采集壁纸~
  19. 第十六届全国大学生智能车竞赛浙江赛区选拔赛成绩汇总
  20. CPU虚拟化的三种技术

热门文章

  1. MINIO双机实时备份
  2. python安装错80072ee2_更新80072EE2错误怎么办_win7报80072ee2原因是什么
  3. 黑马程序员 — 网络编程
  4. 安装双系统(优启通)+(Dism++64)
  5. javaweb实现简单注册登录功能——(注册)
  6. 水晶报表:CR2020和CR4E
  7. springboot(07)邮件发送(qq邮箱)
  8. Qt布局管理器之表单布局(QFormLayout)
  9. 【转】终身受用的4个经典故事
  10. javascript实现鼠标经过显示隐藏内容