Android项目实战(三):实现第一次进入软件的引导页
最近做的APP接近尾声了,就是些优化工作了,
我们都知道现在的APP都会有引导页,就是安装之后第一次打开才显示的引导页面(介绍这个软件的几张可以切换的图)
自己做了一下,结合之前学过的
思路很简单,APP的主界面还是作为主Activity,只要新添加一个类来判断是不是第一次打开APP
设主activity 名字为:MainActivity.java 判断是不是第一次打开APP且实现引导页面的类 LoginActivity ,另外还需要一个类 这是安卓开发_慕课网_ViewPager切换动画(3.0版本以上有效果)中用到的 ZoomOutPageTransformer.java
1.在主activity中,在一开始 先跳转到LoginActivity类中
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
startActivity(new Intent(MainActivity.this, LoginActivity.class)); //跳转到LoginActivity类中
//初始化
init();
initEvent();
//默认显示第一个功能的界面(微信界面)
setSelect();
}
2.在LoginActivity类中判断是不是第一次打开,如果是,则显示ViewPager切换动画效果
如果不是,则执行finish();语句,直接结束这个Activity 自然的就回到了主Activity中了
LoginActivity代码
package com.example.qunxiong; import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType; public class LoginActivity extends Activity {
private ViewPager mviewpager; //控件
private int[] mImgIds = new int[]{R.drawable.bg_rank_shenqi_0,R.drawable.bg_rank_shenqi_1,R.drawable.bg_rank_shenqi_10};//初始化图片
private List<ImageView> mImages = new ArrayList<ImageView>();
private Button jump;
private SharedPreferences preferences;
private Editor editor;
private OutputStream os;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
preferences = getSharedPreferences("phone", Context.MODE_PRIVATE);
jump = (Button) findViewById(R.id.jump);
jump.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
//判断是不是首次登录,
if (preferences.getBoolean("firststart", true)) {
editor = preferences.edit();
//将登录标志位设置为false,下次登录时不在显示首次登录界面
editor.putBoolean("firststart", false);
editor.commit();
mviewpager = (ViewPager) findViewById(R.id.id_viewpager);
//为ViewPage切换添加动画效果(3.0以上版本才可以有效果)
mviewpager.setPageTransformer(true, new ZoomOutPageTransformer()); mviewpager.setAdapter(new PagerAdapter() { @Override
public Object instantiateItem(View container, int position) {
ImageView imageview = new ImageView(LoginActivity.this);
imageview.setImageResource(mImgIds[position]);
imageview.setScaleType(ScaleType.CENTER_CROP); //设置图片不变形
((ViewGroup) container).addView(imageview);
mImages.add(imageview);
return imageview;
};
@Override
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub ((ViewPager) container).removeView(mImages.get(position));
}
public boolean isViewFromObject(View view, Object object) {
// TODO Auto-generated method stub
return view == object;
} @Override
public int getCount() { //返回图片个数
// TODO Auto-generated method stub
return mImgIds.length;
}
});
}
else
{
finish();
} }
}
切换动画效果代码
ZoomOutPageTransformer.java
package com.example.qunxiong; import android.annotation.SuppressLint;
import android.support.v4.view.ViewPager;
import android.view.View; public class ZoomOutPageTransformer implements ViewPager.PageTransformer {
private static final float MIN_SCALE = 0.85f;
private static final float MIN_ALPHA = 0.5f; @SuppressLint("NewApi") public void transformPage(View view, float position) {
int pageWidth = view.getWidth();
int pageHeight = view.getHeight(); if (position < -) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(); } else if (position <= ) { // [-1,1]
// Modify the default slide transition to shrink the page as well
float scaleFactor = Math.max(MIN_SCALE, - Math.abs(position));
float vertMargin = pageHeight * ( - scaleFactor) / ;
float horzMargin = pageWidth * ( - scaleFactor) / ;
if (position < ) {
view.setTranslationX(horzMargin - vertMargin / );
} else {
view.setTranslationX(-horzMargin + vertMargin / );
} // Scale the page down (between MIN_SCALE and 1)
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor); // Fade the page relative to its size.
view.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
( - MIN_SCALE) * ( - MIN_ALPHA)); } else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha();
}
}
}
Android项目实战(三):实现第一次进入软件的引导页的更多相关文章
- Android项目实战(四十二):启动页优化,去除短暂白屏或黑屏
大家会发现一个空项目,从手机桌面打开app是秒启动.但是对于自己开发的项目,有时会发现打开app的时候,会有短暂的1秒--2秒的白屏或者黑屏,然后才进入到程序界面. 个人理解为我们自己实现的Appli ...
- (转载)Android项目实战(三十二):圆角对话框Dialog
Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...
- Android项目实战(三十二):圆角对话框Dialog
前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话框的"确定"按钮 难点:1.对话框边框圆角 ...
- Android项目实战(二十九):酒店预定日期选择
先看需求效果图: 几个需求点: 1.显示当月以及下个月的日历 (可自行拓展更多月份) 2.首次点击选择"开始日期",再次点击选择"结束日期" (1).如果&qu ...
- Android项目实战(一): SpannableString与SpannableStringBuilder
原文:Android项目实战(一): SpannableString与SpannableStringBuilder 前言: 曾经在一些APP中的一些类似“帮助”“关于”的界面看过一行文字显示不同的颜色 ...
- Android项目实战(四十九):Andoird 7.0+相机适配
解决方案类似: Android项目实战(四十):Andoird 7.0+ 安装APK适配 解决方法: 一.在AndroidManifest.xml 文件中添加 四大组件之一的 <provider ...
- (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结
Android项目实战(二十七):数据交互(信息编辑)填写总结 前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: ...
- (转载)Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow
Android项目实战(十七):QQ空间实现(二)—— 分享功能 / 弹出PopupWindow 这是一张QQ空间说说详情的截图. 分析: 1.点击右上角三个点的图标,在界面底部弹出一个区域,这个 ...
- Android项目实战--手机卫士开发系列教程
<ignore_js_op> banner131010.jpg (71.4 KB, 下载次数: 0) 下载附件 保存到相册 2 分钟前 上传 Android项目实战--手机卫士01- ...
随机推荐
- SuperSocket 1.6.4 通过FixedHeaderReceiveFilter解析自定义协议
SuperSocket 提供了一些通用的协议解析工具, 你可以用他们简单而且快速的实现你自己的通信协议: TerminatorReceiveFilter (SuperSocket.SocketBase ...
- Lua面向对象设计
首先对于Lua语言,它没有打算被用来进行大型的程序设计,相反,Lua目标定于小型到中型的程序设计,通常是作为大型系统的一部分,所以它只提供了一套精简的元素,很多高级语言的概念都没有.这样Lua就成为了 ...
- WCF安全1-开篇
概述: WCF安全简介 1.在企业级应用中什么是“安全” 答: (1)应用能够识别用户的身份-认证Authentication (2)应用能够将用户的操作和可访问的资源限制在其允许的权限范围之内-授权 ...
- php -- 获取当月天数及当月第一天及最后一天、上月第一天及最后一天(备忘)
Learn From :http://www.jxbh.cn/newshow.asp?id=1635&tag=2 //1.获取上个月第一天及最后一天. date('Y-m-01', strto ...
- linux下如何修改weblogic console登陆的用户名和密码
1. 执行安装目录下config.sh ./config.sh 2.选择 2|Extend an existing WebLogic configuration 3. 别的一路跳过,到修改secur ...
- HTML5 LocalStorage 本地存储的用法
本地存储变量b的值: localStorage.setItem("b","isaac"); 本地获取变量b的值: localStorage.getItem(&q ...
- Django--models一对多实例
需求 models一对多表的构建,创建数据,查询数据,数据前端展示等. 速查 1.创建数据 1 2 all_data = obj.clean() #{'username': u'user1', ' ...
- C++中的静态绑定和动态绑定
C++在面向对象编程中,存在着静态绑定和动态绑定的定义,本节即是主要讲述这两点区分.我是在一个类的继承体系中分析的,因此下面所说的对象一般就是指一个类的实例.首先我们需要明确几个名词定义: 静态类型: ...
- fpmmm(mpm)监控mysql模块安装
zabbix mpm监控mysql是一个蛮不错的监控模块,不过最近官网已经不叫mpm了,而是叫fpmmm,理由为: fpmmm is the successor of mpm. mpm was ren ...
- AutoMapper配置方法
在Mvc开发中,我们经常需要构建一个viewModel出来供页面使用,在PO和VO之间相互传值的时候,如果实体字段比较多的时候,那么传值将变得异常麻烦,也使得代码非常的臃肿.AutoMapper可以帮 ...