ViewPager实现引导界面以及进入下一个activity解决办法

简介:



这次项目中实现了用户引导滑动图片,到最后一张图片的时候,我认为理想的是同时具备以下两点:

1)用户可以点击上面的“开始使用”这样的按钮可以进入主界面;

2)用户接着滑动下一个图片的手势而进入主界面;

3)用户在引导界面点击返回键的时候直接进入主界面;


增加“开始使用”按钮方式:

可以定义一个layout的xml再加载:一个LinearLayout,里面一个button。默认button是“gone”,

xml如下:

 

 

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/guide_item"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="vertical" >      <TextView         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_weight="5" />      <Button         android:id="@+id/start"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="@string/guide_start"         android:visibility="gone" >     </Button>      <TextView         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:layout_weight="1" />  </LinearLayout>

 

button上下增加了textview,我是为了控制button在整个界面的位置。

引导的图片是其背景即可。

实现如下:

guide_activity.xml

 

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent" >      <android.support.v4.view.ViewPager         android:id="@+id/guide_view"         android:layout_width="fill_parent"         android:layout_height="fill_parent" />  </LinearLayout>

GuideActivity.java:

/**  * 引导界面  * @author maria  * 2012-07-19  */ package com.maria.test;  import java.util.ArrayList; import java.util.List; import com.trunkbow.talker.R; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout;  public class GuideActivity extends Activity { 	private ViewPager viewPager; 	private List<View> mImageViews; // 滑动的图片集合 	private int[] imageResId; // 图片ID 	private int currentItem = 0; // 当前图片的索引号 	private GestureDetector gestureDetector; // 用户滑动 	/** 记录当前分页ID */ 	private int flaggingWidth;// 互动翻页所需滚动的长度是当前屏幕宽度的1/3  	@Override 	public void onCreate(Bundle savedInstanceState) { 		super.onCreate(savedInstanceState); 		setContentView(R.layout.guide_activity); 		gestureDetector = new GestureDetector(new GuideViewTouch());  		// 获取分辨率 		DisplayMetrics dm = new DisplayMetrics(); 		getWindowManager().getDefaultDisplay().getMetrics(dm); 		flaggingWidth = dm.widthPixels / 3;  		imageResId = new int[] { R.drawable.guide_1, R.drawable.guide_2 };  		mImageViews = new ArrayList<View>();  		// 初始化图片资源 		LayoutInflater viewInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 		// 0 		View convertView0 = viewInflater.inflate(R.layout.guide_item, null); 		LinearLayout linearLayout0 = (LinearLayout) convertView0 				.findViewById(R.id.guide_item); 		linearLayout0.setBackgroundResource(imageResId[0]); 		mImageViews.add(linearLayout0); 		// 1 		View convertView1 = viewInflater.inflate(R.layout.guide_item, null); 		LinearLayout linearLayout1 = (LinearLayout) convertView1 				.findViewById(R.id.guide_item); 		linearLayout1.setBackgroundResource(imageResId[1]); 		Button btn = (Button) convertView1.findViewById(R.id.start); 		btn.setVisibility(View.VISIBLE); 		btn.setOnClickListener(new OnClickListener() {  			public void onClick(View v) { 				// TODO Auto-generated method stub 				GoToMainActivity(); 			} 		}); 		mImageViews.add(linearLayout1);  		viewPager = (ViewPager) findViewById(R.id.guide_view); 		viewPager.setAdapter(new MyAdapter());// 设置填充ViewPager页面的适配器 		// 设置一个监听器,当ViewPager中的页面改变时调用 		viewPager.setOnPageChangeListener(new MyPageChangeListener()); 	}  	@Override 	public boolean dispatchTouchEvent(MotionEvent event) { 		if (gestureDetector.onTouchEvent(event)) { 			event.setAction(MotionEvent.ACTION_CANCEL); 		} 		return super.dispatchTouchEvent(event); 	}  	private class GuideViewTouch extends SimpleOnGestureListener { 		@Override 		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 				float velocityY) { 			if (currentItem == 1) { 				if (Math.abs(e1.getX() - e2.getX()) > Math.abs(e1.getY() 						- e2.getY()) 						&& (e1.getX() - e2.getX() <= (-flaggingWidth) || e1 								.getX() - e2.getX() >= flaggingWidth)) { 					if (e1.getX() - e2.getX() >= flaggingWidth) { 						GoToMainActivity(); 						return true; 					} 				} 			} 			return false; 		} 	}  	/** 	 * 进入主界面 	 */ 	void GoToMainActivity() { 		Intent i = new Intent(GuideActivity.this, MainActivivty.class); 		startActivity(i); 		finish(); 	}  	/** 	 * 当ViewPager中页面的状态发生改变时调用 	 *  	 * @author Administrator 	 *  	 */ 	private class MyPageChangeListener implements OnPageChangeListener {  		/** 		 * This method will be invoked when a new page becomes selected. 		 * position: Position index of the new selected page. 		 */ 		public void onPageSelected(int position) { 			currentItem = position; 		}  		public void onPageScrollStateChanged(int arg0) { 		}  		public void onPageScrolled(int arg0, float arg1, int arg2) { 		} 	}  	/** 	 * 填充ViewPager页面的适配器 	 *  	 * @author Administrator 	 *  	 */ 	private class MyAdapter extends PagerAdapter {  		@Override 		public int getCount() { 			return imageResId.length; 		}  		@Override 		public Object instantiateItem(View arg0, int arg1) { 			((ViewPager) arg0).addView(mImageViews.get(arg1)); 			return mImageViews.get(arg1); 		}  		@Override 		public void destroyItem(View arg0, int arg1, Object arg2) { 			((ViewPager) arg0).removeView((View) arg2); 		}  		@Override 		public boolean isViewFromObject(View arg0, Object arg1) { 			return arg0 == arg1; 		}  		@Override 		public void restoreState(Parcelable arg0, ClassLoader arg1) {  		}  		@Override 		public Parcelable saveState() { 			return null; 		}  		@Override 		public void startUpdate(View arg0) {  		}  		@Override 		public void finishUpdate(View arg0) {  		} 	}  	@Override 	public boolean onKeyDown(int keyCode, KeyEvent event) { 		// TODO Auto-generated method stub 		if (keyCode == KeyEvent.KEYCODE_BACK) { 			GoToMainActivity(); 			return false; 		} 		return super.onKeyDown(keyCode, event); 	}  }


     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230805,如需转载请自行联系原作者


相关文章
|
12月前
|
测试技术 UED
软件测试中的“灰盒”方法:一种平衡透明度与效率的策略
在软件开发的复杂世界中,确保产品质量和用户体验至关重要。本文将探讨一种被称为“灰盒测试”的方法,它结合了白盒和黑盒测试的优点,旨在提高测试效率同时保持一定程度的透明度。我们将通过具体案例分析,展示灰盒测试如何在实际工作中发挥作用,并讨论其对现代软件开发流程的影响。
|
Web App开发 前端开发 JavaScript
WebKit 入门介绍
WebKit 入门介绍
|
6月前
|
前端开发 JavaScript UED
《异步编程救星!Promise的超详细入门指南》
Promise是JavaScript中用于处理异步操作的对象,能有效解决传统回调函数带来的“回调地狱”问题。它有三种状态:等待态(pending)、成功态(fulfilled)和失败态(rejected),状态一旦确定不可改变。通过`resolve`和`reject`分别表示异步操作的成功与失败,使用`then`方法处理结果,`catch`捕获错误。此外,Promise提供静态方法如`Promise.all`、`Promise.race`等,方便处理多个异步任务。Promise让异步编程更优雅高效,提升代码可读性和维护性。
162 2
《异步编程救星!Promise的超详细入门指南》
|
7月前
|
算法
技术人对抗焦虑的加减法(三)
破局的关键能力在于心力、脑力与体力的协同发展。心力指自我反省、驱动与思考的能力,帮助我们在挫折中保持进取;脑力是逻辑与体系化思考的结合,形成专业能力;体力则是行动与执行力,将思考转化为成果。三者相辅相成,助力个人在复杂项目中成长,实现突破。
59 5
|
自然语言处理 开发者
通义千问继续开源!阿里云38篇论文被顶会ACL 2024录用
通义千问继续开源!阿里云38篇论文被顶会ACL 2024录用
655 8
QML (控件位置布局)之(Anchors)锚布局
QML (控件位置布局)之(Anchors)锚布局
562 2
|
JavaScript 前端开发
vue动画——旋转动画(悬浮触发、点击触发)
vue动画——旋转动画(悬浮触发、点击触发)
467 1
|
存储 消息中间件 NoSQL
两万字长文让你彻底掌握 celery
两万字长文让你彻底掌握 celery
4948 2
|
Web App开发 iOS开发 MacOS
解决macOS 应用安装在下载目录时遇到的 vscode 掉登录和应用无法随机启动的问题
解决macOS 应用安装在下载目录时遇到的 vscode 掉登录和应用无法随机启动的问题
339 0
|
C# 数据安全/隐私保护
C# 窗体之间参数互相传递的两种方法与使用
C# 窗体之间参数互相传递的两种方法与使用