在android画面切换时设置跟随变动的小圆圈
首先还是老规律,上传两张效果图:
第一张图:     第二张图:   
前言:我们经常在使用各类安卓APP的时候发现会有如图所示的小圆圈显示当前页所在的,甚至一般来说我们的android桌面上也应该有类似的提示位置的控件。刚开始还以为这是一种控件,于是去查SDK文档,找了好一会都没有找到。于是在午休的时候想了想,终于想通了,这东西其实我们完全可以自己去做的,而且原理是相当的简单的。
好了,废话不多说,我们就来做一个。
首先这样的程序涉及到页面的切换,那么我们就先建立一个ViewFlipper来存放每一个View视图。。
其次我说想通了,想通的就是这个小圆圈控件我们完全可以自己去做一个,而且原理很简单,简单到一个LinearLayout就能实现。
我们主要布局结构为:
<RelativeLayout>
<ViewFlipper></ViewFlipper>//这里显示的就是切换的图
<LinearLayout></LinearLayout>//这里显示的小圆圈之间的切换
<RelativeLayout>
代码如下,这里使用的是纯代码布局,不需要用到xml文件。
public class MyViewFlipper extends RelativeLayout implements OnTouchListener,OnGestureListener{
	private ViewFlipper viewflipper;
	private LogView logView;
	private Context parentContext;
	TextView textView;
	TextView[] textViews;
	RFIDDAQ rfiddaq;
	final static int viewflipperid=100;
	GestureDetector detector;//创建手势监听的对象
	/**
	 * 再次匹配的时间间隔 单位 秒
	 */
	private int time;
	private String address;
	private int maxshownum;//显示的最大数量,超过这个数量会刷新掉之前的数据。
	public MyViewFlipper(Context context) {
		super(context);
		this.parentContext=context;
		 detector=new GestureDetector(this);
		 init();
	}
	private void init() {
		// TODO Auto-generated method stub
		// 创建滚动显示框对象
		viewflipper = new ViewFlipper(parentContext);
		viewflipper.setBackgroundColor(Color.CYAN);
		viewflipper.setId(viewflipperid);
		LayoutParams lpviewflipper = new LayoutParams(-1, 500);
		// 创建信息采集框对象,放入viewflipper中作为元素之一
		//这里的rfiddaq以及下面的都可以logView都可以替换成自定义的View视图。当然也可以添加新的自定义试图,只需要添加到viewflipper中就可以了。
		rfiddaq = new RFIDDAQ();
		lpviewflipper.addRule(RelativeLayout.ALIGN_PARENT_TOP);
		viewflipper.addView(rfiddaq);
		// 创建logView显示界面,放入viewflipper中作为元素之一
		logView = new LogView(parentContext);
		viewflipper.addView(logView);
		// 这里添加的LinearLayout是包含小圆点的集合
		LinearLayout viewGroup = new LinearLayout(parentContext);
		ViewGroup group = (ViewGroup) viewGroup;
		textViews = new TextView[viewflipper.getChildCount()];
		for (int i = 0; i < viewflipper.getChildCount(); i++) {
			textView = new TextView(parentContext);
			textView.setLayoutParams(new LayoutParams(30, 30));
			textView.setPadding(0, 0, 2, 0);
			textViews[i] = textView;
			if (i == 0) {
				// 默认进入程序后第一张图片被选中,因为viewflipper默认就是选中第一个视图
				textViews[i].setBackgroundResource(R.drawable.radio_sel);
			} else {
				textViews[i].setBackgroundResource(R.drawable.radio);
			}
			group.addView(textViews[i]);
		}
		// 设置小圆圈的位置
		LayoutParams lpgroup = new LayoutParams(-2, -2);
		lpgroup.addRule(RelativeLayout.BELOW, viewflipperid);
		lpgroup.addRule(RelativeLayout.CENTER_HORIZONTAL);
		// 把viewflipper和显示小圆圈框的viewGroup放入RelativeLayout中
		addView(viewflipper, lpviewflipper);
		addView(viewGroup, lpgroup);
		viewflipper.setOnTouchListener(this);//添加动作监听
		viewflipper.setLongClickable(true);//这一句必须添加,否则手势监听无法触发
	}
	public RFIDDAQ getRfiddaq() {
		return rfiddaq;
	}
	public void setRfiddaq(RFIDDAQ rfiddaq) {
		this.rfiddaq = rfiddaq;
	}
	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		if(e2.getX()-e1.getX()>0){
//如果滑动到最后 则停止切换
if(viewflipper.getDisplayedChild() == 0){
viewflipper.stopFlipping();
}else{
/**
* 这里其实可以添加一些动画效果。
* 如:viewflipper.setInAnimation(parentContext,R.anim.push_right_in);
*/
viewflipper.showNext();
showRound(viewflipper.getDisplayedChild());
}
}else if(e2.getX()-e1.getX()<0){
//如果滑动到最后 则停止切换
if(viewflipper.getDisplayedChild() == 1){
viewflipper.stopFlipping();
}else{
viewflipper.showNext();
showRound(viewflipper.getDisplayedChild());
}
}else{ } return false;
} @Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub } @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
} @Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub } @Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
} @Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
detector.onTouchEvent(event);
return false;
} public void showRound(int position){
for(int i=0;i<textViews.length;i++){
if(i==position){
textViews[i].setBackgroundResource(R.drawable.radio_sel);
}else{
textViews[i].setBackgroundResource(R.drawable.radio);
}
}
} }
在android画面切换时设置跟随变动的小圆圈的更多相关文章
- 解决Android Activity切换时出现白屏问题
		有些性能低的机器,在切换activity时候出现白屏一段时候后才显示正确的视图 高性能的机器可能太快看不到,但是事实是存在的, 特别是当你新开一个进程的时候,A进程的activity跳转到B进程的Ac ... 
- Android 如何去掉手机中横竖屏切换时的转屏动画?
		前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ... 
- [android] Activity 的生命周期 以及横屏竖屏切换时 Activity 的状态变化
		生命周期Android 系统在Activity 生命周期中加入一些钩子,我们可以在这些系统预留的钩子中做一些事情.例举了 7 个常用的钩子:protected void onCreate(Bundle ... 
- 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法
		重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码, 于是就会用到Surfa ... 
- 如何在android studio 1.0 启动时设置代理【解决WARN - ateSettings.impl.UpdateChecker - Connection failed.】
		今天第一次用android studio,下了个比较新的1.0.1 linux版本,结果启动时老是出现以下错误: [ 6987] WARN - ateSettings.impl.UpdateCheck ... 
- 设置Android Studio启动时可选最近打开过的工程
		Android Studio启动时,默认会打开最近关闭的工程. 如果想Android Studio在启动时,打开欢迎界面(Welcome to Android Studio界面),则可以通过设置Set ... 
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
		最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ... 
- Android使得Fragment 切换时不重新实例化
		以前实现Fragment的切换都是用replace方法实现 public void startFragmentAdd(Fragment fragment) { FragmentManager frag ... 
- android横屏布局文件设置
		一.AndroidManifest.xml配置 1.在AndroidManifest.xml的activity(需要禁止转向的activity)配置中加入 android:screenOrient ... 
随机推荐
- Ubuntu14.04LST 安装Oracle SQL Developer 4.0.2
			1:Oracle SQL Developer 4.0.2下载链接: http://www.oracle.com/technetwork/developer-tools/sql-developer/do ... 
- Silverlight 结合ArcGis 在地图上画线
			原文 http://www.dotblogs.com.tw/justforgood/archive/2012/05/10/72085.aspx 先来看看完成后的画面,我从桃园画到高雄,再由高雄画到香港 ... 
- Struts2安装与简单部署实例
			打开http://struts.apache.org/网站,下载strut2 版本选择: Full Distribution: Struts2完整版 建议下载该项(此版包括以下4项): Example ... 
- pragma pack(非常有用的字节对齐用法说明)
			强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ... 
- IOS 网络判断
			Reachability *connectionNetWork= [Reachability reachabilityForInternetConnection] ; int status = [co ... 
- MediaPlayer本地播放流程解析(一)
			应用场景: MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setOnCompletionListener(new OnComplet ... 
- Mock.js:前后端分离开发工具
			概述 Mock.js实现的功能 基于 数据模板 生成数据 基于 HTML模板 生成数据 拦截并模拟 Ajax请求 用法 浏览器: <!-- (必选)加载 Mock --> <scri ... 
- QT笔记(1)--QT编程环境搭建
			一.QT简介 Qt 是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特殊 ... 
- gcc和arm-linux-gcc区别
			安装arm-linux-gcc的时候,查了不少资料,总算环境搭好了.于是,想写个程序员的经典程序---hello world. 语法都没错,生成test.c. 命令行运行:arm-linux-gcc ... 
- windows下启动/关闭Sybase数据库服务器
			启动.关闭Sybase数据库服务器 一.启动Sybase服务器 在windows下介绍两种方法启动Sybase数据库服务器. 1.通过服务器管理器 依次打开控制面板>管理工具>服务 管理窗 ... 
